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

Artifact 21ba8e1f8b9bc035053941d4f8df3ca5376be5e63ff62f945c2bc4f9b8890362:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
0fd0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29  3ExprNNCollSeq()
0fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
0ff0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1000: 29 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65  ) works the same
1010: 20 65 78 61 63 74 20 74 68 61 74 20 69 74 20 72   exact that it r
1020: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65  eturns the.** de
1030: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1040: 69 66 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20  if pExpr has no 
1050: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
1060: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  n..**.** The col
1070: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1080: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
1090: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
10a0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
10b0: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
10c0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
10d0: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
10f0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
1100: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
1110: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
1120: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
1130: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
1140: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
1150: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1160: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1170: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1180: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1190: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
11b0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
11c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
11d0: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
11e0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
11f0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >op;.    if( p->
1200: 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72  flags & EP_Gener
1210: 69 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ic ) break;.    
1220: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
1230: 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  || op==TK_UPLUS 
1240: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  ){.      p = p->
1250: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f 6e  pLeft;.      con
1260: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1270: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   if( op==TK_COLL
1280: 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52  ATE || (op==TK_R
1290: 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 6f 70  EGISTER && p->op
12a0: 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 29 20 29  2==TK_COLLATE) )
12b0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
12c0: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
12d0: 71 28 70 50 61 72 73 65 2c 20 45 4e 43 28 64 62  q(pParse, ENC(db
12e0: 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  ), 0, p->u.zToke
12f0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1310: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1320: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1330: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  MN.          || 
1340: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
1350: 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45  || op==TK_TRIGGE
1360: 52 29 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 54  R).     && p->pT
1370: 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ab!=0.    ){.   
1380: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
1390: 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62  ISTER && p->pTab
13a0: 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e  !=0 happens when
13b0: 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69   pExpr was origi
13c0: 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61  nally.      ** a
13d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77   TK_COLUMN but w
13e0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76  as previously ev
13f0: 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68  aluated and cach
1400: 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
1410: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 20   */.      int j 
1420: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
1430: 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a      if( j>=0 ){.
1440: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1450: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70  ar *zColl = p->p
1460: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
1470: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  ll;.        pCol
1480: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
1490: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
14a0: 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20  b), zColl, 0);. 
14b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14d0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
14e0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
14f0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26   if( p->pLeft &&
1500: 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67   (p->pLeft->flag
1510: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
1520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20  =0 ){.        p 
1530: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
1540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1550: 20 45 78 70 72 20 2a 70 4e 65 78 74 20 20 3d 20   Expr *pNext  = 
1560: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1570: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
1580: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
1590: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
15a0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
15b0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
15c0: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
15d0: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
15e0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
15f0: 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20 68 6f 6c   /* p->flags hol
1600: 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65 20 61 6e  ds EP_Collate an
1610: 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  d p->pLeft->flag
1620: 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20 41 6e 64  s does not.  And
1630: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 78  .        ** p->x
1640: 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e 6f 74 2e  .pSelect cannot.
1650: 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e 70 4c 65    So if p->x.pLe
1660: 66 74 20 65 78 69 73 74 73 2c 20 69 74 20 6d 75  ft exists, it mu
1670: 73 74 20 68 6f 6c 64 20 61 74 0a 20 20 20 20 20  st hold at.     
1680: 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20     ** least one 
1690: 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54 68 75 73  EP_Collate. Thus
16a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
16b0: 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f 0a 20 20  wo ALWAYS. */.  
16c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 2e 70        if( p->x.p
16d0: 4c 69 73 74 21 3d 30 20 26 26 20 41 4c 57 41 59  List!=0 && ALWAY
16e0: 53 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  S(!ExprHasProper
16f0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
1700: 63 74 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ct)) ){.        
1710: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41     for(i=0; ALWA
1730: 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  YS(i<p->x.pList-
1740: 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a 20  >nExpr); i++){. 
1750: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 45             if( E
1760: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1770: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1780: 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61 74  pExpr, EP_Collat
1790: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
17a0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78      pNext = p->x
17b0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
17c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1800: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
1810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1820: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
1830: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1840: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
1850: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
1860: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
1870: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1880: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
1890: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
18a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18b0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
18c0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
18d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
18e0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
18f0: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
1900: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1910: 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f 6c 6c  .** defautl coll
1920: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
1930: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1950: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
1960: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1970: 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  q() routine work
1980: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
1990: 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72 65 74  t that it.** ret
19a0: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
19b0: 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64  re is no defined
19c0: 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 43   collation..*/.C
19d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
19e0: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50 61 72  xprNNCollSeq(Par
19f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1a00: 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c   *pExpr){.  Coll
1a10: 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Seq *p = sqlite3
1a20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1a30: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  se, pExpr);.  if
1a40: 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70 50 61  ( p==0 ) p = pPa
1a50: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1a60: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  ll;.  assert( p!
1a70: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
1a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a90: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 74 77  n TRUE if the tw
1aa0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 68 61  o expressions ha
1ab0: 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  ve equivalent co
1ac0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ad0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1ae0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63  3ExprCollSeqMatc
1af0: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
1b00: 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
1b10: 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c 53 65   *pE2){.  CollSe
1b20: 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71 6c 69  q *pColl1 = sqli
1b30: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b40: 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b 0a 20  (pParse, pE1);. 
1b50: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32   CollSeq *pColl2
1b60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
1b70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b80: 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  pE2);.  return s
1b90: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ba0: 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f  oll1->zName, pCo
1bb0: 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 3b 0a  ll2->zName)==0;.
1bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1bd0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
1be0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1bf0: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1c00: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1c10: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1c20: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1c30: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c40: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1c50: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1c60: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1c70: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1c80: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
1c90: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1ca0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
1cb0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
1cc0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
1cd0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1ce0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1cf0: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1d00: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1d10: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1d20: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1d30: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1d40: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1d50: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1d60: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1d70: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1d80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1d90: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1da0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
1db0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1dc0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
1dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1de0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1e00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1e10: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1e20: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1e30: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1e40: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1e50: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1e60: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1e70: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1e80: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1e90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1eb0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ec0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ed0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1ee0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1ef0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1f00: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1f10: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1f20: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1f30: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1f40: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1f50: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1f60: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1f70: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1f80: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1f90: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1fa0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1fb0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1fc0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1fd0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1fe0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1ff0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
2000: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
2010: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
2020: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
2030: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2040: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
2050: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
2060: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
2070: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
2080: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
2090: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
20a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
20b0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
20c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
20d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
20e0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
20f0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
2100: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
2110: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2120: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2130: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2140: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
2150: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2160: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
2170: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
2180: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
2190: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21a0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
21b0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
21c0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
21f0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
2200: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
2210: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
2220: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
2230: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
2240: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
2250: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
2260: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
2270: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
2280: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
2290: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
22a0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
22b0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
22c0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
22d0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
22e0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
22f0: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
2300: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
2310: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
2320: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
2330: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
2340: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
2350: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
2360: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
2370: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
2380: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
2390: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
23a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
23b0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
23c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
23d0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
23e0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
23f0: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2400: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2410: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2420: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2430: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2440: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2460: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2470: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2480: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
2490: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
24a0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
24b0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
24c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
24d0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
24e0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
24f0: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2500: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2510: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2520: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2530: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2540: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2550: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2560: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2570: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2580: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
2590: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
25a0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
25b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25c0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
25d0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
25e0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
25f0: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2600: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2610: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2620: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2630: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2640: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2650: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2660: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2670: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2680: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
2690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
26a0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
26b0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
26c0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
26d0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
26e0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
26f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2700: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2710: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2720: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2730: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2740: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2750: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2760: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2770: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2780: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
2790: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
27a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27b0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
27c0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
27d0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
27e0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
27f0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2800: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2810: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2820: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2830: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2840: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2850: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2860: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2870: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2880: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
2890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
28a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
28b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
28c0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
28d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
28e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
28f0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2900: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2910: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2920: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2940: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2950: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2960: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2970: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2980: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
2990: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
29a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
29b0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
29c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
29d0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
29e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
29f0: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2a00: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2a10: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2a20: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2a30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2a40: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2a50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2a70: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2a80: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
2a90: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
2aa0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
2ab0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
2ac0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
2ad0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
2ae0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2af0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2b00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2b10: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2b20: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2b30: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2b40: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2b50: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2b60: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2b70: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2b80: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
2b90: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
2ba0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2bb0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
2bc0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
2bd0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2c00: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2c10: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2c20: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2c30: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2c40: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2c60: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2c70: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2c80: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
2c90: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
2ca0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
2cb0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
2cc0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
2cd0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
2ce0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2cf0: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2d00: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2d10: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2d20: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2d30: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2d40: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2d50: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2d60: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2d70: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2d80: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
2d90: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
2da0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
2db0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
2dc0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
2dd0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
2de0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2e00: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2e10: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2e20: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2e30: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2e60: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2e70: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2e80: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2e90: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ea0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2eb0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ec0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ed0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2ee0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2ef0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2f00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2f10: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2f20: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2f30: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2f40: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2f50: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2f60: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2f70: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2f80: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2fb0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2fc0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2fd0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2fe0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2ff0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
3000: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
3010: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
3020: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
3030: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
3040: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
3050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3060: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
3070: 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70  bexpression of p
3080: 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74  Vector that is t
3090: 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d  he i-th.** colum
30a0: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
30b0: 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69  (numbered starti
30c0: 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65  ng with 0).  The
30d0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
30e0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73  ensure that i is
30f0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a   within range..*
3100: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3110: 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6c  is really a scal
3120: 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72 22  ar (and "scalar"
3130: 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20 73   here includes s
3140: 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68 61  ubqueries.** tha
3150: 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  t return a singl
3160: 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20  e column!) then 
3170: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20 75  return pVector u
3180: 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  nmodified..**.**
3190: 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e 73   pVector retains
31a0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
31b0: 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65 78  e returned subex
31c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
31d0: 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69 73  If the vector is
31e0: 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20   a (SELECT ...) 
31f0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
3200: 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73 0a  ion returned is.
3210: 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70 72  ** just the expr
3220: 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69  ession for the i
3230: 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
3240: 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
3250: 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65  may.** not be re
3260: 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ady for evaluati
3270: 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 74  on because the t
3280: 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73 20  able cursor has 
3290: 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
32a0: 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45  positioned..*/.E
32b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74  xpr *sqlite3Vect
32c0: 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45  orFieldSubexpr(E
32d0: 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e  xpr *pVector, in
32e0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
32f0: 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  i<sqlite3ExprVec
3300: 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29  torSize(pVector)
3310: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
3320: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56  3ExprIsVector(pV
3330: 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61 73  ector) ){.    as
3340: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f  sert( pVector->o
3350: 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72  p2==0 || pVector
3360: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
3370: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56 65  R );.    if( pVe
3380: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3390: 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e  ECT || pVector->
33a0: 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  op2==TK_SELECT )
33b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
33c0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
33d0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
33e0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
33f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
3400: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3410: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3420: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3430: 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  pVector;.}../*.*
3440: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
3450: 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20  turn a new Expr 
3460: 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65  object which whe
3470: 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73  n passed to.** s
3480: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
3490: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61   will generate a
34a0: 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64  ll necessary cod
34b0: 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  e to compute.** 
34c0: 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f  the iField-th co
34d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
34e0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56  or expression pV
34f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ector..**.** It 
3500: 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f  is ok for pVecto
3510: 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  r to be a scalar
3520: 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69   (as long as iFi
3530: 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e  eld==0).  .** In
3540: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
3550: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
3560: 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44  ike sqlite3ExprD
3570: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  up()..**.** The 
3580: 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20  caller owns the 
3590: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
35a0: 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70  ject and is resp
35b0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65  onsible for.** e
35c0: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
35d0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
35e0: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
35f0: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  freed..**.** The
3600: 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20   caller retains 
3610: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65  ownership of pVe
3620: 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f  ctor.  If pVecto
3630: 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54  r is a TK_SELECT
3640: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
3650: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77 69  turned object wi
3660: 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56 65  ll reference pVe
3670: 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63  ctor and so pVec
3680: 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a  tor must remain.
3690: 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ** valid for the
36a0: 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65 74   life of the ret
36b0: 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49  urned object.  I
36c0: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
36d0: 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61  K_VECTOR.** or a
36e0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
36f0: 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20  on, then it can 
3700: 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f  be deleted as so
3710: 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74 69  on as this routi
3720: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a  ne.** returns..*
3730: 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20  *.** A trick to 
3740: 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43  cause a TK_SELEC
3750: 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20  T pVector to be 
3760: 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72  deleted together
3770: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74   with.** the ret
3780: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3790: 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20 74  t is to attach t
37a0: 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68  he pVector to th
37b0: 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a  e pRight field.*
37c0: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
37d0: 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  d TK_SELECT_COLU
37e0: 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a  MN Expr object..
37f0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3800: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
3810: 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ld(.  Parse *pPa
3820: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3830: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3840: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3850: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
3860: 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20  ector.  List of 
3870: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61  expressions or a
3880: 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20   sub-SELECT */. 
3890: 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20   int iField     
38a0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
38b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
38c0: 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  tor to return */
38d0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74  .){.  Expr *pRet
38e0: 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d  ;.  if( pVector-
38f0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
3900: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  {.    assert( pV
3910: 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45  ector->flags & E
3920: 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20  P_xIsSelect );. 
3930: 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c     /* The TK_SEL
3940: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
3950: 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  node:.    **.   
3960: 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20   ** pLeft:      
3970: 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e       pVector con
3980: 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43  taining TK_SELEC
3990: 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e  T.  Not deleted.
39a0: 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20  .    ** pRight: 
39b0: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65           not use
39c0: 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76  d.  But recursiv
39d0: 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  ely deleted..   
39e0: 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20   ** iColumn:    
39f0: 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20       Index of a 
3a00: 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f  column in pVecto
3a10: 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a  r.    ** iTable:
3a20: 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20 74            0 or t
3a30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
3a40: 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53 20  umns on the LHS 
3a50: 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74  of an assignment
3a60: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
3a70: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
3a80: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
3a90: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3aa0: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3ab0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3ac0: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
3ad0: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
3ae0: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
3af0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
3b00: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
3b10: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3b20: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3b30: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3b40: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
3b50: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
3b60: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
3b70: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
3b80: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
3b90: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
3ba0: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3bb0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
3bc0: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
3bd0: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
3be0: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
3bf0: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
3c00: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3c10: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3c20: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3c30: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3c40: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3c50: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
3c60: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
3c70: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
3c80: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3c90: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3ca0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3cb0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
3cc0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Ret ){.      pRe
3cd0: 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69  t->iColumn = iFi
3ce0: 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  eld;.      pRet-
3cf0: 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72  >pLeft = pVector
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3d10: 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70  rt( pRet==0 || p
3d20: 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  Ret->iTable==0 )
3d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3d40: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
3d50: 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63  TK_VECTOR ) pVec
3d60: 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  tor = pVector->x
3d70: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
3d80: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65  ].pExpr;.    pRe
3d90: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
3da0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
3db0: 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a  Vector, 0);.  }.
3dc0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
3de0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f  ssion pExpr is o
3df0: 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54  f type TK_SELECT
3e00: 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
3e10: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69  to evaluate.** i
3e20: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  t. Return the re
3e30: 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20  gister in which 
3e40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
3e50: 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65  ored (or, if the
3e60: 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
3e70: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3e80: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  n one column, th
3e90: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3ea0: 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74  ray.** of regist
3eb0: 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65  ers in which the
3ec0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3ed0: 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  d)..**.** If pEx
3ee0: 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53  pr is not a TK_S
3ef0: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3f00: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
3f10: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
3f20: 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
3f30: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3f40: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
3f50: 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  eg = 0;.#ifndef 
3f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3f70: 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
3f80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3f90: 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c  ){.    reg = sql
3fa0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
3fb0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
3fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
3fd0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b  if.  return reg;
3fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
3ff0: 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74  nt pVector point
4000: 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78  s to a vector ex
4010: 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65  pression - eithe
4020: 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  r a TK_VECTOR.**
4030: 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68   or TK_SELECT th
4040: 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  at returns more 
4050: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e  than one column.
4060: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4070: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65  eturns.** the re
4080: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66  gister number of
4090: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
40a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
40b0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  lue of.** elemen
40c0: 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20  t iField of the 
40d0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  vector..**.** If
40e0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
40f0: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
4100: 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  on, then code fo
4110: 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a  r it must have .
4120: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4130: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
4140: 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73  the exprCodeSubs
4150: 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e  elect() routine.
4160: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
4170: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65   parameter regSe
4180: 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74  lect should be t
4190: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
41a0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
41b0: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s.** containing 
41c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
41d0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a  he sub-select. .
41e0: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
41f0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
4200: 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65  ECTOR, then code
4210: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
4220: 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67  ed field.** is g
4230: 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69  enerated. In thi
4240: 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65  s case (*pRegFre
4250: 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  e) may be set to
4260: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
4270: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  * a temporary re
4280: 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65  gister to be fre
4290: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
42a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
42b0: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
42c0: 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75  returning, outpu
42d0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70  t parameter (*pp
42e0: 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20  Expr) is set to 
42f0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4300: 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72  Expr object corr
4310: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65  esponding to ele
4320: 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68  ment iElem of th
4330: 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61  e vector..*/.sta
4340: 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74  tic int exprVect
4350: 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  orRegister(.  Pa
4360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
4390: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
43a0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
43b0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f      /* Vector to
43c0: 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74   extract element
43d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
43e0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4400: 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66  eld to extract f
4410: 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20  rom pVector */. 
4420: 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20   int regSelect, 
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
4450: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4460: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
4470: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
4480: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70       /* OUT: Exp
4490: 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20  ression element 
44a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72  */.  int *pRegFr
44b0: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
44c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d       /* OUT: Tem
44d0: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
44e0: 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70  ee */.){.  u8 op
44f0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a   = pVector->op;.
4500: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
4510: 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54  _VECTOR || op==T
4520: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70  K_REGISTER || op
4530: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
4540: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
4550: 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45  STER ){.    *ppE
4560: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63  xpr = sqlite3Vec
4570: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
4580: 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29  pVector, iField)
4590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 65  ;.    return pVe
45a0: 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69  ctor->iTable+iFi
45b0: 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  eld;.  }.  if( o
45c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
45d0: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56      *ppExpr = pV
45e0: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
45f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65  ->pEList->a[iFie
4600: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ld].pExpr;.     
4610: 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74  return regSelect
4620: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a  +iField;.  }.  *
4630: 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72  ppExpr = pVector
4640: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
4650: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65  eld].pExpr;.  re
4660: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
4670: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
4680: 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72   *ppExpr, pRegFr
4690: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ee);.}../*.** Ex
46a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
46b0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  s a comparison b
46c0: 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f  etween two vecto
46d0: 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74  r values. Comput
46e0: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
46f0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4700: 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c  n (1, 0, or NULL
4710: 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  ) and write that
4720: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  .** result into 
4730: 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a  register dest..*
4740: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4750: 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65  must satisfy the
4760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f   following preco
4770: 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  nditions:.**.** 
4780: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
4790: 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d  =TK_IS:      op=
47a0: 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53  =TK_EQ and p5==S
47b0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
47c0: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
47d0: 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d  =TK_ISNOT:   op=
47e0: 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53  =TK_NE and p5==S
47f0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
4800: 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20     otherwise:   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d               op=
4820: 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70  =pExpr->op and p
4830: 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76  5==0.*/.static v
4840: 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f  oid codeVectorCo
4850: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
4860: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
4870: 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  * Code generator
4880: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4890: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
48a0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
48b0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
48c0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
48d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
48e0: 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
48f0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4900: 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20  /.  u8 op,      
4910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
4920: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4930: 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
4940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4950: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20  QLITE_NULLEQ or 
4960: 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  zero */.){.  Vdb
4970: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4980: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c  Vdbe;.  Expr *pL
4990: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
49a0: 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft;.  Expr *pRig
49b0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
49c0: 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20  ht;.  int nLeft 
49d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
49e0: 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
49f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4a00: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e  egLeft = 0;.  in
4a10: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
4a20: 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20    u8 opx = op;. 
4a30: 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20   int addrDone = 
4a40: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4a50: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  abel(v);..  if( 
4a60: 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45 78  nLeft!=sqlite3Ex
4a70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69  prVectorSize(pRi
4a80: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
4a90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4aa0: 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
4ab0: 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72 65  isused");.    re
4ac0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4ad0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
4ae0: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
4af0: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
4b20: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20  p==TK_ISNOT .   
4b30: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72  ==TK_LT || pExpr
4b50: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20  ->op==TK_GT .   
4b60: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b70: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72  ==TK_LE || pExpr
4b80: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29  ->op==TK_GE .  )
4b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
4ba0: 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45  r->op==op || (pE
4bb0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26  xpr->op==TK_IS &
4bc0: 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20  & op==TK_EQ).   
4bd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78           || (pEx
4be0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
4bf0: 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29   && op==TK_NE) )
4c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c10: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d  0 || pExpr->op!=
4c20: 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  op );.  assert( 
4c30: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
4c40: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
4c50: 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53  op );..  p5 |= S
4c60: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20  QLITE_STOREP2;. 
4c70: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20   if( opx==TK_LE 
4c80: 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20  ) opx = TK_LT;. 
4c90: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20   if( opx==TK_GE 
4ca0: 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a  ) opx = TK_GT;..
4cb0: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4cc0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4cd0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4ce0: 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43  regRight = exprC
4cf0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
4d00: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20  rse, pRight);.. 
4d10: 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f   for(i=0; 1 /*Lo
4d20: 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65  op exits by "bre
4d30: 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20  ak"*/; i++){.   
4d40: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
4d50: 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  0, regFree2 = 0;
4d60: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a  .    Expr *pL, *
4d70: 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c  pR; .    int r1,
4d80: 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28   r2;.    assert(
4d90: 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74   i>=0 && i<nLeft
4da0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20   );.    if( i>0 
4db0: 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  ) sqlite3ExprCac
4dc0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
4dd0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4de0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4df0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4e00: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e10: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e20: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e30: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e40: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e50: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e60: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e70: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e80: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e90: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4ea0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4eb0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4ec0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ed0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ee0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ef0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f00: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f10: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f20: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f30: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f40: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f50: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f60: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f70: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f80: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f90: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4fa0: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fb0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fc0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fd0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fe0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4ff0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5000: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5010: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5020: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5030: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5040: 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70  i>0 ) sqlite3Exp
5050: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
5060: 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c  );.    if( i==nL
5070: 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62  eft-1 ){.      b
5080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5090: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29  if( opx==TK_EQ )
50a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
50b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
50c0: 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64  IfNot, dest, add
50d0: 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65  rDone); VdbeCove
50e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70  rage(v);.      p
50f0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
5100: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
5110: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29  if( opx==TK_NE )
5120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5130: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5140: 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f  If, dest, addrDo
5150: 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ne); VdbeCoverag
5160: 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c  e(v);.      p5 |
5170: 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  = SQLITE_KEEPNUL
5180: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
5190: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
51a0: 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  TK_LT || op==TK_
51b0: 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20  GT || op==TK_LE 
51c0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  || op==TK_GE );.
51d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c  eAddOp2(v, OP_El
51f0: 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72  seNotEq, 0, addr
5200: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  Done);.      Vdb
5210: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
5220: 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20  p==TK_LT);.     
5230: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
5240: 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20  v, op==TK_GT);. 
5250: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5260: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45  eIf(v, op==TK_LE
5270: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5280: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
5290: 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28  K_GE);.      if(
52a0: 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70   i==nLeft-2 ) op
52b0: 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  x = op;.    }.  
52c0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
52d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
52e0: 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66  ddrDone);.}..#if
52f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
5300: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
5310: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
5320: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
5330: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
5340: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
5350: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
5360: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
5370: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
5380: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5390: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
53a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
53b0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
53c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
53d0: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
53e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
53f0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
5400: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
5410: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5420: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
5430: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
5440: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
5450: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5460: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
5470: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
5480: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
5490: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
54a0: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
54b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
54c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
54d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
54e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
54f0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
5500: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
5510: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
5520: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
5530: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
5540: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
5550: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
5560: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
5570: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
5580: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
5590: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
55a0: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
55b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
55c0: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
55d0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
55e0: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
55f0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
5600: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
5610: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
5620: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
5630: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
5640: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
5650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5660: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
5670: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5680: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5690: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
56a0: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
56b0: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
56c0: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
56d0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
56e0: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
56f0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
5700: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5710: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5720: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
5730: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
5740: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
5750: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
5760: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
5770: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
5780: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5790: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
57a0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20  t *pSelect, int 
57b0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65  *pnHeight){.  Se
57c0: 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70  lect *p;.  for(p
57d0: 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70  =pSelect; p; p=p
57e0: 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68  ->pPrior){.    h
57f0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5800: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
5810: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5820: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
5830: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5840: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5850: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
5860: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5870: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
5880: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5890: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
58a0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
58b0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
58c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
58d0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
58e0: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
58f0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
5900: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
5910: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
5920: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
5930: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
5940: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
5950: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
5960: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
5970: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
5980: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
5990: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
59a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
59b0: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
59c0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
59d0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
59e0: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
59f0: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
5a00: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
5a10: 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67  pagate EP_Propag
5a20: 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f  ate flags up fro
5a30: 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74  m Expr.x.pList t
5a40: 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a  o Expr.flags,.**
5a50: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
5a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a70: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
5a80: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
5a90: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5aa0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
5ab0: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
5ac0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5ad0: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
5ae0: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
5af0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5b00: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5b10: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
5b20: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
5b30: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
5b40: 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74  e if( p->x.pList
5b50: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
5b60: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
5b70: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
5b80: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20      p->flags |= 
5b90: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73  EP_Propagate & s
5ba0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
5bb0: 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  ags(p->x.pList);
5bc0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
5bd0: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
5be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
5bf0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
5c00: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
5c10: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
5c20: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
5c30: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
5c40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
5c50: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
5c60: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
5c70: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
5c80: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
5c90: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61  **.** Also propa
5ca0: 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70  gate all EP_Prop
5cb0: 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d  agate flags from
5cc0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
5cd0: 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66  t into.** Expr.f
5ce0: 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  lags. .*/.void s
5cf0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
5d00: 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73  ghtAndFlags(Pars
5d10: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
5d20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  *p){.  if( pPars
5d30: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
5d40: 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68  ;.  exprSetHeigh
5d50: 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t(p);.  sqlite3E
5d60: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
5d70: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
5d80: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
5d90: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
5da0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78  height of any ex
5db0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
5dc0: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74  ferenced.** by t
5dd0: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
5de0: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
5df0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
5e00: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  t sqlite3SelectE
5e10: 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74  xprHeight(Select
5e20: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5e30: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5e40: 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48  tOfSelect(p, &nH
5e50: 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e  eight);.  return
5e60: 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73   nHeight;.}.#els
5e70: 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69  e /* ABOVE:  Hei
5e80: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
5e90: 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a  enabled.  BELOW:
5ea0: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
5eb0: 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a  ent off */./*.**
5ec0: 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   Propagate all E
5ed0: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
5ee0: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
5ef0: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
5f00: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
5f10: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5f20: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
5f30: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
5f40: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5f50: 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74   p && p->x.pList
5f60: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
5f70: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
5f80: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  lect) ){.    p->
5f90: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
5fa0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
5fb0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
5fc0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  x.pList);.  }.}.
5fd0: 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48  #define exprSetH
5fe0: 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20  eight(y).#endif 
5ff0: 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  /* SQLITE_MAX_EX
6000: 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f  PR_DEPTH>0 */../
6010: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6020: 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c  e is the core al
6030: 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72  locator for Expr
6040: 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f   nodes..**.** Co
6050: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
6060: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
6070: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
6080: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
6090: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
60a0: 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  de and for the p
60b0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69  Token argument i
60c0: 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  s a single alloc
60d0: 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65  ation.** obtaine
60e0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
60f0: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
6100: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
6110: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
6120: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
6130: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
6140: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
6150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ..**.** If dequo
6160: 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
6170: 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69   the token (if i
6180: 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71  t exists) is deq
6190: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71  uoted..** If deq
61a0: 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e  uote is false, n
61b0: 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70  o dequoting is p
61c0: 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64  erformed.  The d
61d0: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
61e0: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
61f0: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
6200: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
6210: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
6220: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
6230: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
6240: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
6250: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
6260: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
6270: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
6280: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
6290: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
62a0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
62b0: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
62c0: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
62d0: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
62e0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
62f0: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
6300: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
6310: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
6320: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
6330: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
6340: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
6350: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
6360: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
6370: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
6380: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
6390: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
63a0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
63b0: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
63c0: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
63d0: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
63e0: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
63f0: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
6400: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
6410: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
6420: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
6430: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
6440: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6450: 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74  RawNN() */.  int
6460: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6470: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6480: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
6490: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
64a0: 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  en,    /* Token 
64b0: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
64c0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
64d0: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
64e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
64f0: 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20   dequote */.){. 
6500: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
6510: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
6520: 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b   int iValue = 0;
6530: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
6540: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
6550: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21  n ){.    if( op!
6560: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70  =TK_INTEGER || p
6570: 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20  Token->z==0.    
6580: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
6590: 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d  GetInt32(pToken-
65a0: 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20  >z, &iValue)==0 
65b0: 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  ){.      nExtra 
65c0: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20  = pToken->n+1;. 
65d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61       assert( iVa
65e0: 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  lue>=0 );.    }.
65f0: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c    }.  pNew = sql
6600: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
6610: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
6620: 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66  r)+nExtra);.  if
6630: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65  ( pNew ){.    me
6640: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
6650: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20  zeof(Expr));.   
6660: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
6670: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
6680: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
6690: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
66a0: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
66b0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
66c0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
66d0: 61 6c 75 65 7c 45 50 5f 4c 65 61 66 3b 0a 20 20  alue|EP_Leaf;.  
66e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
66f0: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
6700: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6710: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6720: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  en = (char*)&pNe
6730: 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  w[1];.        as
6740: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
6750: 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d  =0 || pToken->n=
6760: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
6770: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65  ( pToken->n ) me
6780: 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  mcpy(pNew->u.zTo
6790: 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ken, pToken->z, 
67a0: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
67b0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
67c0: 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20  en[pToken->n] = 
67d0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  0;.        if( d
67e0: 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65  equote && sqlite
67f0: 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Isquote(pNew->u
6800: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
6810: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
6820: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  w->u.zToken[0]==
6830: 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67  '"' ) pNew->flag
6840: 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65  s |= EP_DblQuote
6850: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  d;.          sql
6860: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
6870: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
6880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6890: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
68a0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
68b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  .    pNew->nHeig
68c0: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
68d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
68e0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
68f0: 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  ocate a new expr
6900: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d  ession node from
6910: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
6920: 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  ed token that ha
6930: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65  s.** already bee
6940: 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45  n dequoted..*/.E
6950: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
6960: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
6980: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
6990: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
69a0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
69b0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
69c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
69d0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
69e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
69f0: 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20  *zToken      /* 
6a00: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
6a10: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6a20: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a  /.){.  Token x;.
6a30: 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a    x.z = zToken;.
6a40: 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    x.n = sqlite3S
6a50: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 3b  trlen30(zToken);
6a60: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
6a70: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f  3ExprAlloc(db, o
6a80: 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  p, &x, 0);.}../*
6a90: 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74 72  .** Attach subtr
6aa0: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
6ab0: 69 67 68 74 20 74 6f 20 74 68 65 20 45 78 70 72  ight to the Expr
6ac0: 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a   node pRoot..**.
6ad0: 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c  ** If pRoot==NUL
6ae0: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  L that means tha
6af0: 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  t a memory alloc
6b00: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
6b10: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20  occurred..** In 
6b20: 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74  that case, delet
6b30: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 70  e the subtrees p
6b40: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
6b50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6b60: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
6b70: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  es(.  sqlite3 *d
6b80: 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74  b,.  Expr *pRoot
6b90: 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  ,.  Expr *pLeft,
6ba0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a  .  Expr *pRight.
6bb0: 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d  ){.  if( pRoot==
6bc0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
6bd0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6be0: 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
6bf0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
6c00: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
6c10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
6c20: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
6c30: 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  e{.    if( pRigh
6c40: 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  t ){.      pRoot
6c50: 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68  ->pRight = pRigh
6c60: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6c70: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6c80: 61 67 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e  agate & pRight->
6c90: 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20  flags;.    }.   
6ca0: 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20   if( pLeft ){.  
6cb0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74      pRoot->pLeft
6cc0: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
6cd0: 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pRoot->flags |= 
6ce0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70  EP_Propagate & p
6cf0: 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Left->flags;.   
6d00: 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65   }.    exprSetHe
6d10: 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d  ight(pRoot);.  }
6d20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
6d30: 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20  te an Expr node 
6d40: 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d  which joins as m
6d50: 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72  any as two subtr
6d60: 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f  ees..**.** One o
6d70: 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75  r both of the su
6d80: 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55  btrees can be NU
6d90: 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  LL.  Return a po
6da0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
6db0: 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  .** Expr node.  
6dc0: 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  Or, if an OOM er
6dd0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
6de0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
6df0: 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65  ocFailed,.** fre
6e00: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61  e the subtrees a
6e10: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
6e20: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6e30: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
6e40: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
6e50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6e60: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
6e90: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
6ea0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
6eb0: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
6ec0: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
6ed0: 69 67 68 74 20 20 20 20 20 20 20 20 20 20 20 20  ight            
6ee0: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
6ef0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
6f00: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
6f10: 4e 44 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45  ND && pParse->nE
6f20: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  rr==0 ){.    /* 
6f30: 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  Take advantage o
6f40: 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20  f short-circuit 
6f50: 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  false optimizati
6f60: 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20  on for AND */.  
6f70: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
6f80: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
6f90: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
6fa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
6fb0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6fc0: 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64  cRawNN(pParse->d
6fd0: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
6fe0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
6ff0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
7000: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
7010: 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f  .      p->op = o
7020: 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a  p & TKFLG_MASK;.
7030: 20 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d 20        p->iAgg = 
7040: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  -1;.    }.    sq
7050: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
7060: 75 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e  ubtrees(pParse->
7070: 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52  db, p, pLeft, pR
7080: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ight);.  }.  if(
7090: 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74   p ) {.    sqlit
70a0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
70b0: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
70c0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ight);.  }.  ret
70d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
70e0: 41 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74  Add pSelect to t
70f0: 68 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  he Expr.x.pSelec
7100: 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66  t field.  Or, if
7110: 20 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28   pExpr is NULL (
7120: 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f  due.** do a memo
7130: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
7140: 69 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65  ilure) then dele
7150: 74 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f  te the pSelect o
7160: 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
7170: 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
7180: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
7190: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
71a0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
71b0: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  ){.  if( pExpr )
71c0: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70  {.    pExpr->x.p
71d0: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
71e0: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  ;.    ExprSetPro
71f0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7200: 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62  xIsSelect|EP_Sub
7210: 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  query);.    sqli
7220: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
7230: 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c  AndFlags(pParse,
7240: 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65   pExpr);.  }else
7250: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7260: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
7270: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
7280: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
7290: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
72a0: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  elect);.  }.}...
72b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
72c0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
72d0: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
72e0: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
72f0: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
7300: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
7310: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
7320: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
7330: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
7340: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
7350: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
7360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
7370: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
7380: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
7390: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
73a0: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
73b0: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
73c0: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
73d0: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
73e0: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
73f0: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
7400: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
7410: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
7420: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
7430: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
7440: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
7450: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
7460: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
7470: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
7480: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7490: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
74a0: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
74b0: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
74c0: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
74d0: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
74e0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
74f0: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
7500: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
7510: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
7520: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
7530: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
7540: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
7550: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
7560: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
7570: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
7580: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
7590: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
75a0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
75b0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
75c0: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
75d0: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
75e0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
75f0: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
7600: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7610: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
7620: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7630: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
7640: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
7650: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
7660: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
7670: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
7680: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
7690: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
76a0: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
76b0: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
76c0: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
76d0: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
76e0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
76f0: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
7700: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
7710: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
7720: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
7730: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
7740: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
7750: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
7760: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
7770: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
7780: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
7790: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
77a0: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
77b0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
77c0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
77d0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
77e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
77f0: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
7800: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
7810: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
7820: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
7830: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
7840: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
7850: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
7860: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
7870: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7880: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
7890: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
78a0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
78b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
78c0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
78d0: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
78e0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
78f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
7900: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
7910: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7920: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
7930: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
7940: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
7950: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
7960: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
7970: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
7980: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
7990: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
79a0: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
79b0: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
79c0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
79d0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
79e0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  xprFunction(Pars
79f0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
7a00: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
7a10: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
7a20: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69  pr *pNew;.  sqli
7a30: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7a40: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
7a50: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
7a60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
7a70: 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54  loc(db, TK_FUNCT
7a80: 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b  ION, pToken, 1);
7a90: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
7aa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
7ab0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
7ac0: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
7ad0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65   memory leak whe
7ae0: 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  n malloc fails *
7af0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
7b00: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c    }.  pNew->x.pL
7b10: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45  ist = pList;.  E
7b20: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
7b30: 4e 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29  New, EP_HasFunc)
7b40: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
7b50: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7b60: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
7b70: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
7b80: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
7b90: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
7ba0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
7bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
7bc0: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
7bd0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
7be0: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
7bf0: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
7c00: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
7c10: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
7c20: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7c30: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
7c40: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
7c50: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
7c60: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
7c70: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
7c80: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7c90: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
7ca0: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
7cb0: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
7cc0: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
7cd0: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
7ce0: 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69 64  too big to avoid
7cf0: 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72   a denial of ser
7d00: 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e  vice attack when
7d10: 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74  .** the SQL stat
7d20: 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d  ement comes from
7d30: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75   an external sou
7d40: 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  rce..**.** Wildc
7d50: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
7d60: 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c   ":aaa", "@aaa",
7d70: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
7d80: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
7d90: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
7da0: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
7db0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
7dc0: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
7dd0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
7de0: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
7df0: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
7e00: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7e10: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
7e20: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
7e30: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
7e40: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
7e50: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
7e60: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
7e70: 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c  r, u32 n){.  sql
7e80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7e90: 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e->db;.  const c
7ea0: 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20  har *z;.  ynVar 
7eb0: 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  x;..  if( pExpr=
7ec0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
7ed0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
7ee0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
7ef0: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
7f00: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
7f10: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
7f20: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
7f30: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
7f40: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
7f50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
7f60: 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33 53 74  ==(u32)sqlite3St
7f70: 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69  rlen30(z) );.  i
7f80: 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20  f( z[1]==0 ){.  
7f90: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
7fa0: 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20   the form "?".  
7fb0: 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20  Assign the next 
7fc0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7fd0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  */.    assert( z
7fe0: 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20  [0]=='?' );.    
7ff0: 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  x = (ynVar)(++pP
8000: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d  arse->nVar);.  }
8010: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f  else{.    int do
8020: 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Add = 0;.    if(
8030: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
8040: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
8050: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
8060: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
8070: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
8080: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
8090: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
80a0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
80b0: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
80c0: 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20    int bOk;.     
80d0: 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f   if( n==2 ){ /*O
80e0: 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54  PTIMIZATION-IF-T
80f0: 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20 69 20  RUE*/.        i 
8100: 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20  = z[1]-'0';  /* 
8110: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
8120: 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67  of ?N for a sing
8130: 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20  le digit N */.  
8140: 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20        bOk = 1;. 
8150: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8160: 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c      bOk = 0==sql
8170: 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d  ite3Atoi64(&z[1]
8180: 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54  , &i, n-1, SQLIT
8190: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d  E_UTF8);.      }
81a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
81b0: 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   i==0 );.      t
81c0: 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b  estcase( i==1 );
81d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
81e0: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
81f0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8200: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29  ABLE_NUMBER]-1 )
8210: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8220: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
8230: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
8240: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b  IABLE_NUMBER] );
8250: 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d  .      if( bOk==
8260: 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62  0 || i<1 || i>db
8270: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8280: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8290: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
82a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
82b0: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
82c0: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
82d0: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
82e0: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
82f0: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53      db->aLimit[S
8300: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8310: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20  ABLE_NUMBER]);. 
8320: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
8330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78 20 3d       }.      x =
8340: 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20   (ynVar)i;.     
8350: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
8360: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Var ){.        p
8370: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69  Parse->nVar = (i
8380: 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20 64 6f  nt)x;.        do
8390: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
83a0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
83b0: 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70  VListNumToName(p
83c0: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78  Parse->pVList, x
83d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
83e0: 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20  doAdd = 1;.     
83f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8400: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73      /* Wildcards
8410: 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24   like ":aaa", "$
8420: 61 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20  aaa" or "@aaa". 
8430: 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   Reuse the same 
8440: 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
8450: 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  * number as the 
8460: 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65  prior appearance
8470: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
8480: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  e, or if the nam
8490: 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  e.      ** has n
84a0: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
84b0: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
84c0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
84d0: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mber.      */.  
84e0: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 73      x = (ynVar)s
84f0: 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d 65 54  qlite3VListNameT
8500: 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c  oNum(pParse->pVL
8510: 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  ist, z, n);.    
8520: 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20    if( x==0 ){.  
8530: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
8540: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
8550: 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64  );.        doAdd
8560: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
8570: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 41 64    }.    if( doAd
8580: 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  d ){.      pPars
8590: 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71 6c 69  e->pVList = sqli
85a0: 74 65 33 56 4c 69 73 74 41 64 64 28 64 62 2c 20  te3VListAdd(db, 
85b0: 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20  pParse->pVList, 
85c0: 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a  z, n, x);.    }.
85d0: 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f    }.  pExpr->iCo
85e0: 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20  lumn = x;.  if( 
85f0: 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  x>db->aLimit[SQL
8600: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8610: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
8620: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8630: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8640: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
8650: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
8660: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
8670: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
8680: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  on tree..*/.stat
8690: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
86a0: 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  NE void sqlite3E
86b0: 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  xprDeleteNN(sqli
86c0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
86d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
86e0: 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  0 );.  /* Sanity
86f0: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
8700: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
8710: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
8720: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
8730: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
8740: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8750: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
8760: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
8770: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8780: 45 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48  EBUG.  if( ExprH
8790: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
87a0: 5f 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48  _Leaf) && !ExprH
87b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
87c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
87d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
87e0: 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  eft==0 );.    as
87f0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
8800: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
8810: 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d  ( p->x.pSelect==
8820: 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0 );.  }.#endif.
8830: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
8840: 6f 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f  operty(p, (EP_To
8850: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
8860: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
8870: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
8880: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
8890: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
88a0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
88b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70    assert( p->x.p
88c0: 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  List==0 || p->pR
88d0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
88e0: 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70  f( p->pLeft && p
88f0: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op!=TK_SELECT_
8900: 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33  COLUMN ) sqlite3
8910: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8920: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20   p->pLeft);.    
8930: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b  if( p->pRight ){
8940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
8950: 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70  prDeleteNN(db, p
8960: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
8970: 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73  else if( ExprHas
8980: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
8990: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
89a0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
89b0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
89c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
89d0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
89e0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
89f0: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
8a00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8a10: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8a20: 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  y(p, EP_MemToken
8a30: 29 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  ) ) sqlite3DbFre
8a40: 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e(db, p->u.zToke
8a50: 6e 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  n);.  if( !ExprH
8a60: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8a70: 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  _Static) ){.    
8a80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
8a90: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  db, p);.  }.}.vo
8aa0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
8ab0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
8ac0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
8ad0: 28 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70  ( p ) sqlite3Exp
8ae0: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29  rDeleteNN(db, p)
8af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8b00: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8b10: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
8b20: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
8b30: 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  on structure .**
8b40: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
8b50: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
8b60: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  his is always on
8b70: 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49  e of EXPR_FULLSI
8b80: 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55  ZE,.** EXPR_REDU
8b90: 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f  CEDSIZE or EXPR_
8ba0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a  TOKENONLYSIZE..*
8bb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
8bc0: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
8bd0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
8be0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8bf0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72  P_TokenOnly) ) r
8c00: 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e  eturn EXPR_TOKEN
8c10: 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20  ONLYSIZE;.  if( 
8c20: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8c30: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  p, EP_Reduced) )
8c40: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44   return EXPR_RED
8c50: 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75  UCEDSIZE;.  retu
8c60: 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  rn EXPR_FULLSIZE
8c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
8c80: 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20  upedExpr*Size() 
8c90: 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65  routines each re
8ca0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8cb0: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
8cc0: 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20  d.** to store a 
8cd0: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
8ce0: 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73  ssion or express
8cf0: 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20  ion tree.  They 
8d00: 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77  differ in.** how
8d10: 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65   much of the tre
8d20: 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a  e is measured..*
8d30: 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  *.**     dupedEx
8d40: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20  prStructSize()  
8d50: 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20     Size of only 
8d60: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
8d70: 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  re .**     duped
8d80: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20  ExprNodeSize()  
8d90: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70       Size of Exp
8da0: 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f  r + space for to
8db0: 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  ken.**     duped
8dc0: 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20  ExprSize()      
8dd0: 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65       Expr + toke
8de0: 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70  n + subtree comp
8df0: 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  onents.**.******
8e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e40: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
8e50: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8e60: 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72  ize() function r
8e70: 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65  eturns two value
8e80: 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72  s OR-ed together
8e90: 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73  :  .** (1) the s
8ea0: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
8eb0: 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  r a copy of the 
8ec0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f  Expr structure o
8ed0: 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20  nly and .** (2) 
8ee0: 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73  the EP_xxx flags
8ef0: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77   that indicate w
8f00: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
8f10: 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  e size should be
8f20: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
8f30: 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73  values is always
8f40: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
8f50: 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a      EXPR_FULLSIZ
8f60: 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52  E.**      EXPR_R
8f70: 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45  EDUCEDSIZE   | E
8f80: 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20  P_Reduced.**    
8f90: 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59    EXPR_TOKENONLY
8fa0: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
8fb0: 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  nly.**.** The si
8fc0: 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ze of the struct
8fd0: 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ure can be found
8fe0: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20   by masking the 
8ff0: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
9000: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
9010: 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65  with 0xfff.  The
9020: 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f   flags can be fo
9030: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
9040: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
9050: 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63  ue with EP_Reduc
9060: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e  ed|EP_TokenOnly.
9070: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
9080: 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50   with flags==EXP
9090: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69  RDUP_REDUCE, thi
90a0: 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73  s routines works
90b0: 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a   on full-size.**
90c0: 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70   (unreduced) Exp
90d0: 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65  r objects as the
90e0: 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20  y or originally 
90f0: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
9100: 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75  he parser..** Du
9110: 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  ring expression 
9120: 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20  analysis, extra 
9130: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63  information is c
9140: 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65  omputed and move
9150: 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20  d into.** later 
9160: 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70  parts of teh Exp
9170: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  r object and tha
9180: 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  t extra informat
9190: 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68  ion might get ch
91a0: 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20  opped.** off if 
91b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
91c0: 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65  s reduced.  Note
91d0: 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f   also that it do
91e0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a  es not work to.*
91f0: 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55  * make an EXPRDU
9200: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
9210: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
9220: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
9230: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
9240: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
9250: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
9260: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
9270: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
9280: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
9290: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
92a0: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
92b0: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
92c0: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
92d0: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
92e0: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
92f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
9300: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
9310: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
9320: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
9330: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
9340: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
9350: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
9360: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
9370: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
9380: 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  owed */.  assert
9390: 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c  ( EXPR_FULLSIZE<
93a0: 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65  =0xfff );.  asse
93b0: 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50  rt( (0xfff & (EP
93c0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
93d0: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
93e0: 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20  if( 0==flags || 
93f0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
9400: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6e  _COLUMN ){.    n
9410: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
9420: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
9430: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9440: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9450: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
9460: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
9470: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9480: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
9490: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
94a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
94b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
94c0: 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20  emToken) );.    
94d0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
94e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
94f0: 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20  oReduce) );.    
9500: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20  if( p->pLeft || 
9510: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
9520: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
9530: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45  _REDUCEDSIZE | E
9540: 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d  P_Reduced;.    }
9550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
9560: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
9570: 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   );.      nSize 
9580: 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  = EXPR_TOKENONLY
9590: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
95a0: 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nly;.    }.  }. 
95b0: 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d   return nSize;.}
95c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
95d0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
95e0: 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  e space in bytes
95f0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
9600: 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20  re the copy .** 
9610: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
9620: 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79  cture and a copy
9630: 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a   of the Expr.u.z
9640: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
9650: 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20   that.** string 
9660: 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a  is defined.).*/.
9670: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
9680: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70  ExprNodeSize(Exp
9690: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
96a0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
96b0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
96c0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20  ize(p, flags) & 
96d0: 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78  0xfff;.  if( !Ex
96e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
96f0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9700: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9710: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
9720: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
9730: 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d  u.zToken)+1;.  }
9740: 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
9750: 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (nByte);.}../*.*
9760: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
9770: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
9780: 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20  uired to create 
9790: 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74  a duplicate of t
97a0: 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  he .** expressio
97b0: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
97c0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
97d0: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
97e0: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b  ent is a.** mask
97f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52   containing EXPR
9800: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
9810: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
9820: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
9830: 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65   space to create
9840: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
9850: 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74  xpr struct.** it
9860: 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66  self and the buf
9870: 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20  fer referred to 
9880: 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  by Expr.u.zToken
9890: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  , if any..**.** 
98a0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
98b0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
98c0: 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  t, then the retu
98d0: 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65  rn value include
98e0: 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64  s .** space to d
98f0: 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70  uplicate all Exp
9900: 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74  r nodes in the t
9910: 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78  ree formed by Ex
9920: 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64  pr.pLeft .** and
9930: 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72   Expr.pRight var
9940: 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20  iables (but not 
9950: 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72  for any structur
9960: 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72  es pointed to or
9970: 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66   .** descended f
9980: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
9990: 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70  List or Expr.x.p
99a0: 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73  Select variables
99b0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
99c0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45   dupedExprSize(E
99d0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
99e0: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
99f0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
9a00: 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65      nByte = dupe
9a10: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
9a20: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
9a30: 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52   flags&EXPRDUP_R
9a40: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e  EDUCE ){.      n
9a50: 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70  Byte += dupedExp
9a60: 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20  rSize(p->pLeft, 
9a70: 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78  flags) + dupedEx
9a80: 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74  prSize(p->pRight
9a90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
9aa0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79    }.  return nBy
9ab0: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  te;.}../*.** Thi
9ac0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
9ad0: 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
9ae0: 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70  ExprDup(), excep
9af0: 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66  t that if pzBuff
9b00: 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55  er .** is not NU
9b10: 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65  LL then *pzBuffe
9b20: 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
9b30: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
9b40: 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a  r large enough .
9b50: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ** to store the 
9b60: 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
9b70: 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73  on p, the copies
9b80: 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a   of p->u.zToken.
9b90: 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c  ** (if applicabl
9ba0: 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69  e), and the copi
9bb0: 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65  es of the p->pLe
9bc0: 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74  ft and p->pRight
9bd0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
9be0: 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20   if any. Before 
9bf0: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75  returning, *pzBu
9c00: 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74  ffer is set to t
9c10: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
9c20: 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f  st the.** portio
9c30: 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  n of the buffer 
9c40: 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74  copied into by t
9c50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
9c60: 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78  .static Expr *ex
9c70: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
9c80: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
9c90: 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70  dupFlags, u8 **p
9ca0: 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72  zBuffer){.  Expr
9cb0: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
9cc0: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
9cd0: 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41  turn */.  u8 *zA
9ce0: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
9cf0: 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20  /* Memory space 
9d00: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62 75  from which to bu
9d10: 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20  ild Expr object 
9d20: 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63 46  */.  u32 staticF
9d30: 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45 50  lag;       /* EP
9d40: 5f 53 74 61 74 69 63 20 69 66 20 73 70 61 63 65  _Static if space
9d50: 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66 72   not obtained fr
9d60: 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20  om malloc */..  
9d70: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
9d80: 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a  .  assert( p );.
9d90: 20 20 61 73 73 65 72 74 28 20 64 75 70 46 6c 61    assert( dupFla
9da0: 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67  gs==0 || dupFlag
9db0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
9dc0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
9dd0: 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75  zBuffer==0 || du
9de0: 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f  pFlags==EXPRDUP_
9df0: 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20  REDUCE );..  /* 
9e00: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
9e10: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
9e20: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
9e30: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75 66  . */.  if( pzBuf
9e40: 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f  fer ){.    zAllo
9e50: 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20  c = *pzBuffer;. 
9e60: 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20     staticFlag = 
9e70: 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c  EP_Static;.  }el
9e80: 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  se{.    zAlloc =
9e90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
9ea0: 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64 45  RawNN(db, dupedE
9eb0: 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  xprSize(p, dupFl
9ec0: 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74 69  ags));.    stati
9ed0: 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  cFlag = 0;.  }. 
9ee0: 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29   pNew = (Expr *)
9ef0: 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70  zAlloc;..  if( p
9f00: 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  New ){.    /* Se
9f10: 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68  t nNewSize to th
9f20: 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64  e size allocated
9f30: 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
9f40: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20  re pointed to.  
9f50: 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68    ** by pNew. Th
9f60: 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58 50  is is either EXP
9f70: 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52  R_FULLSIZE, EXPR
9f80: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a  _REDUCEDSIZE or.
9f90: 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45      ** EXPR_TOKE
9fa0: 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65  NONLYSIZE. nToke
9fb0: 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
9fc0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9fd0: 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20  consumed.    ** 
9fe0: 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  by the copy of t
9ff0: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
a000: 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a  tring (if any)..
a010: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74      */.    const
a020: 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63   unsigned nStruc
a030: 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70  tSize = dupedExp
a040: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 64  rStructSize(p, d
a050: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f  upFlags);.    co
a060: 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65  nst int nNewSize
a070: 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26   = nStructSize &
a080: 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74 20   0xfff;.    int 
a090: 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20  nToken;.    if( 
a0a0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a0b0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
a0c0: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
a0d0: 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  ){.      nToken 
a0e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
a0f0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b  0(p->u.zToken) +
a100: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
a110: 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b       nToken = 0;
a120: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
a130: 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  upFlags ){.     
a140: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
a150: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
a160: 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
a170: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
a180: 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b  c, p, nNewSize);
a190: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a1a0: 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28 75    u32 nSize = (u
a1b0: 33 32 29 65 78 70 72 53 74 72 75 63 74 53 69 7a  32)exprStructSiz
a1c0: 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  e(p);.      memc
a1d0: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53  py(zAlloc, p, nS
a1e0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
a1f0: 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53  nSize<EXPR_FULLS
a200: 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20  IZE ){ .        
a210: 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e  memset(&zAlloc[n
a220: 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46  Size], 0, EXPR_F
a230: 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a  ULLSIZE-nSize);.
a240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
a250: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50     /* Set the EP
a260: 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b  _Reduced, EP_Tok
a270: 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53  enOnly, and EP_S
a280: 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72  tatic flags appr
a290: 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  opriately. */.  
a2a0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d    pNew->flags &=
a2b0: 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50   ~(EP_Reduced|EP
a2c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74  _TokenOnly|EP_St
a2d0: 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e  atic|EP_MemToken
a2e0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  );.    pNew->fla
a2f0: 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a  gs |= nStructSiz
a300: 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  e & (EP_Reduced|
a310: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20  EP_TokenOnly);. 
a320: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
a330: 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20  = staticFlag;.. 
a340: 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70     /* Copy the p
a350: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
a360: 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  g, if any. */.  
a370: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a    if( nToken ){.
a380: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b        char *zTok
a390: 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f  en = pNew->u.zTo
a3a0: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41  ken = (char*)&zA
a3b0: 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a  lloc[nNewSize];.
a3c0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f        memcpy(zTo
a3d0: 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken, p->u.zToken
a3e0: 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d  , nToken);.    }
a3f0: 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70  ..    if( 0==((p
a400: 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c  ->flags|pNew->fl
a410: 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e  ags) & (EP_Token
a420: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20 29  Only|EP_Leaf)) )
a430: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20  {.      /* Fill 
a440: 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70  in the pNew->x.p
a450: 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e  Select or pNew->
a460: 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20  x.pList member. 
a470: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  */.      if( Exp
a480: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a490: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
a4a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
a4b0: 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  .pSelect = sqlit
a4c0: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
a4d0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75  p->x.pSelect, du
a4e0: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d  pFlags);.      }
a4f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
a500: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
a510: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a520: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
a530: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a540: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
a550: 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e  * Fill in pNew->
a560: 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e  pLeft and pNew->
a570: 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69  pRight. */.    i
a580: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a590: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
a5a0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
a5b0: 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  ) ){.      zAllo
a5c0: 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  c += dupedExprNo
a5d0: 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  deSize(p, dupFla
a5e0: 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gs);.      if( !
a5f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a600: 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  pNew, EP_TokenOn
a610: 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20  ly|EP_Leaf) ){. 
a620: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
a630: 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a  ft = p->pLeft ?.
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62        exprDup(db
a660: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
a670: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
a680: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
a690: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
a6a0: 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20 20   p->pRight ?.   
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20      exprDup(db, 
a6d0: 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44  p->pRight, EXPRD
a6e0: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
a6f0: 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d  oc) : 0;.      }
a700: 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66  .      if( pzBuf
a710: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  fer ){.        *
a720: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
a730: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
a740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
a750: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a760: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
a770: 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20  |EP_Leaf) ){.   
a780: 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f       if( pNew->o
a790: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
a7a0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
a7b0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
a7c0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
a7d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43     assert( p->iC
a7e0: 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70  olumn==0 || p->p
a7f0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
a800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a810: 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70  >pRight==0  || p
a820: 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65  ->pRight==p->pLe
a830: 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ft );.        }e
a840: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
a850: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  New->pLeft = sql
a860: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
a870: 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  p->pLeft, 0);.  
a880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a890: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73  pNew->pRight = s
a8a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a8b0: 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b  , p->pRight, 0);
a8c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a8d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
a8e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
a8f0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  e and return a d
a900: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
a910: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
a920: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
a930: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20  argument. If an 
a940: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
a950: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55   encountered, NU
a960: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  LL is returned.*
a970: 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61  * and the db->ma
a980: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
a990: 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  set..*/.#ifndef 
a9a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
a9b0: 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74  static With *wit
a9c0: 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  hDup(sqlite3 *db
a9d0: 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69  , With *p){.  Wi
a9e0: 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  th *pRet = 0;.  
a9f0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
aa00: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
aa10: 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e  *p) + sizeof(p->
aa20: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65  a[0]) * (p->nCte
aa30: 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  -1);.    pRet = 
aa40: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
aa50: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
aa60: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
aa70: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
aa80: 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20     pRet->nCte = 
aa90: 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66  p->nCte;.      f
aaa0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
aab0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
aac0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pRet->a[i].pSel
aad0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
aae0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  ectDup(db, p->a[
aaf0: 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  i].pSelect, 0);.
ab00: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
ab10: 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74  i].pCols = sqlit
ab20: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
ab30: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c  , p->a[i].pCols,
ab40: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
ab50: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
ab60: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ab70: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  db, p->a[i].zNam
ab80: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
ab90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
aba0: 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Ret;.}.#else.# d
abb0: 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c  efine withDup(x,
abc0: 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y) 0.#endif../*.
abd0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
abe0: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
abf0: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
ac00: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
ac10: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
ac20: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
ac30: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
ac40: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
ac50: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
ac60: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
ac70: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
ac80: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
ac90: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
aca0: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
acb0: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
acc0: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
acd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
ace0: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
acf0: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
ad00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ad10: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
ad20: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
ad30: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
ad40: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
ad50: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
ad60: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
ad70: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
ad80: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
ad90: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
ada0: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
adb0: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
adc0: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
add0: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
ade0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
adf0: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
ae00: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
ae10: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
ae20: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
ae30: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
ae40: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
ae50: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
ae60: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
ae70: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
ae80: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
ae90: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
aea0: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
aeb0: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
aec0: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
aed0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
aee0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
aef0: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
af00: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
af10: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
af20: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
af30: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  s){.  assert( fl
af40: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
af50: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
af60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20  );.  return p ? 
af70: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66  exprDup(db, p, f
af80: 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a  lags, 0) : 0;.}.
af90: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
afa0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
afb0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
afc0: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
afd0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
afe0: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
aff0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
b000: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
b010: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
b020: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20  pPriorSelectCol 
b030: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64  = 0;.  assert( d
b040: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b050: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b060: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
b070: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
b080: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b090: 53 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20 20  Size(db, p));.  
b0a0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
b0b0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
b0c0: 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72  nExpr = p->nExpr
b0d0: 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e 65 77  ;.  pItem = pNew
b0e0: 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d 20  ->a;.  pOldItem 
b0f0: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
b100: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
b110: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
b120: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
b130: 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70  pr *pOldExpr = p
b140: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  OldItem->pExpr;.
b150: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b160: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
b170: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
b180: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
b190: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
b1a0: 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20  if( pOldExpr .  
b1b0: 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e     && pOldExpr->
b1c0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
b1d0: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e  LUMN.     && (pN
b1e0: 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  ewExpr = pItem->
b1f0: 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29  pExpr)!=0 .    )
b200: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b210: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
b220: 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20  n==0 || i>0 );. 
b230: 20 20 20 20 20 69 66 28 20 70 4e 65 77 45 78 70       if( pNewExp
b240: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
b250: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b260: 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74   pOldExpr->pLeft
b270: 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67  ==pOldExpr->pRig
b280: 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ht );.        pP
b290: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20  riorSelectCol = 
b2a0: 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20  pNewExpr->pLeft 
b2b0: 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67  = pNewExpr->pRig
b2c0: 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ht;.      }else{
b2d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b2e0: 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20   i>0 );.        
b2f0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31  assert( pItem[-1
b300: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
b310: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
b320: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
b330: 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72  =pItem[-1].pExpr
b340: 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20  ->iColumn+1 );. 
b350: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b360: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d  PriorSelectCol==
b370: 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d  pItem[-1].pExpr-
b380: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
b390: 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66    pNewExpr->pLef
b3a0: 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74  t = pPriorSelect
b3b0: 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
b3c0: 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e   }.    pItem->zN
b3d0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
b3e0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b3f0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
b400: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
b410: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b420: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70  b, pOldItem->zSp
b430: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
b440: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
b450: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
b460: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
b470: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d   = 0;.    pItem-
b480: 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f  >bSpanIsTab = pO
b490: 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54  ldItem->bSpanIsT
b4a0: 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75  ab;.    pItem->u
b4b0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a   = pOldItem->u;.
b4c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
b4d0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
b4e0: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
b4f0: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
b500: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
b510: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
b520: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
b530: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
b540: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
b550: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
b560: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
b570: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
b580: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b590: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
b5a0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
b5b0: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
b5c0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
b5d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
b5e0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
b5f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
b600: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
b610: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
b620: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
b630: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
b640: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b650: 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74   SrcList *p, int
b660: 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69   flags){.  SrcLi
b670: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
b680: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
b690: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
b6a0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
b6b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74  return 0;.  nByt
b6c0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
b6d0: 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69   (p->nSrc>0 ? si
b6e0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
b6f0: 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29  (p->nSrc-1) : 0)
b700: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
b710: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
b720: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
b730: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
b740: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
b750: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
b760: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
b770: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
b780: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
b790: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
b7a0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
b7b0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
b7c0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
b7d0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
b7e0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
b7f0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
b800: 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20  ewItem->pSchema 
b810: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68  = pOldItem->pSch
b820: 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ema;.    pNewIte
b830: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
b840: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b850: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
b860: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
b870: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
b880: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b890: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
b8a0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
b8b0: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
b8c0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b8d0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
b8e0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b8f0: 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  >fg = pOldItem->
b900: 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  fg;.    pNewItem
b910: 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64  ->iCursor = pOld
b920: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
b930: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64     pNewItem->add
b940: 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49  rFillSub = pOldI
b950: 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
b960: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b970: 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64  regReturn = pOld
b980: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
b990: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65  .    if( pNewIte
b9a0: 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
b9b0: 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49  y ){.      pNewI
b9c0: 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
b9d0: 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  By = sqlite3DbSt
b9e0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b9f0: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
ba00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
ba10: 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20  wItem->pIBIndex 
ba20: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49  = pOldItem->pIBI
ba30: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e  ndex;.    if( pN
ba40: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62  ewItem->fg.isTab
ba50: 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e  Func ){.      pN
ba60: 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ewItem->u1.pFunc
ba70: 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20  Arg = .         
ba80: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ba90: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
baa0: 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66  ->u1.pFuncArg, f
bab0: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lags);.    }.   
bac0: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
bad0: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
bae0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
baf0: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
bb00: 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
bb10: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
bb20: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
bb30: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
bb40: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  b, pOldItem->pSe
bb50: 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  lect, flags);.  
bb60: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20    pNewItem->pOn 
bb70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
bb80: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
bb90: 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  On, flags);.    
bba0: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
bbb0: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
bbc0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bbd0: 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70  ->pUsing);.    p
bbe0: 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  NewItem->colUsed
bbf0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c   = pOldItem->col
bc00: 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Used;.  }.  retu
bc10: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
bc20: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
bc30: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
bc40: 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49   IdList *p){.  I
bc50: 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  dList *pNew;.  i
bc60: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
bc70: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
bc80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bc90: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
bca0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
bcb0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
bcc0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
bcd0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
bce0: 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49  New->nId = p->nI
bcf0: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
bd00: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
bd10: 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73  wNN(db, p->nId*s
bd20: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
bd30: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
bd40: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
bd50: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e  3DbFreeNN(db, pN
bd60: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
bd70: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65  0;.  }.  /* Note
bd80: 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68   that because th
bd90: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c  e size of the al
bda0: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e  location for p->
bdb0: 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  a[] is not.  ** 
bdc0: 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f  necessarily a po
bdd0: 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69  wer of two, sqli
bde0: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
bdf0: 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c  ) may not be cal
be00: 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  led.  ** on the 
be10: 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65  duplicate create
be20: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
be30: 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  on. */.  for(i=0
be40: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
be50: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
be60: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
be70: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
be80: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
be90: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
bea0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
beb0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
bec0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
bed0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
bee0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
bef0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
bf00: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
bf10: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
bf20: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
bf30: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
bf40: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
bf50: 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73  *pDup, int flags
bf60: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65  ){.  Select *pRe
bf70: 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20  t = 0;.  Select 
bf80: 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65  *pNext = 0;.  Se
bf90: 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65  lect **pp = &pRe
bfa0: 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a  t;.  Select *p;.
bfb0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
bfc0: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70   );.  for(p=pDup
bfd0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72  ; p; p=p->pPrior
bfe0: 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
bff0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
c000: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
c010: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20  izeof(*p) );.   
c020: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62   if( pNew==0 ) b
c030: 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  reak;.    pNew->
c040: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
c050: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
c060: 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73  p->pEList, flags
c070: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72  );.    pNew->pSr
c080: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
c090: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
c0a0: 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  c, flags);.    p
c0b0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
c0c0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c0d0: 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67   p->pWhere, flag
c0e0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47  s);.    pNew->pG
c0f0: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
c100: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
c110: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
c120: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c130: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
c140: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
c150: 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a  Having, flags);.
c160: 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72      pNew->pOrder
c170: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
c180: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
c190: 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b  OrderBy, flags);
c1a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  .    pNew->op = 
c1b0: 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  p->op;.    pNew-
c1c0: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a  >pNext = pNext;.
c1d0: 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
c1e0: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
c1f0: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
c200: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
c210: 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Limit, flags);. 
c220: 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20     pNew->iLimit 
c230: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
c240: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
c250: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
c260: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e   p->selFlags & ~
c270: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
c280: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
c290: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
c2a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
c2b0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
c2c0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c  ;.    pNew->nSel
c2d0: 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c  ectRow = p->nSel
c2e0: 65 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77  ectRow;.    pNew
c2f0: 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75  ->pWith = withDu
c300: 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  p(db, p->pWith);
c310: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
c320: 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
c330: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20  p->zSelName);.  
c340: 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20    *pp = pNew;.  
c350: 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50    pp = &pNew->pP
c360: 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20  rior;.    pNext 
c370: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72  = pNew;.  }..  r
c380: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
c390: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
c3a0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
c3b0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
c3c0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
c3d0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
c3e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
c3f0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
c400: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
c410: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
c420: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
c430: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
c440: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
c450: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
c460: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
c470: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   list..**.** The
c480: 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20   pList argument 
c490: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
c4a0: 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  ULL or a pointer
c4b0: 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a   to an ExprList.
c4c0: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
c4d0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
c4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c4f0: 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20  Append().  This 
c500: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e  routine.** may n
c510: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
c520: 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61  an ExprList obta
c530: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
c540: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a  3ExprListDup()..
c550: 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73  ** Reason:  This
c560: 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
c570: 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
c580: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69   of slots in pLi
c590: 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20  st->a[].** is a 
c5a0: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54  power of two.  T
c5b0: 68 61 74 20 69 73 20 74 72 75 65 20 66 6f 72 20  hat is true for 
c5c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
c5d0: 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a  ppend() returns.
c5e0: 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65  ** but is not ne
c5f0: 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 66  cessarily true f
c600: 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76  rom the return v
c610: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45  alue of sqlite3E
c620: 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a  xprListDup()..**
c630: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
c640: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
c650: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74   occurs, the ent
c660: 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65  ire list is free
c670: 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73  d and.** NULL is
c680: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e   returned.  If n
c690: 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  on-NULL is retur
c6a0: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
c6b0: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68  guaranteed.** th
c6c0: 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  at the new entry
c6d0: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
c6e0: 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45  y appended..*/.E
c6f0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
c700: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a  ExprListAppend(.
c710: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
c730: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c740: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
c750: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
c760: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
c770: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
c780: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
c790: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
c7a0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
c7b0: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
c7c0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c7d0: 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
c7e0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
c7f0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
c800: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c810: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
c820: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
c830: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
c840: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c850: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  wNN(db, sizeof(E
c860: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
c870: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
c880: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
c890: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
c8a0: 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20  st->nExpr = 0;. 
c8b0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73   }else if( (pLis
c8c0: 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73  t->nExpr & (pLis
c8d0: 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20  t->nExpr-1))==0 
c8e0: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
c8f0: 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20  *pNew;.    pNew 
c900: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
c910: 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20  oc(db, pList, . 
c920: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
c930: 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c  of(*pList)+(2*pL
c940: 69 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a  ist->nExpr - 1)*
c950: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
c960: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  0]));.    if( pN
c970: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  ew==0 ){.      g
c980: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
c990: 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  }.    pList = pN
c9a0: 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  ew;.  }.  pItem 
c9b0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
c9c0: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61  t->nExpr++];.  a
c9d0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
c9e0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
c9f0: 69 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a  item,zName)==siz
ca00: 65 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  eof(pItem->pExpr
ca10: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ) );.  assert( o
ca20: 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45  ffsetof(struct E
ca30: 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78  xprList_item,pEx
ca40: 70 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  pr)==0 );.  mems
ca50: 65 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  et(&pItem->zName
ca60: 2c 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  ,0,sizeof(*pItem
ca70: 29 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63  )-offsetof(struc
ca80: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c  t ExprList_item,
ca90: 7a 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d  zName));.  pItem
caa0: 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
cab0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
cac0: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
cad0: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
cae0: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
caf0: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
cb00: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
cb10: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
cb20: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
cb30: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
cb40: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
cb50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75  ;.}../*.** pColu
cb60: 6d 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f  mns and pExpr fo
cb70: 72 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69  rm a vector assi
cb80: 67 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gnment which is 
cb90: 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a  part of the SET.
cba0: 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20  ** clause of an 
cbb0: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
cbc0: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
cbd0: 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c  .**        (a,b,
cbe0: 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72  c) = (expr1,expr
cbf0: 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20  2,expr3).** Or: 
cc00: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45     (a,b,c) = (SE
cc10: 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20  LECT x,y,z FROM 
cc20: 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ....).**.** For 
cc30: 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
cc40: 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65   vector assignme
cc50: 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65  nt, append new e
cc60: 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a  ntries to the.**
cc70: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
cc80: 20 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20   pList.  In the 
cc90: 63 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65  case of a subque
cca0: 72 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61  ry on the RHS, a
ccb0: 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45  ppend.** TK_SELE
ccc0: 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73  CT_COLUMN expres
ccd0: 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69  sions..*/.ExprLi
cce0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
ccf0: 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28  istAppendVector(
cd00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cd10: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
cd20: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
cd30: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
cd40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
cd50: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
cd60: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
cd70: 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  LL */.  IdList *
cd80: 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f  pColumns,      /
cd90: 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  * List of names 
cda0: 6f 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73  of LHS of the as
cdb0: 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  signment */.  Ex
cdc0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
cdd0: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65       /* Vector e
cde0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
cdf0: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
ce00: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
ce10: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ce20: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
ce30: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
ce40: 74 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74  t iFirst = pList
ce50: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
ce60: 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d  : 0;.  /* pColum
ce70: 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e  ns can only be N
ce80: 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f  ULL due to an OO
ce90: 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c  M but an OOM wil
cea0: 6c 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20  l cause an.  ** 
ceb0: 65 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68  exit prior to th
cec0: 69 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67  is routine being
ced0: 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66   invoked */.  if
cee0: 28 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73  ( NEVER(pColumns
cef0: 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74  ==0) ) goto vect
cf00: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
cf10: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
cf20: 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70  ) goto vector_ap
cf30: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f  pend_error;..  /
cf40: 2a 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20  * If the RHS is 
cf50: 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77  a vector, then w
cf60: 65 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c  e can immediatel
cf70: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  y check to see t
cf80: 68 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69  hat .  ** the si
cf90: 7a 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e  ze of the RHS an
cfa0: 64 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75  d LHS match.  Bu
cfb0: 74 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  t if the RHS is 
cfc0: 61 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20  a SELECT, .  ** 
cfd0: 77 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20  wildcards ("*") 
cfe0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
cff0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
d000: 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
d010: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20   before.  ** we 
d020: 63 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20  can do the size 
d030: 63 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20  check, so defer 
d040: 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75  the size check u
d050: 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
d060: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
d070: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53   pExpr->op!=TK_S
d080: 45 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e  ELECT && pColumn
d090: 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74  s->nId!=(n=sqlit
d0a0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
d0b0: 28 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20  (pExpr)) ){.    
d0c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d0d0: 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
d0e0: 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
d0f0: 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
d110: 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a  lumns->nId, n);.
d120: 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f      goto vector_
d130: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20  append_error;.  
d140: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
d150: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69  pColumns->nId; i
d160: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d170: 53 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65  SubExpr = sqlite
d180: 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69  3ExprForVectorFi
d190: 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70  eld(pParse, pExp
d1a0: 72 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74  r, i);.    pList
d1b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
d1c0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
d1d0: 20 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72   pList, pSubExpr
d1e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
d1f0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
d200: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
d210: 69 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20  iFirst+i+1 );.  
d220: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69      pList->a[pLi
d230: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  st->nExpr-1].zNa
d240: 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61  me = pColumns->a
d250: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
d260: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e   pColumns->a[i].
d270: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  zName = 0;.    }
d280: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d  .  }..  if( !db-
d290: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
d2a0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
d2b0: 45 4c 45 43 54 20 26 26 20 41 4c 57 41 59 53 28  ELECT && ALWAYS(
d2c0: 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  pList!=0) ){.   
d2d0: 20 45 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20   Expr *pFirst = 
d2e0: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d  pList->a[iFirst]
d2f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
d300: 72 74 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b  rt( pFirst!=0 );
d310: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
d320: 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  rst->op==TK_SELE
d330: 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  CT_COLUMN );.   
d340: 20 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20    .    /* Store 
d350: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
d360: 6d 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73  ment in pRight s
d370: 6f 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c  o it will be del
d380: 65 74 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a  eted when.    **
d390: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d3a0: 44 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c  Delete() is call
d3b0: 65 64 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74  ed */.    pFirst
d3c0: 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  ->pRight = pExpr
d3d0: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b  ;.    pExpr = 0;
d3e0: 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65  ..    /* Remembe
d3f0: 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
d400: 65 20 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20  e LHS in iTable 
d410: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63  so that we can c
d420: 68 65 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a  heck that.    **
d430: 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53   the RHS and LHS
d440: 20 73 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72   sizes match dur
d450: 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ing code generat
d460: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72  ion. */.    pFir
d470: 73 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f  st->iTable = pCo
d480: 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a  lumns->nId;.  }.
d490: 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65  .vector_append_e
d4a0: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45  rror:.  sqlite3E
d4b0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
d4c0: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  xpr);.  sqlite3I
d4d0: 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
d4e0: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74  pColumns);.  ret
d4f0: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
d500: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74  .** Set the sort
d510: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c   order for the l
d520: 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74  ast element on t
d530: 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73  he given ExprLis
d540: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d550: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72  e3ExprListSetSor
d560: 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74 20  tOrder(ExprList 
d570: 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64  *p, int iSortOrd
d580: 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  er){.  if( p==0 
d590: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
d5a0: 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e  rt( SQLITE_SO_UN
d5b0: 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c  DEFINED<0 && SQL
d5c0: 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26  ITE_SO_ASC>=0 &&
d5d0: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e   SQLITE_SO_DESC>
d5e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
d5f0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69  ->nExpr>0 );.  i
d600: 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20  f( iSortOrder<0 
d610: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d620: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
d630: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
d640: 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20  E_SO_ASC );.    
d650: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d  return;.  }.  p-
d660: 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73  >a[p->nExpr-1].s
d670: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69  ortOrder = (u8)i
d680: 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a  SortOrder;.}../*
d690: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
d6a0: 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65  List.a[].zName e
d6b0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
d6c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
d6d0: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
d6e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d6f0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
d700: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
d710: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
d720: 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73  or.  But pName s
d730: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
d740: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
d750: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
d760: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
d770: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
d780: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
d790: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
d7a0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
d7b0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
d7c0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
d7d0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d7e0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d7f0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
d800: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
d810: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
d820: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
d830: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
d840: 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64  Name to be added
d850: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
d860: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
d870: 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74   True to cause t
d880: 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65  he name to be de
d890: 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  quoted */.){.  a
d8a0: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
d8b0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
d8c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
d8d0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
d8e0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
d8f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
d900: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
d910: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
d920: 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69      pItem = &pLi
d930: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
d940: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
d950: 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d  t( pItem->zName=
d960: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
d970: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
d980: 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65  DbStrNDup(pParse
d990: 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ->db, pName->z, 
d9a0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
d9b0: 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c  f( dequote ) sql
d9c0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65  ite3Dequote(pIte
d9d0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d  m->zName);.  }.}
d9e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
d9f0: 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70  ExprList.a[].zSp
da00: 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  an element of th
da10: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
da20: 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e  added item.** on
da30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
da40: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  list..**.** pLis
da50: 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
da60: 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d  following an OOM
da70: 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70   error.  But pSp
da80: 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  an should never 
da90: 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20  be.** NULL.  If 
daa0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
dab0: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70  ion fails, the p
dac0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
dad0: 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20  cFailed flag.** 
dae0: 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  is set..*/.void 
daf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
db00: 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20  etSpan(.  Parse 
db10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
db20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
db30: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
db40: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
db50: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
db60: 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70  ch to add the sp
db70: 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  an. */.  const c
db80: 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20  har *zStart,    
db90: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65   /* Start of the
dba0: 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74   span */.  const
dbb0: 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 20   char *zEnd     
dbc0: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
dbd0: 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71   span */.){.  sq
dbe0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
dbf0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
dc00: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
dc10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
dc20: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
dc30: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
dc40: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
dc50: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
dc60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
dc70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
dc80: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
dc90: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
dca0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
dcb0: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  n);.    pItem->z
dcc0: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
dcd0: 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61  SpanDup(db, zSta
dce0: 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a 7d  rt, zEnd);.  }.}
dcf0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
dd00: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
dd10: 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d  EList contains m
dd20: 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20  ore than iLimit 
dd30: 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61  elements,.** lea
dd40: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
dd50: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
dd60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
dd70: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
dd80: 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  h(.  Parse *pPar
dd90: 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
dda0: 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20  pEList,.  const 
ddb0: 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b  char *zObject.){
ddc0: 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72  .  int mx = pPar
ddd0: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
dde0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
ddf0: 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  MN];.  testcase(
de00: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
de10: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a  t->nExpr==mx );.
de20: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
de30: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
de40: 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69  xpr==mx+1 );.  i
de50: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
de60: 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b  ist->nExpr>mx ){
de70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
de80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
de90: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
dea0: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
deb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
dec0: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65  lete an entire e
ded0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
dee0: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
def0: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65  _NOINLINE void e
df00: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
df10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
df20: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
df30: 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e   int i = pList->
df40: 6e 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20  nExpr;.  struct 
df50: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
df60: 49 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61  Item =  pList->a
df70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
df80: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
df90: 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  do{.    sqlite3E
dfa0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
dfb0: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
dfc0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
dfd0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
dfe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
dff0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e000: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
e010: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d  ++;.  }while( --
e020: 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  i>0 );.  sqlite3
e030: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
e040: 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  st);.}.void sqli
e050: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
e060: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
e070: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
e080: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 65  .  if( pList ) e
e090: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
e0a0: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
e0b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
e0c0: 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c  bitwise-OR of al
e0d0: 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65  l Expr.flags fie
e0e0: 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e  lds in the given
e0f0: 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f  .** ExprList..*/
e100: 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70 72  .u32 sqlite3Expr
e110: 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20  ListFlags(const 
e120: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
e130: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32  {.  int i;.  u32
e140: 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74   m = 0;.  assert
e150: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
e160: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
e170: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
e180: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
e190: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
e1a0: 78 70 72 3b 0a 20 20 20 20 20 61 73 73 65 72 74  xpr;.     assert
e1b0: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
e1c0: 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66     m |= pExpr->f
e1d0: 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75  lags;.  }.  retu
e1e0: 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn m;.}../*.** T
e1f0: 68 69 73 20 69 73 20 61 20 53 45 4c 45 43 54 2d  his is a SELECT-
e200: 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f  node callback fo
e210: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
e220: 20 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20   walker that.** 
e230: 61 6c 77 61 79 73 20 22 66 61 69 6c 73 22 2e 20  always "fails". 
e240: 20 42 79 20 22 66 61 69 6c 22 20 69 6e 20 74 68   By "fail" in th
e250: 69 73 20 63 61 73 65 2c 20 77 65 20 6d 65 61 6e  is case, we mean
e260: 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d   set.** pWalker-
e270: 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61  >eCode to zero a
e280: 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20  nd abort..**.** 
e290: 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73  This callback is
e2a0: 20 75 73 65 64 20 62 79 20 6d 75 6c 74 69 70 6c   used by multipl
e2b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c  e expression wal
e2c0: 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  kers..*/.int sql
e2d0: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
e2e0: 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  il(Walker *pWalk
e2f0: 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  er, Select *NotU
e300: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
e310: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
e320: 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  );.  pWalker->eC
e330: 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ode = 0;.  retur
e340: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a  n WRC_Abort;.}..
e350: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
e360: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ut expression is
e370: 20 61 6e 20 49 44 20 77 69 74 68 20 74 68 65 20   an ID with the 
e380: 6e 61 6d 65 20 22 74 72 75 65 22 20 6f 72 20 22  name "true" or "
e390: 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65 6e 20 63  false".** then c
e3a0: 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61  onvert it into a
e3b0: 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 74  n TK_TRUEFALSE t
e3c0: 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  erm.  Return non
e3d0: 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74 68 65 20  -zero if.** the 
e3e0: 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61 70 70 65  conversion happe
e3f0: 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f 20 69 66  ned, and zero if
e400: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e410: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 0a 2a 2f  is unaltered..*/
e420: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
e430: 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 45 78  IdToTrueFalse(Ex
e440: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73  pr *pExpr){.  as
e450: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
e460: 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78 70 72 2d  =TK_ID || pExpr-
e470: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op==TK_STRING )
e480: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
e490: 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
e4a0: 7a 54 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d  zToken, "true")=
e4b0: 3d 30 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  =0.   || sqlite3
e4c0: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
e4d0: 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73 65 22  .zToken, "false"
e4e0: 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 45  )==0.  ){.    pE
e4f0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52 55  xpr->op = TK_TRU
e500: 45 46 41 4c 53 45 3b 0a 20 20 20 20 72 65 74 75  EFALSE;.    retu
e510: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
e520: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
e530: 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  he argument must
e540: 20 62 65 20 61 20 54 4b 5f 54 52 55 45 46 41 4c   be a TK_TRUEFAL
e550: 53 45 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 52  SE Expr node.  R
e560: 65 74 75 72 6e 20 31 20 69 66 20 69 74 20 69 73  eturn 1 if it is
e570: 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20 69   TRUE.** and 0 i
e580: 66 20 69 74 20 69 73 20 46 41 4c 53 45 2e 0a 2a  f it is FALSE..*
e590: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
e5a0: 72 54 72 75 74 68 56 61 6c 75 65 28 63 6f 6e 73  rTruthValue(cons
e5b0: 74 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  t Expr *pExpr){.
e5c0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
e5d0: 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53  >op==TK_TRUEFALS
e5e0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
e5f0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
e600: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74  xpr->u.zToken,"t
e610: 72 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 20 20  rue")==0.       
e620: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
e630: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
e640: 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30 20 29 3b  n,"false")==0 );
e650: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d  .  return pExpr-
e660: 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b  >u.zToken[4]==0;
e670: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  .}.../*.** These
e680: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
e690: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75  lker callbacks u
e6a0: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70  sed to check exp
e6b0: 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73  ressions to.** s
e6c0: 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22  ee if they are "
e6d0: 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f  constant" for so
e6e0: 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  me definition of
e6f0: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a   constant.  The.
e700: 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  ** Walker.eCode 
e710: 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73  value determines
e720: 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f   the type of "co
e730: 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c  nstant" we are l
e740: 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a  ooking.** for..*
e750: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
e760: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
e770: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
e780: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
e790: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
e7a0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
e7b0: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
e7c0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
e7d0: 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71  ode==1.**     sq
e7e0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
e7f0: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20  antNotJoin()    
e800: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
e810: 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20  eCode==2.**     
e820: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
e830: 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  leConstant()    
e840: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
e850: 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20  ->eCode==3.**   
e860: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
e870: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
e880: 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b  n()        pWalk
e890: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
e8a0: 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63  5.**.** In all c
e8b0: 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61  ases, the callba
e8c0: 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65  cks set Walker.e
e8d0: 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74  Code=0 and abort
e8e0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
e8f0: 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74  on.** is found t
e900: 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74  o not be a const
e910: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ant..**.** The s
e920: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
e930: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
e940: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61   is used for eva
e950: 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69  luating expressi
e960: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ons.** in a CREA
e970: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
e980: 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e  nt.  The Walker.
e990: 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35  eCode value is 5
e9a0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
e9b0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
e9c0: 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70  ema and 4 when p
e9d0: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
e9e0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
e9f0: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
ea00: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
ea10: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
ea20: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
ea30: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
ea40: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
ea50: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
ea60: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
ea70: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
ea80: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
ea90: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
eaa0: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
eab0: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
eac0: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
ead0: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
eae0: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
eaf0: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
eb00: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
eb10: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
eb20: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
eb30: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
eb40: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
eb50: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
eb60: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
eb70: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
eb80: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73  Walker->eCode is
eb90: 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   2 then any term
eba0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
ebb0: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
ebc0: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
ebd0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
ebe0: 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64  of a left join d
ebf0: 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20  isqualifies the 
ec00: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
ec10: 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69  from being consi
ec20: 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20  dered constant. 
ec30: 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  */.  if( pWalker
ec40: 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78  ->eCode==2 && Ex
ec50: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
ec60: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
ec70: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
ec80: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
ec90: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
eca0: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
ecb0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
ecc0: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
ecd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
ece0: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
ecf0: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
ed00: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
ed10: 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57  ** and either pW
ed20: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
ed30: 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63  or 5 or the func
ed40: 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20  tion has the.   
ed50: 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ** SQLITE_FUNC_
ed60: 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20  CONST flag. */. 
ed70: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
ed80: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
ed90: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34  Walker->eCode>=4
eda0: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
edb0: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
edc0: 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  stFunc) ){.     
edd0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
ede0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
edf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61  lse{.        pWa
ee00: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
ee10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ee20: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
ee30: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
ee40: 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  D:.      /* Conv
ee50: 65 72 74 20 22 74 72 75 65 22 20 6f 72 20 22 66  ert "true" or "f
ee60: 61 6c 73 65 22 20 69 6e 20 61 20 44 45 46 41 55  alse" in a DEFAU
ee70: 4c 54 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 74  LT clause into t
ee80: 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 70 70 72  he.      ** appr
ee90: 6f 70 72 69 61 74 65 20 54 4b 5f 54 52 55 45 46  opriate TK_TRUEF
eea0: 41 4c 53 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ALSE operator */
eeb0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
eec0: 65 33 45 78 70 72 49 64 54 6f 54 72 75 65 46 61  e3ExprIdToTrueFa
eed0: 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
eee0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
eef0: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
ef00: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
ef10: 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
ef20: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
ef30: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
ef40: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
ef50: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
ef60: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
ef70: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
ef80: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ef90: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
efa0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
efb0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
efc0: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
efd0: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
efe0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
eff0: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
f000: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  ;.      if( pWal
f010: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26  ker->eCode==3 &&
f020: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
f030: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20  pWalker->u.iCur 
f040: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f050: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
f060: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
f070: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
f080: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f  .    case TK_IF_
f090: 4e 55 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 20 20  NULL_ROW:.      
f0a0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
f0b0: 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  >op==TK_IF_NULL_
f0c0: 52 4f 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61  ROW );.      pWa
f0d0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
f0e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
f0f0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73  C_Abort;.    cas
f100: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
f110: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
f120: 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20  ->eCode==5 ){.  
f130: 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c        /* Silentl
f140: 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20  y convert bound 
f150: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
f160: 61 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66  appear inside of
f170: 20 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20   CREATE.        
f180: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ** statements in
f190: 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70  to a NULL when p
f1a0: 61 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54  arsing the CREAT
f1b0: 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74  E statement text
f1c0: 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   out.        ** 
f1d0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  of the sqlite_ma
f1e0: 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
f1f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
f200: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  = TK_NULL;.     
f210: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b   }else if( pWalk
f220: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a  er->eCode==4 ){.
f230: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75          /* A bou
f240: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20  nd parameter in 
f250: 61 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  a CREATE stateme
f260: 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  nt that originat
f270: 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20  es from.        
f280: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
f290: 72 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65  re() causes an e
f2a0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
f2b0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
f2c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
f2d0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
f2e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
f2f0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
f300: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
f310: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
f320: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
f330: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65   ); /* sqlite3Se
f340: 6c 65 63 74 57 61 6c 6b 46 61 69 6c 20 77 69 6c  lectWalkFail wil
f350: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
f360: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
f370: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
f380: 54 53 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33  TS ); /* sqlite3
f390: 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 20 77  SelectWalkFail w
f3a0: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
f3b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f3c0: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
f3d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
f3e0: 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
f3f0: 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69   int initFlag, i
f400: 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b  nt iCur){.  Walk
f410: 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
f420: 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e  = initFlag;.  w.
f430: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
f440: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
f450: 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  nt;.  w.xSelectC
f460: 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
f470: 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b  3SelectWalkFail;
f480: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
f490: 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74  EBUG.  w.xSelect
f4a0: 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69  Callback2 = sqli
f4b0: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73  te3SelectWalkAss
f4c0: 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 77  ert2;.#endif.  w
f4d0: 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  .u.iCur = iCur;.
f4e0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
f4f0: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
f500: 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
f510: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
f520: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
f530: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
f540: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
f550: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
f560: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
f570: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
f580: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
f590: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
f5a0: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
f5b0: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
f5c0: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
f5d0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
f5e0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
f5f0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
f600: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
f610: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
f620: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
f630: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
f640: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
f650: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
f660: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
f670: 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 1, 0);.}../*.*
f680: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
f690: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
f6a0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
f6b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f6c0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
f6d0: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
f6e0: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
f6f0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
f700: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
f710: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
f720: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
f730: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
f740: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
f750: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
f760: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
f770: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
f780: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
f790: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
f7a0: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
f7b0: 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
f7c0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
f7d0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
f7e0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
f7f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
f800: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
f810: 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  any single row o
f820: 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
f830: 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49   cursor iCur.  I
f840: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
f850: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
f860: 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20   must not refer 
f870: 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72  to any non-deter
f880: 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
f890: 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62  n nor any.** tab
f8a0: 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43  le other than iC
f8b0: 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
f8c0: 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
f8d0: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69  stant(Expr *p, i
f8e0: 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75  nt iCur){.  retu
f8f0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
f900: 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a  , 3, iCur);.}...
f910: 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c  /*.** sqlite3Wal
f920: 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b  kExpr() callback
f930: 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
f940: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
f950: 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74  GroupBy()..*/.st
f960: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
f970: 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  eIsConstantOrGro
f980: 75 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  upBy(Walker *pWa
f990: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
f9a0: 72 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  r){.  ExprList *
f9b0: 70 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b  pGroupBy = pWalk
f9c0: 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a  er->u.pGroupBy;.
f9d0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43    int i;..  /* C
f9e0: 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73  heck if pExpr is
f9f0: 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e   identical to an
fa00: 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e  y GROUP BY term.
fa10: 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72   If so, consider
fa20: 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e  .  ** it constan
fa30: 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  t.  */.  for(i=0
fa40: 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
fa50: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
fa60: 78 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42  xpr *p = pGroupB
fa70: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
fa80: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
fa90: 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78  prCompare(0, pEx
faa0: 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a  pr, p, -1)<2 ){.
fab0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
fac0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
fad0: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c  prNNCollSeq(pWal
fae0: 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b  ker->pParse, p);
faf0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
fb00: 65 33 5f 73 74 72 69 63 6d 70 28 22 42 49 4e 41  e3_stricmp("BINA
fb10: 52 59 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  RY", pColl->zNam
fb20: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
fb30: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
fb40: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
fb50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
fb60: 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 73   if pExpr is a s
fb70: 75 62 2d 73 65 6c 65 63 74 2e 20 49 66 20 73 6f  ub-select. If so
fb80: 2c 20 63 6f 6e 73 69 64 65 72 20 69 74 20 76 61  , consider it va
fb90: 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28  riable. */.  if(
fba0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
fbb0: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
fbc0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 57 61  lect) ){.    pWa
fbd0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
fbe0: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
fbf0: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  Abort;.  }..  re
fc00: 74 75 72 6e 20 65 78 70 72 4e 6f 64 65 49 73 43  turn exprNodeIsC
fc10: 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b 65 72 2c  onstant(pWalker,
fc20: 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
fc30: 2a 20 57 61 6c 6b 20 74 68 65 20 65 78 70 72 65  * Walk the expre
fc40: 73 73 69 6f 6e 20 74 72 65 65 20 70 61 73 73 65  ssion tree passe
fc50: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
fc60: 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  rgument. Return 
fc70: 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 66 20 74  non-zero.** if t
fc80: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  he expression co
fc90: 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
fca0: 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 6f 72 20  of constants or 
fcb0: 63 6f 70 69 65 73 20 6f 66 20 74 65 72 6d 73 20  copies of terms 
fcc0: 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70 42 79 20  .** in pGroupBy 
fcd0: 74 68 61 74 20 73 6f 72 74 20 77 69 74 68 20 74  that sort with t
fce0: 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74  he BINARY collat
fcf0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ion sequence..**
fd00: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fd10: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
fd20: 72 6d 69 6e 65 20 69 66 20 61 20 74 65 72 6d 20  rmine if a term 
fd30: 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  of the HAVING cl
fd40: 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62 65 20 70  ause can.** be p
fd50: 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20 74 68 65  romoted into the
fd60: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
fd70: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 73 75 63  In order for suc
fd80: 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e 20 74 6f  h a promotion to
fd90: 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65 20 76 61   work,.** the va
fda0: 6c 75 65 20 6f 66 20 74 68 65 20 48 41 56 49 4e  lue of the HAVIN
fdb0: 47 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6d 75  G clause term mu
fdc0: 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 66  st be the same f
fdd0: 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  or all members o
fde0: 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70 22 2e 20  f.** a "group". 
fdf0: 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   The requirement
fe00: 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20   that the GROUP 
fe10: 42 59 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  BY term must be 
fe20: 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73 75 6d 65  BINARY.** assume
fe30: 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  s that no other 
fe40: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fe50: 63 65 20 77 69 6c 6c 20 68 61 76 65 20 61 20 66  ce will have a f
fe60: 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a 2a 2a 20  iner-grained.** 
fe70: 67 72 6f 75 70 69 6e 67 20 74 68 61 6e 20 62 69  grouping than bi
fe80: 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  nary.  In other 
fe90: 77 6f 72 64 73 20 28 41 3d 42 20 43 4f 4c 4c 41  words (A=B COLLA
fea0: 54 45 20 62 69 6e 61 72 79 29 20 69 6d 70 6c 69  TE binary) impli
feb0: 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20 65 76 65  es.** A=B in eve
fec0: 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69  ry other collati
fed0: 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  ng sequence.  Th
fee0: 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68  e requirement th
fef0: 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20  at the.** GROUP 
ff00: 42 59 20 62 65 20 42 49 4e 41 52 59 20 69 73 20  BY be BINARY is 
ff10: 73 74 72 69 63 74 65 72 20 74 68 61 6e 20 6e 65  stricter than ne
ff20: 63 65 73 73 61 72 79 2e 20 20 49 74 20 77 6f 75  cessary.  It wou
ff30: 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a 2a 2a 20  ld also work.** 
ff40: 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41 56 49 4e  to promote HAVIN
ff50: 47 20 63 6c 61 75 73 65 73 20 74 68 61 74 20 75  G clauses that u
ff60: 73 65 20 74 68 65 20 73 61 6d 65 20 61 6c 74 65  se the same alte
ff70: 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
ff80: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 61 73  g.** sequence as
ff90: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
ffa0: 72 6d 2c 20 62 75 74 20 74 68 61 74 20 69 73 20  rm, but that is 
ffb0: 6d 75 63 68 20 68 61 72 64 65 72 20 74 6f 20 63  much harder to c
ffc0: 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65 72 6e 61  heck,.** alterna
ffd0: 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  tive collating s
ffe0: 65 71 75 65 6e 63 65 73 20 61 72 65 20 75 6e 63  equences are unc
fff0: 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73 20  ommon, and this 
10000 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a 20 6f 70  is only an.** op
10010 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73 6f 20 77  timization, so w
10020 65 20 74 61 6b 65 20 74 68 65 20 65 61 73 79 20  e take the easy 
10030 77 61 79 20 6f 75 74 20 61 6e 64 20 73 69 6d 70  way out and simp
10040 6c 79 20 72 65 71 75 69 72 65 20 74 68 65 0a 2a  ly require the.*
10050 2a 20 47 52 4f 55 50 20 42 59 20 74 6f 20 75 73  * GROUP BY to us
10060 65 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c  e the BINARY col
10070 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
10080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
10090 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  xprIsConstantOrG
100a0 72 6f 75 70 42 79 28 50 61 72 73 65 20 2a 70 50  roupBy(Parse *pP
100b0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 45  arse, Expr *p, E
100c0 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
100d0 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  y){.  Walker w;.
100e0 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20    w.eCode = 1;. 
100f0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
10100 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e   = exprNodeIsCon
10110 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 3b 0a  stantOrGroupBy;.
10120 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
10130 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70  ack = 0;.  w.u.p
10140 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
10150 42 79 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  By;.  w.pParse =
10160 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
10170 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
10180 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
10190 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ode;.}../*.** Wa
101a0 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
101b0 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
101c0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
101d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
101e0 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75  stant.** or a fu
101f0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68  nction call with
10200 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
10210 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64  nts.  Return and
10220 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61   0 if there.** a
10230 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73  re any variables
10240 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
10250 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
10260 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
10270 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
10280 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
10290 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
102a0 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
102b0 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
102c0 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
102d0 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
102e0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
102f0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
10300 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a  rFunction(Expr *
10310 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20  p, u8 isInit){. 
10320 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d   assert( isInit=
10330 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20  =0 || isInit==1 
10340 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  );.  return expr
10350 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49  IsConst(p, 4+isI
10360 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64  nit, 0);.}..#ifd
10370 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10380 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a  _CURSOR_HINTS./*
10390 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
103a0 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
103b0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
103c0 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
103d0 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  s a.** subquery 
103e0 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52  of some kind.  R
103f0 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65  eturn 0 if there
10400 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69   are no subqueri
10410 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
10420 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75  e3ExprContainsSu
10430 62 71 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b  bquery(Expr *p){
10440 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
10450 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e  .eCode = 1;.  w.
10460 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
10470 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
10480 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  oop;.  w.xSelect
10490 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
104a0 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
104b0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
104c0 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63  DEBUG.  w.xSelec
104d0 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c  tCallback2 = sql
104e0 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73  ite3SelectWalkAs
104f0 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20  sert2;.#endif.  
10500 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
10510 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
10520 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23   w.eCode==0;.}.#
10530 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
10540 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
10550 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e   codes a constan
10560 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  t integer that i
10570 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a  s small enough.*
10580 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32  * to fit in a 32
10590 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
105a0 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74  turn 1 and put t
105b0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
105c0 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70  integer.** in *p
105d0 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65  Value.  If the e
105e0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
105f0 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69   an integer or i
10600 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a  f it is too big.
10610 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73  ** to fit in a s
10620 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74  igned 32-bit int
10630 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61  eger, return 0 a
10640 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65  nd leave *pValue
10650 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
10660 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
10670 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c  Integer(Expr *p,
10680 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20   int *pValue){. 
10690 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69   int rc = 0;.  i
106a0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
106b0 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79   0;  /* Can only
106c0 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e   happen followin
106d0 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f  g on OOM */..  /
106e0 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69  * If an expressi
106f0 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
10700 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69   literal that fi
10710 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  ts in a signed 3
10720 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67  2-bit.  ** integ
10730 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f  er, then the EP_
10740 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69  IntValue flag wi
10750 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
10760 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73  been set */.  as
10770 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
10780 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66  INTEGER || (p->f
10790 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
107a0 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ue)!=0.         
107b0 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
107c0 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
107d0 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20  , &rc)==0 );..  
107e0 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
107f0 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
10800 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75    *pValue = p->u
10810 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74  .iValue;.    ret
10820 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69  urn 1;.  }.  swi
10830 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
10840 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
10850 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
10860 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
10870 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
10880 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
10890 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
108a0 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
108b0 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
108c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
108d0 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
108e0 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
108f0 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28      assert( v!=(
10900 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29  -2147483647-1) )
10910 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  ;.        *pValu
10920 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
10930 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
10940 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10950 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
10960 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
10970 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10980 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
10990 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
109a0 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70  nce that the exp
109b0 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e  ression can be N
109c0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ULL..**.** If th
109d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67  e expression mig
109e0 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66  ht be NULL or if
109f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10a00 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a  is too complex.*
10a10 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e  * to tell return
10a20 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54   TRUE.  .**.** T
10a30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
10a40 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69  sed as an optimi
10a50 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20  zation, to skip 
10a60 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65  OP_IsNull opcode
10a70 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f  s.** when we kno
10a80 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63  w that a value c
10a90 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20  annot be NULL.  
10aa0 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70  Hence, a false p
10ab0 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75  ositive.** (retu
10ac0 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20  rning TRUE when 
10ad0 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72  in fact the expr
10ae0 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72  ession can never
10af0 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a   be NULL) might.
10b00 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65  ** be a small pe
10b10 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75  rformance hit bu
10b20 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68  t is otherwise h
10b30 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65  armless.  On the
10b40 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20   other.** hand, 
10b50 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  a false negative
10b60 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53   (returning FALS
10b70 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  E when the resul
10b80 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29  t could be NULL)
10b90 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  .** will likely 
10ba0 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
10bb0 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20  orrect answer.  
10bc0 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74  So when in doubt
10bd0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45  , return.** TRUE
10be0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10bf0 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f  ExprCanBeNull(co
10c00 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  nst Expr *p){.  
10c10 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20  u8 op;.  while( 
10c20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
10c30 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
10c40 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
10c50 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
10c60 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
10c70 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
10c80 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
10c90 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
10ca0 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
10cb0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
10cc0 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  G:.    case TK_F
10cd0 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LOAT:.    case T
10ce0 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65  K_BLOB:.      re
10cf0 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65  turn 0;.    case
10d00 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
10d10 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73    return ExprHas
10d20 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43  Property(p, EP_C
10d30 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20  anBeNull) ||.   
10d40 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 54 61            p->pTa
10d50 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20 52 65 66 65  b==0 ||  /* Refe
10d60 72 65 6e 63 65 20 74 6f 20 63 6f 6c 75 6d 6e 20  rence to column 
10d70 6f 66 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72  of index on expr
10d80 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
10d90 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75         (p->iColu
10da0 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62  mn>=0 && p->pTab
10db0 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d  ->aCol[p->iColum
10dc0 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a  n].notNull==0);.
10dd0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
10de0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
10df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10e00 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
10e10 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
10e20 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63   a constant whic
10e30 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e  h would be.** un
10e40 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66  changed by OP_Af
10e50 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20  finity with the 
10e60 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69  affinity given i
10e70 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  n the second.** 
10e80 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
10e90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10ea0 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
10eb0 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69  e if the OP_Affi
10ec0 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  nity operation.*
10ed0 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  * can be omitted
10ee0 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  .  When in doubt
10ef0 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20   return FALSE.  
10f00 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
10f10 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  .** is harmless.
10f20 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
10f30 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e  ve, however, can
10f40 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77   result in the w
10f50 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a  rong.** answer..
10f60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
10f70 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
10f80 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78  yChange(const Ex
10f90 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29  pr *p, char aff)
10fa0 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28  {.  u8 op;.  if(
10fb0 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
10fc0 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31  _BLOB ) return 1
10fd0 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
10fe0 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
10ff0 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
11000 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
11010 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
11020 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
11030 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
11040 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
11050 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
11060 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
11070 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
11080 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
11090 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
110a0 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
110b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
110c0 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  LOAT: {.      re
110d0 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
110e0 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66  _AFF_REAL || aff
110f0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
11100 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
11110 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
11120 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11130 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
11140 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  EXT;.    }.    c
11150 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
11160 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
11170 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11180 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
11190 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62   assert( p->iTab
111a0 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63  le>=0 );  /* p c
111b0 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66  annot be part of
111c0 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61   a CHECK constra
111d0 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  int */.      ret
111e0 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  urn p->iColumn<0
111f0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61  .          && (a
11200 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
11210 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
11220 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
11230 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  C);.    }.    de
11240 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
11250 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
11260 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
11270 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
11280 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
11290 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
112a0 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
112b0 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
112c0 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
112d0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
112e0 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
112f0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
11300 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
11310 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
11320 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
11330 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
11340 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
11350 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
11360 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
11370 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f 66  pX is the RHS of
11380 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e   an IN operator.
11390 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45 4c    If pX is a SEL
113a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a  ECT statement .*
113b0 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 69  * that can be si
113c0 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69  mplified to a di
113d0 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65 73  rect table acces
113e0 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  s, then return.*
113f0 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
11400 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
11410 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e  ent.  If pX is n
11420 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ot a SELECT stat
11430 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20  ement,.** or if 
11440 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
11450 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65  ment needs to be
11460 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f   manifested into
11470 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20   a transient.** 
11480 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75  table, then retu
11490 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e  rn NULL..*/.#ifn
114a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
114b0 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20  SUBQUERY.static 
114c0 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64  Select *isCandid
114d0 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72  ateForInOpt(Expr
114e0 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20   *pX){.  Select 
114f0 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  *p;.  SrcList *p
11500 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Src;.  ExprList 
11510 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
11520 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b   *pTab;.  int i;
11530 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
11540 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
11550 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74 75  IsSelect) ) retu
11560 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20  rn 0;  /* Not a 
11570 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  subquery */.  if
11580 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
11590 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65  y(pX, EP_VarSele
115a0 63 74 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b  ct)  ) return 0;
115b0 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20    /* Correlated 
115c0 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58  subq */.  p = pX
115d0 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69  ->x.pSelect;.  i
115e0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72  f( p->pPrior ) r
115f0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
11600 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63        /* Not a c
11610 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
11620 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
11630 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
11640 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
11650 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
11660 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
11670 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
11680 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
11690 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
116a0 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
116b0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
116c0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
116d0 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
116e0 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ate );.    retur
116f0 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49  n 0; /* No DISTI
11700 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20  NCT keyword and 
11710 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
11720 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20  ctions */.  }.  
11730 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
11740 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  pBy==0 );       
11750 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
11760 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
11770 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
11780 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
117a0 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61  Has no LIMIT cla
117b0 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
117c0 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
117d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
117e0 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20  /* Has no WHERE 
117f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63  clause */.  pSrc
11800 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
11810 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
11820 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
11830 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
11840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
11850 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d  gle term in FROM
11860 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
11870 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
11880 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ect ) return 0; 
11890 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e      /* FROM is n
118a0 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72  ot a subquery or
118b0 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20   view */.  pTab 
118c0 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
118d0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  b;.  assert( pTa
118e0 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
118f0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
11900 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
11910 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
11920 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f  is not a view */
11930 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
11940 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
11950 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f  0;        /* FRO
11960 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76  M clause not a v
11970 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
11980 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
11990 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
119a0 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f  pEList!=0 );.  /
119b0 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73  * All SELECT res
119c0 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c  ults must be col
119d0 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  umns. */.  for(i
119e0 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
119f0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
11a00 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69  xpr *pRes = pELi
11a10 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
11a20 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70      if( pRes->op
11a30 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
11a40 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65  turn 0;.    asse
11a50 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65  rt( pRes->iTable
11a60 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  ==pSrc->a[0].iCu
11a70 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20  rsor );  /* Not 
11a80 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
11a90 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72  query */.  }.  r
11aa0 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69  eturn p;.}.#endi
11ab0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11ac0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
11ad0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11ae0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
11af0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
11b00 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  hat checks the l
11b10 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
11b20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69  of index table i
11b30 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a  Cur to see if.**
11b40 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79   it contains any
11b50 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20   NULL entries.  
11b60 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74  Cause the regist
11b70 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c  er at regHasNull
11b80 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f   to be set.** to
11b90 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
11ba0 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69  e if iCur contai
11bb0 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61  ns no NULLs.  Ca
11bc0 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67  use register reg
11bd0 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65  HasNull.** to be
11be0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20   set to NULL if 
11bf0 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  iCur contains on
11c00 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
11c10 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
11c20 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74   void sqlite3Set
11c30 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65  HasNullFlag(Vdbe
11c40 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69   *v, int iCur, i
11c50 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a  nt regHasNull){.
11c60 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73    int addr1;.  s
11c70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11c80 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11c90 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
11ca0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
11cb0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11cc0 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b  P_Rewind, iCur);
11cd0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
11ce0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
11cf0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
11d00 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67  mn, iCur, 0, reg
11d10 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69  HasNull);.  sqli
11d20 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
11d30 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  v, OPFLAG_TYPEOF
11d40 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ARG);.  VdbeComm
11d50 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65  ent((v, "first_e
11d60 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43  ntry_in(%d)", iC
11d70 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ur));.  sqlite3V
11d80 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
11d90 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ddr1);.}.#endif.
11da0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11db0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
11dc0 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
11dd0 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  t is an IN opera
11de0 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20  tor with a list 
11df0 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
11e00 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68   on the .** righ
11e10 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65  t-hand side.  Re
11e20 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61  turn TRUE if tha
11e30 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61  t list is consta
11e40 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
11e50 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  t sqlite3InRhsIs
11e60 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
11e70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48  In){.  Expr *pLH
11e80 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  S;.  int res;.  
11e90 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
11ea0 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50  Property(pIn, EP
11eb0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
11ec0 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65   pLHS = pIn->pLe
11ed0 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  ft;.  pIn->pLeft
11ee0 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71   = 0;.  res = sq
11ef0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
11f00 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d  ant(pIn);.  pIn-
11f10 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20  >pLeft = pLHS;. 
11f20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23   return res;.}.#
11f30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
11f40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
11f50 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
11f60 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
11f70 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f  IN (...) operato
11f80 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72  r..** The pX par
11f90 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78  ameter is the ex
11fa0 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20  pression on the 
11fb0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
11fc0 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a  erator, which.**
11fd0 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
11fe0 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
11ff0 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71  ssions or a subq
12000 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
12010 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
12020 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  ine is to find o
12030 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
12040 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61  e object that ca
12050 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74  n.** be used eit
12060 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
12070 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68  membership in th
12080 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20  e RHS set or to 
12090 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
120a0 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  ** all members o
120b0 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73  f the RHS set, s
120c0 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74  kipping duplicat
120d0 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73  es..**.** A curs
120e0 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  or is opened on 
120f0 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
12100 74 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48  t that is the RH
12110 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
12120 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e  ator.** and pX->
12130 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
12140 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
12150 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  at cursor..**.**
12160 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
12170 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
12180 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74  tion indicates t
12190 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20  he b-tree type, 
121a0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
121b0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  *   IN_INDEX_ROW
121c0 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75  ID      - The cu
121d0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
121e0 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61  on a database ta
121f0 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
12200 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20  EX_INDEX_ASC  - 
12210 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
12220 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65  pened on an asce
12230 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
12240 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
12250 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73  _DESC - The curs
12260 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
12270 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
12280 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
12290 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20  EX_EPH        - 
122a0 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
122b0 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69  pened on a speci
122c0 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  ally created and
122d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
122e0 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75              popu
122f0 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20  lated epheremal 
12300 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
12310 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20  NDEX_NOOP       
12320 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20  - No cursor was 
12330 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20  allocated.  The 
12340 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  IN operator must
12350 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
12370 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
12380 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70  sequence of comp
12390 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41  arisons..**.** A
123a0 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65  n existing b-tre
123b0 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  e might be used 
123c0 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65  if the RHS expre
123d0 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69  ssion pX is a si
123e0 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79  mple.** subquery
123f0 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20   such as:.**.** 
12400 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75      SELECT <colu
12410 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e  mn1>, <column2>.
12420 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  .. FROM <table>.
12430 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
12440 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
12450 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
12460 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
12470 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
12480 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
12490 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
124a0 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
124b0 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
124c0 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
124d0 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
124e0 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  t to the ephemer
124f0 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  al table instead
12500 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69   of an.** existi
12510 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ng table..**.** 
12520 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61  The inFlags para
12530 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61  meter must conta
12540 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69 6d 75 6d  in, at a minimum
12550 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74  , one of the bit
12560 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  s.** IN_INDEX_ME
12570 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49  MBERSHIP or IN_I
12580 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74 20 6e 6f  NDEX_LOOP but no
12590 74 20 62 6f 74 68 2e 20 20 49 66 20 69 6e 46 6c  t both.  If inFl
125a0 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ags contains.** 
125b0 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
125c0 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65  HIP, then the ge
125d0 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20 77 69  nerated table wi
125e0 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ll be used for a
125f0 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62 65 72 73   fast.** members
12600 68 69 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20  hip test.  When 
12610 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  the IN_INDEX_LOO
12620 50 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68  P bit is set, th
12630 65 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 0a  e IN index will.
12640 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f  ** be used to lo
12650 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  op over all valu
12660 65 73 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66  es of the RHS of
12670 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
12680 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
12690 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73  INDEX_LOOP is us
126a0 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
126b0 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
126c0 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
126d0 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
126e0 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20  mbers) then the 
126f0 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20  b-tree must not 
12700 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74  contain duplicat
12710 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65  es..** An ephere
12720 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  mal table will b
12730 65 20 63 72 65 61 74 65 64 20 75 6e 6c 65 73 73  e created unless
12740 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f   the selected co
12750 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72 61 6e  lumns are guaran
12760 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e  teed.** to be un
12770 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65  ique - either be
12780 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49  cause it is an I
12790 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
127a0 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20  EY or due to.** 
127b0 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  a UNIQUE constra
127c0 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  int or index..**
127d0 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
127e0 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20  X_MEMBERSHIP is 
127f0 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
12800 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
12810 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73  d .** for fast s
12820 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
12830 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68  sts) then an eph
12840 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
12850 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e  t .** be used un
12860 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69  less <columns> i
12870 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54 45 47  s a single INTEG
12880 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
12890 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20  olumn or an .** 
128a0 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66 6f 75  index can be fou
128b0 6e 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  nd with the spec
128c0 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20  ified <columns> 
128d0 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74  as its left-most
128e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49  ..**.** If the I
128f0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20  N_INDEX_NOOP_OK 
12900 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  and IN_INDEX_MEM
12910 42 45 52 53 48 49 50 20 61 72 65 20 62 6f 74 68  BERSHIP are both
12920 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74   set and.** if t
12930 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
12940 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
12950 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75  ist (not a subqu
12960 65 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a  ery) then this.*
12970 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  * routine might 
12980 64 65 63 69 64 65 20 74 68 61 74 20 63 72 65 61  decide that crea
12990 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ting an ephemera
129a0 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d  l b-tree for mem
129b0 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69  bership.** testi
129c0 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73  ng is too expens
129d0 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49  ive and return I
129e0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49  N_INDEX_NOOP.  I
129f0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
12a00 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
12a10 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65  ine should imple
12a20 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72  ment the IN oper
12a30 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71  ator using a seq
12a40 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f  uence.** of Eq o
12a50 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  r Ne comparison 
12a60 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
12a70 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65  * When the b-tre
12a80 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  e is being used 
12a90 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74  for membership t
12aa0 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ests, the callin
12ab0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69  g function.** mi
12ac0 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77  ght need to know
12ad0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
12ae0 74 68 65 20 52 48 53 20 73 69 64 65 20 6f 66 20  the RHS side of 
12af0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
12b00 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55  ** contains a NU
12b10 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61 73  LL.  If prRhsHas
12b20 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55  Null is not a NU
12b30 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a  LL pointer and .
12b40 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ** if there is a
12b50 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  ny chance that t
12b60 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63  he (...) might c
12b70 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61  ontain a NULL va
12b80 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  lue at.** runtim
12b90 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74  e, then a regist
12ba0 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
12bb0 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72  and the register
12bc0 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a   number written.
12bd0 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e  ** to *prRhsHasN
12be0 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73  ull. If there is
12bf0 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
12c00 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69  the (...) contai
12c10 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  ns a.** NULL val
12c20 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48  ue, then *prRhsH
12c30 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75  asNull is left u
12c40 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
12c50 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73  If a register is
12c60 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69   allocated and i
12c70 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72  ts location stor
12c80 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e  ed in *prRhsHasN
12c90 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ull, then.** the
12ca0 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72   value in that r
12cb0 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20  egister will be 
12cc0 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72  NULL if the b-tr
12cd0 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ee contains one 
12ce0 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20  or more.** NULL 
12cf0 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77  values, and it w
12d00 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d  ill be some non-
12d10 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68  NULL value if th
12d20 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
12d30 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  s no.** NULL val
12d40 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ues..**.** If th
12d50 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65 74 65  e aiMap paramete
12d60 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  r is not NULL, i
12d70 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  t must point to 
12d80 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  an array contain
12d90 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65  ing.** one eleme
12da0 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  nt for each colu
12db0 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  mn returned by t
12dc0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
12dd0 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a  ent on the RHS.*
12de0 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29  * of the IN(...)
12df0 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20 69   operator. The i
12e00 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  'th entry of the
12e10 20 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61   array is popula
12e20 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ted with the.** 
12e30 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 69 6e  offset of the in
12e40 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  dex column that 
12e50 6d 61 74 63 68 65 73 20 74 68 65 20 69 27 74 68  matches the i'th
12e60 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64   column returned
12e70 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   by the.** SELEC
12e80 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  T. For example, 
12e90 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
12ea0 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64 20 69  n and selected i
12eb0 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ndex are:.**.** 
12ec0 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45    (?,?,?) IN (SE
12ed0 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f  LECT a, b, c FRO
12ee0 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45 41 54  M t1).**   CREAT
12ef0 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
12f00 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a  (b, c, a);.**.**
12f10 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73   then aiMap[] is
12f20 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
12f30 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69  {2, 0, 1}..*/.#i
12f40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12f50 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
12f60 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
12f70 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
12f80 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
12f90 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
12fa0 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58  xt */.  Expr *pX
12fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12fc0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
12fd0 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20  hand side (RHS) 
12fe0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
12ff0 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c  or */.  u32 inFl
13000 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
13010 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c     /* IN_INDEX_L
13020 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50  OOP, _MEMBERSHIP
13030 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f  , and/or _NOOP_O
13040 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68  K */.  int *prRh
13050 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20  sHasNull,       
13060 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
13070 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75  lding NULL statu
13080 73 2e 20 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f  s.  See notes */
13090 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 20 20  .  int *aiMap   
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
130b0 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e   Mapping from In
130c0 64 65 78 20 66 69 65 6c 64 73 20 74 6f 20 52 48  dex fields to RH
130d0 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20  S fields */.){. 
130e0 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20   Select *p;     
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13100 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
13110 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
13120 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
13130 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b    int eType = 0;
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13150 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
13160 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e  of RHS table. IN
13170 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e  _INDEX_* */.  in
13180 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
13190 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20  >nTab++;        
131a0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
131b0 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a   the RHS table *
131c0 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e  /.  int mustBeUn
131d0 69 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ique;           
131e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
131f0 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65  e if RHS must be
13200 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62   unique */.  Vdb
13210 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
13220 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
13230 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61     /* Virtual ma
13240 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65  chine being code
13250 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
13260 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
13270 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20  .  mustBeUnique 
13280 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  = (inFlags & IN_
13290 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a  INDEX_LOOP)!=0;.
132a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53  .  /* If the RHS
132b0 20 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29   of this IN(...)
132c0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 53   operator is a S
132d0 45 4c 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74  ELECT, and if it
132e0 20 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77   matters .  ** w
132f0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
13300 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20  e SELECT result 
13310 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
13320 6c 75 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74  lues, check whet
13330 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20  her.  ** or not 
13340 4e 55 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79  NULL is actually
13350 20 70 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61   possible (it ma
13360 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78  y not be, for ex
13370 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a  ample, due .  **
13380 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e   to NOT NULL con
13390 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
133a0 73 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e  schema). If no N
133b0 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70  ULL values are p
133c0 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65  ossible,.  ** se
133d0 74 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74  t prRhsHasNull t
133e0 6f 20 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  o 0 before conti
133f0 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28  nuing.  */.  if(
13400 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26   prRhsHasNull &&
13410 20 28 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pX->flags & EP
13420 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
13430 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78     int i;.    Ex
13440 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
13450 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e   pX->x.pSelect->
13460 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28  pEList;.    for(
13470 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
13480 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
13490 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
134a0 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73  rCanBeNull(pELis
134b0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
134c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
134d0 20 20 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d    if( i==pEList-
134e0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
134f0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30  prRhsHasNull = 0
13500 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13510 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
13520 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  f an existing ta
13530 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  ble or index can
13540 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a   be used to.  **
13550 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65   satisfy the que
13560 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65  ry.  This is pre
13570 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ferable to gener
13580 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a  ating a new .  *
13590 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  * ephemeral tabl
135a0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  e.  */.  if( pPa
135b0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20  rse->nErr==0 && 
135c0 28 70 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65  (p = isCandidate
135d0 46 6f 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30  ForInOpt(pX))!=0
135e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
135f0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
13600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
13610 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
13620 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62  ction */.    Tab
13630 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13650 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61      /* Table <ta
13660 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36  ble>. */.    i16
13670 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
136a0 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  idx for pTab */.
136b0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
136c0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
136d0 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  ;.    int nExpr 
136e0 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
136f0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
13700 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20  >pEList!=0 );   
13710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
13720 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
13730 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
13740 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
13750 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
13760 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63  xpr!=0 ); /* Bec
13770 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
13780 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
13790 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
137a0 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20  >pSrc!=0 );     
137b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
137c0 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
137d0 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
137e0 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e  /.    pTab = p->
137f0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
13800 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e  ..    /* Code an
13810 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20   OP_Transaction 
13820 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  and OP_TableLock
13830 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f   for <table>. */
13840 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
13850 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
13860 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
13870 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  a);.    sqlite3C
13880 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
13890 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
138a0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
138b0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
138c0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
138d0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
138e0 20 20 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a    assert(v);  /*
138f0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
13900 29 20 68 61 73 20 61 6c 77 61 79 73 20 62 65 65  ) has always bee
13910 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  n previously cal
13920 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  led */.    if( n
13930 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73  Expr==1 && pELis
13940 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69  t->a[0].pExpr->i
13950 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
13960 20 20 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28    /* The "x IN (
13970 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
13980 4d 20 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a  M table)" case *
13990 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64  /.      int iAdd
139a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
139b0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
139c0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
139d0 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20  erage(v);..     
139e0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
139f0 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
13a00 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
13a10 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65  enRead);.      e
13a20 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
13a30 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71  ROWID;..      sq
13a40 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
13a50 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
13a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
13a70 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
13aa0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
13ab0 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b   int affinity_ok
13ac0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
13ad0 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  i;..      /* Che
13ae0 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69  ck that the affi
13af0 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62  nity that will b
13b00 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72  e used to perfor
13b10 6d 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a  m each .      **
13b20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
13b30 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61  he same as the a
13b40 66 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68 20  ffinity of each 
13b50 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a  column in table.
13b60 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
13b70 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
13b80 65 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 6e  erator.  If it n
13b90 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ot, it is not po
13ba0 73 73 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ssible to.      
13bb0 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78  ** use any index
13bc0 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
13bd0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  e.  */.      for
13be0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26  (i=0; i<nExpr &&
13bf0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b   affinity_ok; i+
13c00 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
13c10 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33   *pLhs = sqlite3
13c20 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
13c30 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29  pr(pX->pLeft, i)
13c40 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  ;.        int iC
13c50 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  ol = pEList->a[i
13c60 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
13c70 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 69  ;.        char i
13c80 64 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54  dxaff = sqlite3T
13c90 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
13ca0 74 79 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f  ty(pTab,iCol); /
13cb0 2a 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20  * RHS table */. 
13cc0 20 20 20 20 20 20 20 63 68 61 72 20 63 6d 70 61         char cmpa
13cd0 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
13ce0 61 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73  areAffinity(pLhs
13cf0 2c 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20  , idxaff);.     
13d00 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70     testcase( cmp
13d10 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
13d20 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 20 20  BLOB );.        
13d30 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66  testcase( cmpaff
13d40 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
13d50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69  T );.        swi
13d60 74 63 68 28 20 63 6d 70 61 66 66 20 29 7b 0a 20  tch( cmpaff ){. 
13d70 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
13d80 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20  LITE_AFF_BLOB:. 
13d90 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
13da0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ;.          case
13db0 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
13dc0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  :.            /*
13dd0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
13de0 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72  ffinity() only r
13df0 65 74 75 72 6e 73 20 54 45 58 54 20 69 66 20 6f  eturns TEXT if o
13e00 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20  ne side or the. 
13e10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74             ** ot
13e20 68 65 72 20 68 61 73 20 6e 6f 20 61 66 66 69 6e  her has no affin
13e30 69 74 79 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ity and the othe
13e40 72 20 73 69 64 65 20 69 73 20 54 45 58 54 2e 20  r side is TEXT. 
13e50 20 48 65 6e 63 65 2c 0a 20 20 20 20 20 20 20 20   Hence,.        
13e60 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20      ** the only 
13e70 77 61 79 20 66 6f 72 20 63 6d 70 61 66 66 20 74  way for cmpaff t
13e80 6f 20 62 65 20 54 45 58 54 20 69 73 20 66 6f 72  o be TEXT is for
13e90 20 69 64 78 61 66 66 20 74 6f 20 62 65 20 54 45   idxaff to be TE
13ea0 58 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  XT.            *
13eb0 2a 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 65  * and for the te
13ec0 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  rm on the LHS of
13ed0 20 74 68 65 20 49 4e 20 74 6f 20 68 61 76 65 20   the IN to have 
13ee0 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  no affinity. */.
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
13f00 72 74 28 20 69 64 78 61 66 66 3d 3d 53 51 4c 49  rt( idxaff==SQLI
13f10 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
13f20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
13f30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61  ;.          defa
13f40 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ult:.           
13f50 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73   affinity_ok = s
13f60 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
13f70 66 66 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b  ffinity(idxaff);
13f80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13f90 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 61 66   }..      if( af
13fa0 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20  finity_ok ){.   
13fb0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
13fc0 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69  or an existing i
13fd0 6e 64 65 78 20 74 68 61 74 20 77 69 6c 6c 20 77  ndex that will w
13fe0 6f 72 6b 20 66 6f 72 20 74 68 69 73 20 49 4e 20  ork for this IN 
13ff0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
14000 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
14010 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
14020 26 26 20 65 54 79 70 65 3d 3d 30 3b 20 70 49 64  && eType==0; pId
14030 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
14040 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
14050 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20 20 20 20  k colUsed;      
14060 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  /* Columns of th
14070 65 20 69 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a  e index used */.
14080 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
14090 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  k mCol;         
140a0 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20  /* Mask for the 
140b0 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a  current column *
140c0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
140d0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45  pIdx->nColumn<nE
140e0 78 70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  xpr ) continue;.
140f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
14100 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20  imum nColumn is 
14110 42 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31  BMS-2, not BMS-1
14120 2c 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  , so that we can
14130 20 63 6f 6d 70 75 74 65 0a 20 20 20 20 20 20 20   compute.       
14140 20 20 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45     ** BITMASK(nE
14150 78 70 72 29 20 77 69 74 68 6f 75 74 20 6f 76 65  xpr) without ove
14160 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20  rflowing */.    
14170 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14180 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42  pIdx->nColumn==B
14190 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  MS-2 );.        
141a0 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78    testcase( pIdx
141b0 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31  ->nColumn==BMS-1
141c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
141d0 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
141e0 3d 42 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75  =BMS-1 ) continu
141f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
14200 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 29 7b   mustBeUnique ){
14210 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
14220 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e   pIdx->nKeyCol>n
14230 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20  Expr.           
14240 20 20 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75    ||(pIdx->nColu
14250 6d 6e 3e 6e 45 78 70 72 20 26 26 20 21 49 73 55  mn>nExpr && !IsU
14260 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
14270 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b  ).            ){
14280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
14290 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69  ontinue;  /* Thi
142a0 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75  s index is not u
142b0 6e 69 71 75 65 20 6f 76 65 72 20 74 68 65 20 49  nique over the I
142c0 4e 20 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f  N RHS columns */
142d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
142e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
142f0 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20          colUsed 
14300 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  = 0;   /* Column
14310 73 20 6f 66 20 69 6e 64 65 78 20 75 73 65 64 20  s of index used 
14320 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
14330 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
14340 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
14350 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
14360 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  hs = sqlite3Vect
14370 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
14380 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  X->pLeft, i);.  
14390 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
143a0 70 52 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pRhs = pEList->a
143b0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
143c0 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
143d0 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69  pReq = sqlite3Bi
143e0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
143f0 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c  eq(pParse, pLhs,
14400 20 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20   pRhs);.        
14410 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20      int j;.  .  
14420 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
14430 28 20 70 52 65 71 21 3d 30 20 7c 7c 20 70 52 68  ( pReq!=0 || pRh
14440 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52  s->iColumn==XN_R
14450 4f 57 49 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e  OWID || pParse->
14460 6e 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20  nErr );.        
14470 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
14480 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
14490 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
144a0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21  dx->aiColumn[j]!
144b0 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29  =pRhs->iColumn )
144c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
144d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
144e0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
144f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
14500 20 20 69 66 28 20 70 52 65 71 21 3d 30 20 26 26    if( pReq!=0 &&
14510 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
14520 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64  pReq->zName, pId
14530 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30  x->azColl[j])!=0
14540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14550 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
14560 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
14570 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
14580 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
14590 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
145a0 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62 72 65 61   j==nExpr ) brea
145b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  k;.            m
145c0 43 6f 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29  Col = MASKBIT(j)
145d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
145e0 28 20 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64  ( mCol & colUsed
145f0 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63   ) break; /* Eac
14600 68 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e  h column used on
14610 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20  ly once */.     
14620 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c         colUsed |
14630 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = mCol;.        
14640 20 20 20 20 69 66 28 20 61 69 4d 61 70 20 29 20      if( aiMap ) 
14650 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20  aiMap[i] = j;.  
14660 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
14670 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
14680 3d 3d 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73  ==nExpr || colUs
14690 65 64 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78  ed!=(MASKBIT(nEx
146a0 70 72 29 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  pr)-1) );.      
146b0 20 20 20 20 69 66 28 20 63 6f 6c 55 73 65 64 3d      if( colUsed=
146c0 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29  =(MASKBIT(nExpr)
146d0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
146e0 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
146f0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
14700 61 74 20 6d 65 61 6e 73 20 74 68 65 20 69 6e 64  at means the ind
14710 65 78 20 70 49 64 78 20 69 73 20 75 73 61 62 6c  ex pIdx is usabl
14720 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
14730 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
14740 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
14750 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
14760 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 23 69 66  Coverage(v);.#if
14770 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14780 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 20 20 20  _EXPLAIN.       
14790 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
147a0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
147b0 6c 61 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  lain, 0, 0, 0,. 
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
147d0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
147e0 22 55 53 49 4e 47 20 49 4e 44 45 58 20 25 73 20  "USING INDEX %s 
147f0 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22  FOR IN-OPERATOR"
14800 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20  ,pIdx->zName),. 
14810 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
14820 44 59 4e 41 4d 49 43 29 3b 0a 23 65 6e 64 69 66  DYNAMIC);.#endif
14830 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
14840 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14850 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
14860 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
14870 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20   iDb);.         
14880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
14890 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
148a0 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
148b0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
148c0 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
148d0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
148e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49         assert( I
148f0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
14900 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  SC == IN_INDEX_I
14910 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20  NDEX_ASC+1 );.  
14920 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
14930 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
14940 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f  _ASC + pIdx->aSo
14950 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20  rtOrder[0];.  . 
14960 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
14970 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23  rRhsHasNull ){.#
14980 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
14990 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
149a0 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 20 20 20  MASK.           
149b0 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20 28 31     i64 mask = (1
149c0 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20 20 20  <<nExpr)-1;.    
149d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
149e0 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
149f0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  v, OP_ColumnsUse
14a00 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
14a10 20 20 20 20 20 20 69 54 61 62 2c 20 30 2c 20 30        iTab, 0, 0
14a20 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34  , (u8*)&mask, P4
14a30 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a  _INT64);.#endif.
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
14a50 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b  rRhsHasNull = ++
14a60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14a70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14a80 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
14a90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14aa0 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
14ab0 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68  g(v, iTab, *prRh
14ac0 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
14ad0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14ae0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14af0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14b00 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
14b10 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
14b20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64          } /* End
14b30 20 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65 78   loop over index
14b40 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a  es */.      } /*
14b50 20 45 6e 64 20 69 66 28 20 61 66 66 69 6e 69 74   End if( affinit
14b60 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20  y_ok ) */.    } 
14b70 2f 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e  /* End if not an
14b80 20 72 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a   rowid index */.
14b90 20 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d    } /* End attem
14ba0 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75  pt to optimize u
14bb0 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f  sing an index */
14bc0 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65  ..  /* If no pre
14bd0 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69  existing index i
14be0 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  s available for 
14bf0 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20  the IN clause.  
14c00 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  ** and IN_INDEX_
14c10 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77  NOOP is an allow
14c20 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e  ed reply.  ** an
14c30 64 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  d the RHS of the
14c40 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
14c50 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75  a list, not a su
14c60 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20  bquery.  ** and 
14c70 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63  the RHS is not c
14c80 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61 73 20 74  onstant or has t
14c90 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d  wo or fewer term
14ca0 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20  s,.  ** then it 
14cb0 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65  is not worth cre
14cc0 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ating an ephemer
14cd0 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c  al table to eval
14ce0 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e  uate.  ** the IN
14cf0 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74   operator so ret
14d00 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  urn IN_INDEX_NOO
14d10 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  P..  */.  if( eT
14d20 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e  ype==0.   && (in
14d30 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
14d40 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20  _NOOP_OK).   && 
14d50 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
14d60 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
14d70 74 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74  t).   && (!sqlit
14d80 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e  e3InRhsIsConstan
14d90 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70  t(pX) || pX->x.p
14da0 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a  List->nExpr<=2).
14db0 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d    ){.    eType =
14dc0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a   IN_INDEX_NOOP;.
14dd0 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
14de0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  ==0 ){.    /* Co
14df0 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20  uld not find an 
14e00 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
14e10 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61  r index to use a
14e20 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65  s the RHS b-tree
14e30 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c  ..    ** We will
14e40 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74   have to generat
14e50 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
14e60 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a  able to do the j
14e70 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ob..    */.    u
14e80 33 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  32 savedNQueryLo
14e90 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
14ea0 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  eryLoop;.    int
14eb0 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
14ec0 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  0;.    eType = I
14ed0 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20  N_INDEX_EPH;.   
14ee0 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49   if( inFlags & I
14ef0 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a  N_INDEX_LOOP ){.
14f00 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51        pParse->nQ
14f10 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20  ueryLoop = 0;.  
14f20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66      if( pX->pLef
14f30 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20  t->iColumn<0 && 
14f40 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
14f50 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
14f60 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54  t) ){.        eT
14f70 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
14f80 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OWID;.      }.  
14f90 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68    }else if( prRh
14fa0 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  sHasNull ){.    
14fb0 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
14fc0 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  = rMayHaveNull =
14fd0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
14fe0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
14ff0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
15000 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79  pParse, pX, rMay
15010 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d  HaveNull, eType=
15020 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29  =IN_INDEX_ROWID)
15030 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51  ;.    pParse->nQ
15040 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64  ueryLoop = saved
15050 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65  NQueryLoop;.  }e
15060 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61  lse{.    pX->iTa
15070 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a  ble = iTab;.  }.
15080 0a 20 20 69 66 28 20 61 69 4d 61 70 20 26 26 20  .  if( aiMap && 
15090 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f  eType!=IN_INDEX_
150a0 49 4e 44 45 58 5f 41 53 43 20 26 26 20 65 54 79  INDEX_ASC && eTy
150b0 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe!=IN_INDEX_IND
150c0 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69  EX_DESC ){.    i
150d0 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d  nt i, n;.    n =
150e0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
150f0 6f 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74  orSize(pX->pLeft
15100 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
15110 69 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b  i<n; i++) aiMap[
15120 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65  i] = i;.  }.  re
15130 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65  turn eType;.}.#e
15140 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
15150 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15160 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  RY./*.** Argumen
15170 74 20 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f  t pExpr is an (?
15180 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20  , ?...) IN(...) 
15190 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73  expression. This
151a0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c   .** function al
151b0 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
151c0 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  rns a nul-termin
151d0 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74  ated string cont
151e0 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61  aining .** the a
151f0 66 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20  ffinities to be 
15200 75 73 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f  used for each co
15210 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70  lumn of the comp
15220 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74  arison..**.** It
15230 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
15240 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
15250 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74  ller to ensure t
15260 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64  hat the returned
15270 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76  .** string is ev
15280 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
15290 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
152a0 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
152b0 63 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69  char *exprINAffi
152c0 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
152d0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
152e0 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20  {.  Expr *pLeft 
152f0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
15300 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
15310 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
15320 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c  ze(pLeft);.  Sel
15330 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28  ect *pSelect = (
15340 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
15350 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70  P_xIsSelect) ? p
15360 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
15370 3a 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  : 0;.  char *zRe
15380 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45  t;..  assert( pE
15390 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29  xpr->op==TK_IN )
153a0 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74  ;.  zRet = sqlit
153b0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50  e3DbMallocRaw(pP
153c0 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31  arse->db, nVal+1
153d0 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  );.  if( zRet ){
153e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
153f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b  for(i=0; i<nVal;
15400 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
15410 72 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56  r *pA = sqlite3V
15420 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
15430 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
15440 20 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69     char a = sqli
15450 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
15460 70 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pA);.      if( p
15470 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
15480 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69    zRet[i] = sqli
15490 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
154a0 74 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  ty(pSelect->pELi
154b0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
154c0 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  a);.      }else{
154d0 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d  .        zRet[i]
154e0 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = a;.      }.  
154f0 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61    }.    zRet[nVa
15500 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  l] = '\0';.  }. 
15510 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
15520 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
15530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
15540 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  UERY./*.** Load 
15550 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
15560 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
15570 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69  irst argument wi
15580 74 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  th an error .** 
15590 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66  message of the f
155a0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75  orm:.**.**   "su
155b0 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
155c0 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70   N columns - exp
155d0 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76  ected M".*/   .v
155e0 6f 69 64 20 73 71 6c 69 74 65 33 53 75 62 73 65  oid sqlite3Subse
155f0 6c 65 63 74 45 72 72 6f 72 28 50 61 72 73 65 20  lectError(Parse 
15600 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63  *pParse, int nAc
15610 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63  tual, int nExpec
15620 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
15630 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65   *zFmt = "sub-se
15640 6c 65 63 74 20 72 65 74 75 72 6e 73 20 25 64 20  lect returns %d 
15650 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
15660 65 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65  ed %d";.  sqlite
15670 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15680 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c  , zFmt, nActual,
15690 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e   nExpect);.}.#en
156a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65  dif../*.** Expre
156b0 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61  ssion pExpr is a
156c0 20 76 65 63 74 6f 72 20 74 68 61 74 20 68 61 73   vector that has
156d0 20 62 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20   been used in a 
156e0 63 6f 6e 74 65 78 74 20 77 68 65 72 65 0a 2a 2a  context where.**
156f0 20 69 74 20 69 73 20 6e 6f 74 20 70 65 72 6d 69   it is not permi
15700 74 74 65 64 2e 20 49 66 20 70 45 78 70 72 20 69  tted. If pExpr i
15710 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 76  s a sub-select v
15720 65 63 74 6f 72 2c 20 74 68 69 73 20 72 6f 75 74  ector, this rout
15730 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73 20 74 68  ine .** loads th
15740 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 77  e Parse object w
15750 69 74 68 20 61 20 6d 65 73 73 61 67 65 20 6f 66  ith a message of
15760 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
15770 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72     "sub-select r
15780 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73  eturns N columns
15790 20 2d 20 65 78 70 65 63 74 65 64 20 31 22 0a 2a   - expected 1".*
157a0 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 74 20 69  *.** Or, if it i
157b0 73 20 61 20 72 65 67 75 6c 61 72 20 73 63 61 6c  s a regular scal
157c0 61 72 20 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a  ar vector:.**.**
157d0 20 20 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69     "row value mi
157e0 73 75 73 65 64 22 0a 2a 2f 20 20 20 0a 76 6f 69  sused".*/   .voi
157f0 64 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45  d sqlite3VectorE
15800 72 72 6f 72 4d 73 67 28 50 61 72 73 65 20 2a 70  rrorMsg(Parse *p
15810 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
15820 70 72 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  pr){.#ifndef SQL
15830 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
15840 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  Y.  if( pExpr->f
15850 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
15860 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
15870 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
15880 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15890 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
158a0 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  t->nExpr, 1);.  
158b0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
158c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
158d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f  rMsg(pParse, "ro
158e0 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
158f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15900 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
15910 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72  r scalar subquer
15920 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75  ies used as a su
15930 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f  bquery expressio
15940 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72  n, EXISTS,.** or
15950 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20   IN operators.  
15960 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
15970 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52      (SELECT a FR
15980 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d  OM b)          -
15990 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  - subquery.**   
159a0 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54    EXISTS (SELECT
159b0 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20   a FROM b)   -- 
159c0 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a  EXISTS subquery.
159d0 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35  **     x IN (4,5
159e0 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20  ,11)            
159f0 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
15a00 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69   with list on ri
15a10 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a  ght-hand side.**
15a20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
15a30 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
15a40 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
15a50 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20  ith subquery on 
15a60 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20  the right.**.** 
15a70 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65  The pExpr parame
15a80 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68  ter describes th
15a90 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
15aa0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
15ab0 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72  N.** operator or
15ac0 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
15ad0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73   If parameter is
15ae0 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
15af0 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69  o, then expressi
15b00 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72  on pExpr is guar
15b10 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
15b20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f  of the form "<ro
15b30 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f  wid> IN (?, ?, ?
15b40 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64  )", where <rowid
15b50 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  > is a reference
15b60 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65  .** to some inte
15b70 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f  ger key column o
15b80 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65  f a table B-Tree
15b90 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
15ba0 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79  use an.** intkey
15bb0 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65   B-Tree to store
15bc0 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e   the set of IN(.
15bd0 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65  ..) values inste
15be0 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a  ad of the usual.
15bf0 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69  ** (slower) vari
15c00 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73  able length keys
15c10 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49   B-Tree..**.** I
15c20 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69  f rMayHaveNull i
15c30 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74  s non-zero, that
15c40 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
15c50 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20  operation is an 
15c60 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c  IN.** (not a SEL
15c70 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20 61  ECT or EXISTS) a
15c80 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53 20  nd that the RHS 
15c90 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e  might contains N
15ca0 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69  ULLs..** All thi
15cb0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69  s routine does i
15cc0 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  s initialize the
15cd0 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20   register given 
15ce0 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a  by rMayHaveNull.
15cf0 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c  ** to NULL.  Cal
15d00 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69  ling routines wi
15d10 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20  ll take care of 
15d20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65  changing this re
15d30 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20  gister.** value 
15d40 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74  to non-NULL if t
15d50 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66  he RHS is NULL-f
15d60 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ree..**.** For a
15d70 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
15d80 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75  S operator, retu
15d90 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
15da0 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a  that holds the.*
15db0 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 61  * result.  For a
15dc0 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53 45   multi-column SE
15dd0 4c 45 43 54 2c 20 74 68 65 20 72 65 73 75 6c 74  LECT, the result
15de0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20   is stored in a 
15df0 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a 20 61 72  contiguous.** ar
15e00 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
15e10 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20   and the return 
15e20 76 61 6c 75 65 20 69 73 20 74 68 65 20 72 65 67  value is the reg
15e30 69 73 74 65 72 20 6f 66 20 74 68 65 20 6c 65 66  ister of the lef
15e40 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73 75 6c 74  t-most.** result
15e50 20 63 6f 6c 75 6d 6e 2e 20 20 52 65 74 75 72 6e   column.  Return
15e60 20 30 20 66 6f 72 20 49 4e 20 6f 70 65 72 61 74   0 for IN operat
15e70 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72  ors or if an err
15e80 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23 69  or occurs..*/.#i
15e90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15ea0 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
15eb0 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
15ec0 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
15ed0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
15ee0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
15ef0 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
15f00 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr,            /
15f10 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54  * The IN, SELECT
15f20 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  , or EXISTS oper
15f30 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 48  ator */.  int rH
15f40 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20 20  asNullFlag,     
15f50 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
15f60 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68  at records wheth
15f70 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69  er NULLs exist i
15f80 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  n RHS */.  int i
15f90 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  sRowid          
15fa0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c     /* If true, L
15fb0 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  HS of IN operato
15fc0 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a  r is a rowid */.
15fd0 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44 79  ){.  int jmpIfDy
15fe0 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20 20  namic = -1;     
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16000 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73   /* One-time tes
16010 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69  t address */.  i
16020 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20  nt rReg = 0;    
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
16050 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c  er storing resul
16060 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ting */.  Vdbe *
16070 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16080 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
16090 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
160a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
160b0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
160c0 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
160d0 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  The evaluation o
160e0 66 20 74 68 65 20 49 4e 2f 45 58 49 53 54 53 2f  f the IN/EXISTS/
160f0 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 72  SELECT must be r
16100 65 70 65 61 74 65 64 20 65 76 65 72 79 20 74 69  epeated every ti
16110 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e  me it.  ** is en
16120 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e 79  countered if any
16130 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
16140 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a  g is true:.  **.
16150 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
16160 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
16170 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
16180 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20  ubquery.  **    
16190 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
161a0 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70  d side is an exp
161b0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
161c0 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65  taining variable
161d0 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20  s.  **    *  We 
161e0 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69  are inside a tri
161f0 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gger.  **.  ** I
16200 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
16210 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68  ve are false, th
16220 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68  en we can run th
16230 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63  is code just onc
16240 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20  e.  ** save the 
16250 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75  results, and reu
16260 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  se the same resu
16270 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74  lt on subsequent
16280 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20   invocations..  
16290 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  */.  if( !ExprHa
162a0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
162b0 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29   EP_VarSelect) )
162c0 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d  {.    jmpIfDynam
162d0 69 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ic = sqlite3Vdbe
162e0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
162f0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
16300 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  (v);.  }..#ifnde
16310 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
16320 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72  PLAIN.  if( pPar
16330 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
16340 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  {.    char *zMsg
16350 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
16360 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45  f(pParse->db, "E
16370 58 45 43 55 54 45 20 25 73 25 73 20 53 55 42 51  XECUTE %s%s SUBQ
16380 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20  UERY %d",.      
16390 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d    jmpIfDynamic>=
163a0 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44  0?"":"CORRELATED
163b0 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70   ",.        pExp
163c0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49  r->op==TK_IN?"LI
163d0 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a 20 20  ST":"SCALAR",.  
163e0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 4e        pParse->iN
163f0 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20  extSelectId.    
16400 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16410 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
16420 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
16430 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
16440 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
16450 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  C);.  }.#endif..
16460 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
16470 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
16480 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
16490 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
164a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
164b0 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
164c0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
164d0 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ction */.      E
164e0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
164f0 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68  pr->pLeft; /* th
16500 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
16510 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
16520 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
16530 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  nfo = 0;      /*
16540 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   Key information
16550 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56   */.      int nV
16560 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
16570 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
16580 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f   vector pLeft */
16590 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 56  .      .      nV
165a0 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
165b0 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
165c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
165d0 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61   !isRowid || nVa
165e0 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  l==1 );..      /
165f0 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69  * Whether this i
16600 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43  s an 'x IN(SELEC
16610 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20  T...)' or an 'x 
16620 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a  IN(<exprlist>)'.
16630 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
16640 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65  ion it is handle
16650 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20  d the same way. 
16660 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   An ephemeral ta
16670 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  ble is .      **
16680 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e 64   filled with ind
16690 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e  ex keys represen
166a0 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
166b0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
166c0 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74 68   ** SELECT or th
166d0 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
166e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
166f0 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
16700 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
16710 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
16720 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
16730 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
16740 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
16750 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
16760 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
16770 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
16780 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
16790 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
167a0 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
167b0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
167c0 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
167d0 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
167e0 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
167f0 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
16800 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
16810 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
16820 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
16830 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
16840 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
16850 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
16860 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
16870 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
16880 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
16890 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
168a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
168b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
168c0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
168d0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
168e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
168f0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
16900 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 45  l, .          pE
16910 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73  xpr->iTable, (is
16920 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a  Rowid?0:nVal));.
16930 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
16940 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73   isRowid ? 0 : s
16950 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
16960 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
16970 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  Val, 1);..      
16980 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
16990 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
169a0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
169b0 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
169c0 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
169d0 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
169e0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
169f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
16a00 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
16a10 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
16a20 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
16a30 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
16a40 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
16a50 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
16a60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16a70 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
16a80 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  t = pExpr->x.pSe
16a90 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 45 78  lect;.        Ex
16aa0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
16ab0 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
16ac0 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
16ad0 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20  t( !isRowid );. 
16ae0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
16af0 20 4c 48 53 20 61 6e 64 20 52 48 53 20 6f 66 20   LHS and RHS of 
16b00 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
16b10 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68  do not match, th
16b20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72  at.        ** er
16b30 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ror will have be
16b40 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62  en caught long b
16b50 65 66 6f 72 65 20 77 65 20 72 65 61 63 68 20 74  efore we reach t
16b60 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
16b70 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
16b80 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  (pEList->nExpr==
16b90 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  nVal) ){.       
16ba0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
16bb0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  st;.          in
16bc0 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73  t i;.          s
16bd0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
16be0 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
16bf0 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Set, pExpr->iTab
16c00 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  le);.          d
16c10 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20 65  est.zAffSdst = e
16c20 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50  xprINAffinity(pP
16c30 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
16c40 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d          pSelect-
16c50 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
16c60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
16c70 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61   pSelect->selFla
16c80 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
16c90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
16ca0 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f  stcase( pKeyInfo
16cb0 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64  ==0 ); /* Caused
16cc0 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74   by OOM in sqlit
16cd0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29  e3KeyInfoAlloc()
16ce0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
16cf0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
16d00 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
16d10 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
16d20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
16d30 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
16d40 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b   dest.zAffSdst);
16d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
16d60 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
16d70 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  (pKeyInfo);.    
16d80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
16d90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16da0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
16db0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
16dc0 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29  , dest.zAffSdst)
16dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
16de0 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20  rt( pKeyInfo!=0 
16df0 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63  ); /* OOM will c
16e00 61 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20  ause exit after 
16e10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
16e20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
16e30 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
16e40 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
16e50 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt( pEList->nExp
16e60 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  r>0 );.         
16e70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16e80 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
16e90 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a  le(pKeyInfo) );.
16ea0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
16eb0 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b  0; i<nVal; i++){
16ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
16ed0 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65  r *p = sqlite3Ve
16ee0 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
16ef0 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  (pLeft, i);.    
16f00 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
16f10 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  ->aColl[i] = sql
16f20 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
16f30 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20 20  eCollSeq(.      
16f40 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
16f50 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  , p, pEList->a[i
16f60 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20 20  ].pExpr.        
16f70 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
16f80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
16f90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
16fa0 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  AYS(pExpr->x.pLi
16fb0 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
16fc0 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
16fd0 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
16fe0 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st).        **. 
16ff0 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61         ** For ea
17000 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62  ch expression, b
17010 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65  uild an index ke
17020 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75  y from the evalu
17030 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
17040 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e    ** store it in
17050 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
17060 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20  able. If <expr> 
17070 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
17080 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  n use.        **
17090 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66   that columns af
170a0 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c  finity when buil
170b0 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e  ding index keys.
170c0 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f   If <expr> is no
170d0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  t.        ** a c
170e0 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72  olumn, use numer
170f0 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  ic affinity..   
17100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17110 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
17120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
17130 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53  inity of the LHS
17140 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20   of the IN */.  
17150 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
17160 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
17170 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
17180 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73  pList;.        s
17190 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
171a0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
171b0 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
171c0 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 61 66 66  r3;..        aff
171d0 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
171e0 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
171f0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
17200 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
17210 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
17220 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
17230 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  B;.        }.   
17240 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
17250 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  o ){.          a
17260 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
17270 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
17280 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20  (pKeyInfo) );.  
17290 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
172a0 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c  ->aColl[0] = sql
172b0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
172c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
172d0 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Left);.        }
172e0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
172f0 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
17300 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
17310 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
17320 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
17330 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
17340 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
17350 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17360 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17370 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
17380 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
17390 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
173a0 30 2c 20 72 32 2c 20 30 2c 20 22 22 2c 20 50 34  0, r2, 0, "", P4
173b0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
173c0 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
173d0 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
173e0 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
173f0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
17400 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
17410 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
17420 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
17430 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
17440 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
17450 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
17460 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
17470 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
17480 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
17490 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
174a0 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
174b0 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
174c0 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
174d0 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
174e0 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
174f0 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
17500 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
17510 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
17520 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
17530 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
17540 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
17550 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
17560 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
17570 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
17580 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
17590 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
175a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
175b0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49  geToNoop(v, jmpI
175c0 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20  fDynamic);.     
175d0 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
175e0 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mic = -1;.      
175f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
17600 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
17610 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
17620 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
17630 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
17640 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
17650 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65  sRowid && sqlite
17660 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
17670 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20  E2, &iValToIns) 
17680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
17690 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
176a0 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74  (v, OP_InsertInt
176b0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
176c0 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b   r2, iValToIns);
176d0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
176e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33  {.            r3
176f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17700 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
17710 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
17720 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
17730 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
17740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17750 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
17760 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20  BeInt, r3,.     
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17780 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17790 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
177a0 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
177b0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
177c0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
177d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
177e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
177f0 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
17800 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20  ble, r2, r3);.  
17810 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
17820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
17830 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17840 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
17850 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
17860 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
17870 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17880 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
17890 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
178a0 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r3, 1);.      
178b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
178c0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
178d0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45  OP_IdxInsert, pE
178e0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
178f0 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r3, 1);.       
17900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17910 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17920 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
17930 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17940 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
17950 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17960 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
17970 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17980 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
17990 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
179a0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
179b0 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b  addr, (void *)pK
179c0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
179d0 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
179e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
179f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
17a00 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
17a10 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66  _SELECT:.    def
17a20 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
17a30 20 43 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c   Case 3:    (SEL
17a40 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e  ECT ... FROM ...
17a50 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f  ).      **     o
17a60 72 3a 20 20 20 20 45 58 49 53 54 53 28 53 45 4c  r:    EXISTS(SEL
17a70 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e  ECT ... FROM ...
17a80 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ).      **.     
17a90 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54   ** For a SELECT
17aa0 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
17ab0 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75 65  to put the value
17ac0 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  s for all column
17ad0 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  s of.      ** th
17ae0 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f  e first row into
17af0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
17b00 69 73 74 65 72 73 20 61 6e 64 20 72 65 74 75 72  isters and retur
17b10 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20  n the index of. 
17b20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73       ** the firs
17b30 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20  t register..    
17b40 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
17b50 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53   this is an EXIS
17b60 54 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74  TS, write an int
17b70 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73  eger 0 (not exis
17b80 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73  ts) or 1 (exists
17b90 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ).      ** into 
17ba0 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 72  a register and r
17bb0 65 74 75 72 6e 20 74 68 61 74 20 72 65 67 69 73  eturn that regis
17bc0 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20  ter number..    
17bd0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e    **.      ** In
17be0 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65   both cases, the
17bf0 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e   query is augmen
17c00 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20  ted with "LIMIT 
17c10 31 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20  1".  Any .      
17c20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c  ** preexisting l
17c30 69 6d 69 74 20 69 73 20 64 69 73 63 61 72 64 65  imit is discarde
17c40 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  d in place of th
17c50 65 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20  e new LIMIT 1.. 
17c60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65       */.      Se
17c70 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
17c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c90 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
17ca0 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64  atement to encod
17cb0 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  e */.      Selec
17cc0 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
17cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ce0 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20   /* How to deal 
17cf0 77 69 74 68 20 53 45 4c 45 43 54 20 72 65 73 75  with SELECT resu
17d00 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
17d10 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d30 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74    /* Registers t
17d40 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
17d50 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
17d60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
17d80 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f   limit expressio
17d90 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  n */..      test
17da0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
17db0 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
17dc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
17dd0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
17de0 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
17df0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
17e00 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
17e10 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
17e20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17e30 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
17e40 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
17e50 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20 20 20  elect) );..     
17e60 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
17e70 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
17e80 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70  nReg = pExpr->op
17e90 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53  ==TK_SELECT ? pS
17ea0 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  el->pEList->nExp
17eb0 72 20 3a 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  r : 1;.      sql
17ec0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
17ed0 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50 61  it(&dest, 0, pPa
17ee0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20  rse->nMem+1);.  
17ef0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
17f00 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20   += nReg;.      
17f10 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
17f20 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
17f30 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
17f40 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20   SRT_Mem;.      
17f50 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64    dest.iSdst = d
17f60 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
17f70 20 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20       dest.nSdst 
17f80 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 20 20  = nReg;.        
17f90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17fa0 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
17fb0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64   dest.iSDParm, d
17fc0 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67  est.iSDParm+nReg
17fd0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
17fe0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
17ff0 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75  it subquery resu
18000 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lt"));.      }el
18010 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74  se{.        dest
18020 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69  .eDest = SRT_Exi
18030 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
18040 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18050 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
18060 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
18070 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
18080 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58  ent((v, "Init EX
18090 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a  ISTS result"));.
180a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
180b0 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
180c0 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
180d0 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 26  db, TK_INTEGER,&
180e0 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
180f0 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  [1], 0);.      i
18100 66 28 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20  f( pSel->pLimit 
18110 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18120 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
18130 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70  rse->db, pSel->p
18140 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 29 3b 0a 20  Limit->pLeft);. 
18150 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69         pSel->pLi
18160 6d 69 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 69  mit->pLeft = pLi
18170 6d 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mit;.      }else
18180 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e  {.        pSel->
18190 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
181a0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
181b0 5f 4c 49 4d 49 54 2c 20 70 4c 69 6d 69 74 2c 20  _LIMIT, pLimit, 
181c0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
181d0 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d    pSel->iLimit =
181e0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   0;.      if( sq
181f0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
18200 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
18210 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
18220 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
18230 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e      rReg = dest.
18240 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45  iSDParm;.      E
18250 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
18260 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
18270 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65  duce);.      bre
18280 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
18290 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61   if( rHasNullFla
182a0 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
182b0 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
182c0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
182d0 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a   rHasNullFlag);.
182e0 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66    }..  if( jmpIf
182f0 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20  Dynamic>=0 ){.  
18300 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
18310 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79  pHere(v, jmpIfDy
18320 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71  namic);.  }.  sq
18330 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
18340 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65  p(pParse);..  re
18350 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
18360 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
18370 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
18380 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18390 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
183a0 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20 61  ** Expr pIn is a
183b0 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73  n IN(...) expres
183c0 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  sion. This funct
183d0 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20  ion checks that 
183e0 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65  the .** sub-sele
183f0 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  ct on the RHS of
18400 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74   the IN() operat
18410 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  or has the same 
18420 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f  number of .** co
18430 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63  lumns as the vec
18440 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
18450 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f  Or, if the RHS o
18460 66 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f  f the IN() is no
18470 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72  t .** a sub-quer
18480 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53 20  y, that the LHS 
18490 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73  is a vector of s
184a0 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ize 1..*/.int sq
184b0 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e  lite3ExprCheckIN
184c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
184d0 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e  Expr *pIn){.  in
184e0 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69  t nVector = sqli
184f0 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
18500 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20  e(pIn->pLeft);. 
18510 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73   if( (pIn->flags
18520 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
18530 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63   ){.    if( nVec
18540 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c  tor!=pIn->x.pSel
18550 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
18560 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  pr ){.      sqli
18570 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
18580 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78  r(pParse, pIn->x
18590 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
185a0 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72  ->nExpr, nVector
185b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
185c0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
185d0 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20   if( nVector!=1 
185e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65  ){.    sqlite3Ve
185f0 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61  ctorErrorMsg(pPa
18600 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29  rse, pIn->pLeft)
18610 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
18620 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18630 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
18640 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
18650 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
18660 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
18670 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n IN expression.
18680 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
18690 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
186a0 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75        x IN (valu
186b0 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a  e, value, ...).*
186c0 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61  *.** The left-ha
186d0 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73  nd side (LHS) is
186e0 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63   a scalar or vec
186f0 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  tor expression. 
18700 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   The .** right-h
18710 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 69  and side (RHS) i
18720 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65  s an array of ze
18730 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61  ro or more scala
18740 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a  r values, or a.*
18750 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49 66 20  * subquery.  If 
18760 74 68 65 20 52 48 53 20 69 73 20 61 20 73 75 62  the RHS is a sub
18770 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65  query, the numbe
18780 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
18790 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63  mns must.** matc
187a0 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
187b0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76  columns in the v
187c0 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ector on the LHS
187d0 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
187e0 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61  .** a list of va
187f0 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75  lues, the LHS mu
18800 73 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20  st be a scalar. 
18810 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70  .**.** The IN op
18820 65 72 61 74 6f 72 20 69 73 20 74 72 75 65 20 69  erator is true i
18830 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20  f the LHS value 
18840 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  is contained wit
18850 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20  hin the RHS..** 
18860 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61  The result is fa
18870 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
18880 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74  s definitely not
18890 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68   in the RHS.  Th
188a0 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  e .** result is 
188b0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73  NULL if the pres
188c0 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20  ence of the LHS 
188d0 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f  in the RHS canno
188e0 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69  t be .** determi
188f0 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  ned due to NULLs
18900 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
18910 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
18920 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74  ode that jumps t
18930 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66  o destIfFalse if
18940 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
18950 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
18960 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49  thin the RHS.  I
18970 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77  f due to NULLs w
18980 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
18990 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a  ne if the LHS.**
189a0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
189b0 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75   the RHS then ju
189c0 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c  mp to destIfNull
189d0 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  .  If the LHS is
189e0 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69   contained.** wi
189f0 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  thin the RHS the
18a00 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a  n fall through..
18a10 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65  **.** See the se
18a20 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74  parate in-operat
18a30 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74  or.md documentat
18a40 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ion file in the 
18a50 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c  canonical.** SQL
18a60 69 74 65 20 73 6f 75 72 63 65 20 74 72 65 65 20  ite source tree 
18a70 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
18a80 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
18a90 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
18aa0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
18ab0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
18ac0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
18ad0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
18ae0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
18af0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
18b00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
18b10 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
18b20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
18b30 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
18b40 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
18b50 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
18b60 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
18b70 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
18b80 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
18b90 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
18ba0 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
18bb0 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
18bc0 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
18bd0 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
18be0 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
18bf0 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
18c00 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
18c10 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
18c20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
18c30 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
18c40 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20  t rLhs;         
18c50 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28      /* Register(
18c60 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c  s) holding the L
18c70 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  HS values */.  i
18c80 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20  nt rLhsOrig;    
18c90 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75       /* LHS valu
18ca0 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72  es prior to reor
18cb0 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b  dering by aiMap[
18cc0 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ] */.  Vdbe *v; 
18cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18ce0 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
18cf0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
18d00 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30    int *aiMap = 0
18d10 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66  ;       /* Map f
18d20 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64  rom vector field
18d30 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   to index column
18d40 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
18d50 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41   = 0;       /* A
18d60 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66  ffinity string f
18d70 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a  or comparisons *
18d80 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b  /.  int nVector;
18d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
18da0 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72  e of vectors for
18db0 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
18dc0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d  r */.  int iDumm
18dd0 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
18de0 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20  Dummy parameter 
18df0 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  to exprCodeVecto
18e00 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  r() */.  Expr *p
18e10 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Left;          /
18e20 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * The LHS of the
18e30 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
18e40 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
18e50 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20          /* loop 
18e60 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
18e70 20 64 65 73 74 53 74 65 70 32 3b 20 20 20 20 20   destStep2;     
18e80 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
18e90 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73  ump when NULLs s
18ea0 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f  een in step 2 */
18eb0 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 36  .  int destStep6
18ec0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72   = 0;    /* Star
18ed0 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74  t of code for St
18ee0 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ep 6 */.  int ad
18ef0 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20  drTruthOp;      
18f00 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70  /* Address of op
18f10 63 6f 64 65 20 74 68 61 74 20 64 65 74 65 72 6d  code that determ
18f20 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20 74  ines the IN is t
18f30 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  rue */.  int des
18f40 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f  tNotNull;      /
18f50 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61  * Jump here if a
18f60 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
18f70 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65 70 20  ot true in step 
18f80 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  6 */.  int addrT
18f90 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
18fa0 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d  Top of the step-
18fb0 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c  6 loop */ ..  pL
18fc0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
18fd0 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ft;.  if( sqlite
18fe0 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61  3ExprCheckIN(pPa
18ff0 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65  rse, pExpr) ) re
19000 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65  turn;.  zAff = e
19010 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50  xprINAffinity(pP
19020 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
19030 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
19040 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
19050 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
19060 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73   aiMap = (int*)s
19070 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
19080 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  ro(.      pParse
19090 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73  ->db, nVector*(s
190a0 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a  izeof(int) + siz
190b0 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20  eof(char)) + 1. 
190c0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
190d0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
190e0 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65  ed ) goto sqlite
190f0 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f  3ExprCodeIN_oom_
19100 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74  error;..  /* Att
19110 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20  empt to compute 
19120 74 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74  the RHS. After t
19130 68 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79  his step, if any
19140 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
19150 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e  .  ** IN_INDEX_N
19160 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c  OOP is returned,
19170 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65   the table opene
19180 64 20 69 74 68 20 63 75 72 73 6f 72 20 70 45 78  d ith cursor pEx
19190 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a  pr->iTable .  **
191a0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
191b0 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
191c0 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e  p the RHS. If IN
191d0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
191e0 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68  eturned,.  ** th
191f0 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65  e RHS has not ye
19200 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a  t been coded.  *
19210 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
19220 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
19230 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
19240 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
19250 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
19260 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
19270 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
19280 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
19290 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
192a0 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
192b0 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20  arse, pExpr,.   
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192d0 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44            IN_IND
192e0 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20  EX_MEMBERSHIP | 
192f0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
19300 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
19320 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
19330 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52  IfNull ? 0 : &rR
19340 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70  hsHasNull, aiMap
19350 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
19360 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56  arse->nErr || nV
19370 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70  ector==1 || eTyp
19380 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a  e==IN_INDEX_EPH.
19390 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
193a0 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
193b0 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e  ASC || eType==IN
193c0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
193d0 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53  C .  );.#ifdef S
193e0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
193f0 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69   Confirm that ai
19400 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  Map[] contains n
19410 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76  Vector integer v
19420 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30 20  alues between 0 
19430 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72  and.  ** nVector
19440 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  -1. */.  for(i=0
19450 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
19460 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e  ){.    int j, cn
19470 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a  t;.    for(cnt=j
19480 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a  =0; j<nVector; j
19490 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d  ++) if( aiMap[j]
194a0 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20  ==i ) cnt++;.   
194b0 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20   assert( cnt==1 
194c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
194d0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53   /* Code the LHS
194e0 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  , the <expr> fro
194f0 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
19500 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20  .)". If the LHS 
19510 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f  is a .  ** vecto
19520 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73 74  r, then it is st
19530 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79  ored in an array
19540 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69   of nVector regi
19550 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a  sters starting .
19560 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a    ** at r1..  **
19570 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  .  ** sqlite3Fin
19580 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74  dInIndex() might
19590 20 68 61 76 65 20 72 65 6f 72 64 65 72 65 64 20   have reordered 
195a0 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  the fields of th
195b0 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a  e LHS vector.  *
195c0 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 69  * so that the fi
195d0 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  elds are in the 
195e0 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e  same order as an
195f0 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e   existing index.
19600 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61     The.  ** aiMa
19610 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  p[] array contai
19620 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f  ns a mapping fro
19630 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c  m the original L
19640 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74  HS field order t
19650 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64  o.  ** the field
19660 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61 74 63   order that matc
19670 68 65 73 20 74 68 65 20 52 48 53 20 69 6e 64 65  hes the RHS inde
19680 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
19690 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
196a0 50 61 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72  Parse);.  rLhsOr
196b0 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63  ig = exprCodeVec
196c0 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  tor(pParse, pLef
196d0 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66  t, &iDummy);.  f
196e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
196f0 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69  r && aiMap[i]==i
19700 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20  ; i++){} /* Are 
19710 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64  LHS fields reord
19720 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69  ered? */.  if( i
19730 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20  ==nVector ){.   
19740 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61   /* LHS fields a
19750 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64  re not reordered
19760 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72   */.    rLhs = r
19770 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65  LhsOrig;.  }else
19780 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
19790 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53   reorder the LHS
197a0 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e   fields accordin
197b0 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20  g to aiMap */.  
197c0 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33    rLhs = sqlite3
197d0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
197e0 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  rse, nVector);. 
197f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
19800 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
19810 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19820 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
19830 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68   rLhsOrig+i, rLh
19840 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a  s+aiMap[i], 0);.
19850 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
19860 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  If sqlite3FindIn
19870 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20  Index() did not 
19880 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
19890 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  n index that is.
198a0 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f    ** suitable fo
198b0 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65  r evaluating the
198c0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68   IN operator, th
198d0 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e  en evaluate usin
198e0 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  g a.  ** sequenc
198f0 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73  e of comparisons
19900 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
19910 20 69 73 20 73 74 65 70 20 28 31 29 20 69 6e 20   is step (1) in 
19920 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e  the in-operator.
19930 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67  md optimized alg
19940 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69  orithm..  */.  i
19950 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
19960 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45  EX_NOOP ){.    E
19970 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
19980 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
19990 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
199a0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
199b0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
199c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
199d0 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20      int labelOk 
199e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
199f0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
19a00 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65  nt r2, regToFree
19a10 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e  ;.    int regCkN
19a20 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ull = 0;.    int
19a30 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28   ii;.    assert(
19a40 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
19a50 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
19a60 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
19a70 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  ( destIfNull!=de
19a80 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
19a90 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73     regCkNull = s
19aa0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19ab0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19ac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19ad0 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
19ae0 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43  rLhs, rLhs, regC
19af0 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  kNull);.    }.  
19b00 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
19b10 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  List->nExpr; ii+
19b20 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  +){.      r2 = s
19b30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
19b40 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  mp(pParse, pList
19b50 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26  ->a[ii].pExpr, &
19b60 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  regToFree);.    
19b70 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
19b80 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
19b90 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61  nBeNull(pList->a
19ba0 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
19bb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19bc0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
19bd0 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c  itAnd, regCkNull
19be0 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  , r2, regCkNull)
19bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19c00 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  if( ii<pList->nE
19c10 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e  xpr-1 || destIfN
19c20 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
19c30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19c40 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19c50 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61   OP_Eq, rLhs, la
19c60 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20  belOk, r2,.     
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
19c90 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
19ca0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
19cb0 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69  rageIf(v, ii<pLi
19cc0 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
19cd0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
19ce0 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73  geIf(v, ii==pLis
19cf0 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
19d00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19d10 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
19d20 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
19d30 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
19d40 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  t( destIfNull==d
19d50 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20  estIfFalse );.  
19d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19d70 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
19d80 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61  , rLhs, destIfFa
19d90 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lse, r2,.       
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19db0 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
19dc0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64   P4_COLLSEQ); Vd
19dd0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19de0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19df0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
19e00 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a  ff[0] | SQLITE_J
19e10 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
19e20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
19e30 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19e40 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65  pParse, regToFre
19e50 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
19e60 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20  ( regCkNull ){. 
19e70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19e80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
19e90 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  ull, regCkNull, 
19ea0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
19eb0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19ec0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
19ed0 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
19ee0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se);.    }.    s
19ef0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19f00 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f  eLabel(v, labelO
19f10 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  k);.    sqlite3R
19f20 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19f30 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  arse, regCkNull)
19f40 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74  ;.    goto sqlit
19f50 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
19f60 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ished;.  }..  /*
19f70 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74   Step 2: Check t
19f80 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53  o see if the LHS
19f90 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
19fa0 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20  LL columns.  If 
19fb0 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65  the.  ** LHS doe
19fc0 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20  s contain NULLs 
19fd0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
19fe0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46  must be either F
19ff0 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20  ALSE or NULL..  
1a000 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20  ** We will then 
1a010 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20  skip the binary 
1a020 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48  search of the RH
1a030 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
1a040 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
1a050 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73  False ){.    des
1a060 74 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46  tStep2 = destIfF
1a070 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  alse;.  }else{. 
1a080 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
1a090 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74  estStep6 = sqlit
1a0a0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1a0b0 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  v);.  }.  for(i=
1a0c0 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
1a0d0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
1a0e0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
1a0f0 69 65 6c 64 53 75 62 65 78 70 72 28 70 45 78 70  ieldSubexpr(pExp
1a100 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  r->pLeft, i);.  
1a110 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1a120 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b  rCanBeNull(p) ){
1a130 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a140 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1a150 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64  sNull, rLhs+i, d
1a160 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20  estStep2);.     
1a170 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a180 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1a190 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c  * Step 3.  The L
1a1a0 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20  HS is now known 
1a1b0 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  to be non-NULL. 
1a1c0 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73   Do the binary s
1a1d0 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68  earch.  ** of th
1a1e0 65 20 52 48 53 20 75 73 69 6e 67 20 74 68 65 20  e RHS using the 
1a1f0 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20  LHS as a probe. 
1a200 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72   If found, the r
1a210 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72  esult is.  ** tr
1a220 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ue..  */.  if( e
1a230 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
1a240 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OWID ){.    /* I
1a250 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
1a260 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49   RHS is the ROWI
1a270 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65  D of table b-tre
1a280 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f  e and so we also
1a290 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61  .    ** know tha
1a2a0 74 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e  t the RHS is non
1a2b0 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77  -NULL.  Hence, w
1a2c0 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20  e combine steps 
1a2d0 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69  3 and 4.    ** i
1a2e0 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  nto a single opc
1a2f0 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ode. */.    sqli
1a300 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1a310 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70   OP_SeekRowid, p
1a320 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
1a330 73 74 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29  stIfFalse, rLhs)
1a340 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1a350 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54  ge(v);.    addrT
1a360 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33  ruthOp = sqlite3
1a370 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
1a380 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75  _Goto);  /* Retu
1a390 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c  rn True */.  }el
1a3a0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
1a3b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1a3c0 41 66 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20  Affinity, rLhs, 
1a3d0 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66  nVector, 0, zAff
1a3e0 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
1a3f0 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d  if( destIfFalse=
1a400 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20  =destIfNull ){. 
1a410 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20       /* Combine 
1a420 53 74 65 70 20 33 20 61 6e 64 20 53 74 65 70 20  Step 3 and Step 
1a430 35 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  5 into a single 
1a440 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  opcode */.      
1a450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a460 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
1a470 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
1a480 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
1a490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a4a0 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73              rLhs
1a4b0 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65  , nVector); Vdbe
1a4c0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a4d0 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45     goto sqlite3E
1a4e0 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1a4f0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
1a500 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20 33   Ordinary Step 3
1a510 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  , for the case w
1a520 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e  here FALSE and N
1a530 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74  ULL are distinct
1a540 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74   */.    addrTrut
1a550 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  hOp = sqlite3Vdb
1a560 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1a570 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
1a580 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20  Table, 0,.      
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5b0 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20  rLhs, nVector); 
1a5c0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a5d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
1a5e0 34 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69  4.  If the RHS i
1a5f0 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f  s known to be no
1a600 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69  n-NULL and we di
1a610 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20  d not find.  ** 
1a620 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20  an match on the 
1a630 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68  search above, th
1a640 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
1a650 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a  st be FALSE..  *
1a660 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61 73 4e  /.  if( rRhsHasN
1a670 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d  ull && nVector==
1a680 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1a690 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a6a0 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61  _NotNull, rRhsHa
1a6b0 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c  sNull, destIfFal
1a6c0 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  se);.    VdbeCov
1a6d0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
1a6e0 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20   /* Step 5.  If 
1a6f0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
1a700 62 6f 75 74 20 74 68 65 20 64 69 66 66 65 72 65  bout the differe
1a710 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c  nce between NULL
1a720 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c   and.  ** FALSE,
1a730 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
1a740 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20  n false. .  */. 
1a750 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65   if( destIfFalse
1a760 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73  ==destIfNull ) s
1a770 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1a780 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
1a790 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f  .  /* Step 6: Lo
1a7a0 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20  op through rows 
1a7b0 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d  of the RHS.  Com
1a7c0 70 61 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f  pare each row to
1a7d0 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49   the LHS..  ** I
1a7e0 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e  f any comparison
1a7f0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
1a800 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
1a810 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20  L.  If all.  ** 
1a820 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20  comparisons are 
1a830 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66  FALSE then the f
1a840 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46  inal result is F
1a850 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ALSE..  **.  ** 
1a860 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53  For a scalar LHS
1a870 2c 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  , it is sufficie
1a880 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74  nt to check just
1a890 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20   the first row. 
1a8a0 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a   ** of the RHS..
1a8b0 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53    */.  if( destS
1a8c0 74 65 70 36 20 29 20 73 71 6c 69 74 65 33 56 64  tep6 ) sqlite3Vd
1a8d0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a8e0 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20  , destStep6);.  
1a8f0 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
1a900 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a910 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d  P_Rewind, pExpr-
1a920 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
1a930 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76  alse);.  VdbeCov
1a940 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
1a950 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
1a960 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73   destNotNull = s
1a970 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1a980 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  bel(v);.  }else{
1a990 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63  .    /* For nVec
1a9a0 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20  tor==1, combine 
1a9b0 73 74 65 70 73 20 36 20 61 6e 64 20 37 20 62 79  steps 6 and 7 by
1a9c0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
1a9d0 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41  urning.    ** FA
1a9e0 4c 53 45 20 69 66 20 74 68 65 20 66 69 72 73 74  LSE if the first
1a9f0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
1aa00 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64  ot NULL */.    d
1aa10 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73  estNotNull = des
1aa20 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20  tIfFalse;.  }.  
1aa30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
1aa40 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  or; i++){.    Ex
1aa50 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53  pr *p;.    CollS
1aa60 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69  eq *pColl;.    i
1aa70 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47  nt r3 = sqlite3G
1aa80 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1aa90 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
1aaa0 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
1aab0 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
1aac0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1aad0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1aae0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73  Parse, p);.    s
1aaf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1ab00 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
1ab10 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c  Expr->iTable, i,
1ab20 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   r3);.    sqlite
1ab30 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1ab40 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65  P_Ne, rLhs+i, de
1ab50 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20  stNotNull, r3,. 
1ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab70 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
1ab80 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1ab90 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1aba0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1abb0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1abc0 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a  Parse, r3);.  }.
1abd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1abe0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1abf0 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  0, destIfNull);.
1ac00 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
1ac10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1ac20 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1ac30 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a  , destNotNull);.
1ac40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ac50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
1ac60 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1ac70 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20   addrTop+1);.   
1ac80 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1ac90 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37  ;..    /* Step 7
1aca0 3a 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74  :  If we reach t
1acb0 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
1acc0 6f 77 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ow that the resu
1acd0 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  lt must.    ** b
1ace0 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20  e false. */.    
1acf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ad00 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1ad10 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1ad20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68   }..  /* Jumps h
1ad30 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ere in order to 
1ad40 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a  return true. */.
1ad50 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1ad60 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 72 75  pHere(v, addrTru
1ad70 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45  thOp);..sqlite3E
1ad80 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1ad90 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d  ed:.  if( rLhs!=
1ada0 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74  rLhsOrig ) sqlit
1adb0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1adc0 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a  (pParse, rLhs);.
1add0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ade0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1adf0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1ae00 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29   "end IN expr"))
1ae10 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ;.sqlite3ExprCod
1ae20 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20  eIN_oom_error:. 
1ae30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1ae40 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70  Parse->db, aiMap
1ae50 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1ae60 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
1ae70 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Aff);.}.#endif /
1ae80 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
1ae90 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
1aea0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1aeb0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
1aec0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
1aed0 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1aee0 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
1aef0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
1af00 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
1af10 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
1af20 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
1af30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
1af40 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
1af50 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
1af60 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
1af70 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
1af80 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
1af90 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
1afa0 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
1afb0 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
1afc0 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
1afd0 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
1afe0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1aff0 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
1b000 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
1b010 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
1b020 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
1b030 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
1b040 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
1b050 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  ue;.    sqlite3A
1b060 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
1b070 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1b080 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
1b090 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
1b0a0 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
1b0b0 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
1b0c0 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
1b0d0 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
1b0e0 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
1b0f0 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
1b100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b110 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52  dOp4Dup8(v, OP_R
1b120 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
1b130 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
1b140 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _REAL);.  }.}.#e
1b150 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ndif.../*.** Gen
1b160 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
1b170 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
1b180 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
1b190 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
1b1a0 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  xt z[0..n-1] int
1b1b0 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
1b1c0 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54  .**.** Expr.u.zT
1b1d0 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55  oken is always U
1b1e0 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72  TF8 and zero-ter
1b1f0 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  minated..*/.stat
1b200 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
1b210 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
1b220 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1b230 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
1b240 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a   iMem){.  Vdbe *
1b250 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1b260 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  e;.  if( pExpr->
1b270 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
1b280 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
1b290 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
1b2a0 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
1b2b0 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
1b2c0 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
1b2d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b2e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1b2f0 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
1b300 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1b310 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c  t c;.    i64 val
1b320 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ue;.    const ch
1b330 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ar *z = pExpr->u
1b340 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73  .zToken;.    ass
1b350 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20  ert( z!=0 );.   
1b360 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f   c = sqlite3DecO
1b370 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61  rHexToI64(z, &va
1b380 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 28 63  lue);.    if( (c
1b390 3d 3d 33 20 26 26 20 21 6e 65 67 46 6c 61 67 29  ==3 && !negFlag)
1b3a0 20 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e   || (c==2) || (n
1b3b0 65 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d  egFlag && value=
1b3c0 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29  =SMALLEST_INT64)
1b3d0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1b3e0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1b3f0 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74  OINT.      sqlit
1b400 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b410 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e  e, "oversized in
1b420 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65  teger: %s%s", ne
1b430 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22  gFlag ? "-" : ""
1b440 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e  , z);.#else.#ifn
1b450 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b460 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20  HEX_INTEGER.    
1b470 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1b480 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29  rnicmp(z,"0x",2)
1b490 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1b4a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b4b0 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65  Parse, "hex lite
1b4c0 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25  ral too big: %s%
1b4d0 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a  s", negFlag?"-":
1b4e0 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  "",z);.      }el
1b4f0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
1b500 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  {.        codeRe
1b510 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
1b520 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , iMem);.      }
1b530 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1b540 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  e{.      if( neg
1b550 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
1b560 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==3 ? SMALLEST_
1b570 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
1b580 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1b590 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
1b5a0 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
1b5b0 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c  em, 0, (u8*)&val
1b5c0 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  ue, P4_INT64);. 
1b5d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1b5e0 2a 20 45 72 61 73 65 20 63 6f 6c 75 6d 6e 2d 63  * Erase column-c
1b5f0 61 63 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65  ache entry numbe
1b600 72 20 69 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  r i.*/.static vo
1b610 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65  id cacheEntryCle
1b620 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
1b630 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20  , int i){.  if( 
1b640 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1b650 65 5b 69 5d 2e 74 65 6d 70 52 65 67 20 29 7b 0a  e[i].tempReg ){.
1b660 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1b670 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
1b680 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
1b690 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50  Reg) ){.      pP
1b6a0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
1b6b0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
1b6c0 2b 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  +] = pParse->aCo
1b6d0 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a  lCache[i].iReg;.
1b6e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
1b6f0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b  se->nColCache--;
1b700 0a 20 20 69 66 28 20 69 3c 70 50 61 72 73 65 2d  .  if( i<pParse-
1b710 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20  >nColCache ){.  
1b720 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61    pParse->aColCa
1b730 63 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d  che[i] = pParse-
1b740 3e 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73  >aColCache[pPars
1b750 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20  e->nColCache];. 
1b760 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   }.}.../*.** Rec
1b770 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ord in the colum
1b780 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70  n cache that a p
1b790 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e  articular column
1b7a0 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69   from a.** parti
1b7b0 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73  cular table is s
1b7c0 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69  tored in a parti
1b7d0 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a  cular register..
1b7e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1b7f0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61  xprCacheStore(Pa
1b800 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1b810 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c   iTab, int iCol,
1b820 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
1b830 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72  t i;.  int minLr
1b840 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b  u;.  int idxLru;
1b850 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1b860 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e  che *p;..  /* Un
1b870 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61  less an error ha
1b880 73 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69  s occurred, regi
1b890 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65  ster numbers are
1b8a0 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65   always positive
1b8b0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  . */.  assert( i
1b8c0 52 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d  Reg>0 || pParse-
1b8d0 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
1b8e0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1b8f0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  d );.  assert( i
1b900 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c  Col>=-1 && iCol<
1b910 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e  32768 );  /* Fin
1b920 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ite column numbe
1b930 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  rs */..  /* The 
1b940 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
1b950 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73  he flag disables
1b960 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1b970 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
1b980 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  .  ** for testin
1b990 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69  g only - to veri
1b9a0 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61  fy that SQLite a
1b9b0 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73  lways gets the s
1b9c0 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20  ame answer.  ** 
1b9d0 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74  with and without
1b9e0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1b9f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70  e..  */.  if( Op
1ba00 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1ba10 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
1ba20 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
1ba30 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  e) ) return;..  
1ba40 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65  /* First replace
1ba50 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e   any existing en
1ba60 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  try..  **.  ** A
1ba70 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79  ctually, the way
1ba80 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1ba90 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
1baa0 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72  sed, we are guar
1bab0 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74  anteed.  ** that
1bac0 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c   the object will
1bad0 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62   never already b
1bae0 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72  e in cache.  Ver
1baf0 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74  ify this guarant
1bb00 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ee..  */.#ifndef
1bb10 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d   NDEBUG.  for(i=
1bb20 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1bb30 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
1bb40 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1bb50 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  , p++){.    asse
1bb60 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69  rt( p->iTable!=i
1bb70 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d  Tab || p->iColum
1bb80 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23  n!=iCol );.  }.#
1bb90 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
1bba0 68 65 20 63 61 63 68 65 20 69 73 20 61 6c 72 65  he cache is alre
1bbb0 61 64 79 20 66 75 6c 6c 2c 20 64 65 6c 65 74 65  ady full, delete
1bbc0 20 74 68 65 20 6c 65 61 73 74 20 72 65 63 65 6e   the least recen
1bbd0 74 6c 79 20 75 73 65 64 20 65 6e 74 72 79 20 2a  tly used entry *
1bbe0 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
1bbf0 6e 43 6f 6c 43 61 63 68 65 3e 3d 53 51 4c 49 54  nColCache>=SQLIT
1bc00 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 20 29 7b 0a  E_N_COLCACHE ){.
1bc10 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37      minLru = 0x7
1bc20 66 66 66 66 66 66 66 3b 0a 20 20 20 20 69 64 78  fffffff;.    idx
1bc30 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f  Lru = -1;.    fo
1bc40 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1bc50 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
1bc60 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
1bc70 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1bc80 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e    if( p->lru<min
1bc90 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Lru ){.        i
1bca0 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
1bcb0 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c     minLru = p->l
1bcc0 72 75 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ru;.      }.    
1bcd0 7d 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  }.    p = &pPars
1bce0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78  e->aColCache[idx
1bcf0 4c 72 75 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Lru];.  }else{. 
1bd00 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
1bd10 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65  aColCache[pParse
1bd20 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a  ->nColCache++];.
1bd30 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
1bd40 65 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74  e new entry to t
1bd50 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61  he end of the ca
1bd60 63 68 65 20 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76  che */.  p->iLev
1bd70 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
1bd80 63 68 65 4c 65 76 65 6c 3b 0a 20 20 70 2d 3e 69  cheLevel;.  p->i
1bd90 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
1bda0 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
1bdb0 6c 3b 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20 69  l;.  p->iReg = i
1bdc0 52 65 67 3b 0a 20 20 70 2d 3e 74 65 6d 70 52 65  Reg;.  p->tempRe
1bdd0 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 6c 72 75 20  g = 0;.  p->lru 
1bde0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1bdf0 43 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cnt++;.}../*.** 
1be00 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65  Indicate that re
1be10 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20  gisters between 
1be20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d  iReg..iReg+nReg-
1be30 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72  1 are being over
1be40 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67  written..** Purg
1be50 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72  e the range of r
1be60 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68  egisters from th
1be70 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
1be80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1be90 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50  xprCacheRemove(P
1bea0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1beb0 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
1bec0 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  ){.  int i = 0;.
1bed0 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73    while( i<pPars
1bee0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a  e->nColCache ){.
1bef0 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
1bf00 61 63 68 65 20 2a 70 20 3d 20 26 70 50 61 72 73  ache *p = &pPars
1bf10 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b  e->aColCache[i];
1bf20 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
1bf30 20 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69   >= iReg && p->i
1bf40 52 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20  Reg < iReg+nReg 
1bf50 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
1bf60 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
1bf70 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   i);.    }else{.
1bf80 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
1bf90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
1bfa0 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65  member the curre
1bfb0 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  nt column cache 
1bfc0 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65  context.  Any ne
1bfd0 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a  w entries added.
1bfe0 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
1bff0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74  column cache aft
1c000 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65  er this call are
1c010 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68   removed when th
1c020 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
1c030 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a  ng pop occurs..*
1c040 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1c050 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73  prCachePush(Pars
1c060 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
1c070 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1c080 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  l++;.#ifdef SQLI
1c090 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1c0a0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1c0b0 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
1c0c0 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
1c0d0 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20  printf("PUSH to 
1c0e0 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69  %d\n", pParse->i
1c0f0 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d  CacheLevel);.  }
1c100 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
1c110 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65   Remove from the
1c120 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e   column cache an
1c130 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77  y entries that w
1c140 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20  ere added since 
1c150 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69  the.** the previ
1c160 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43  ous sqlite3ExprC
1c170 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69  achePush operati
1c180 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
1c190 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20  rds, restore.** 
1c1a0 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65  the cache to the
1c1b0 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
1c1c0 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20   prior the most 
1c1d0 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a  recent Push..*/.
1c1e0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1c1f0 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a  CachePop(Parse *
1c200 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
1c210 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1c220 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c230 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72  vel>=1 );.  pPar
1c240 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d  se->iCacheLevel-
1c250 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  -;.#ifdef SQLITE
1c260 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1c270 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
1c280 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
1c290 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
1c2a0 69 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64  intf("POP  to %d
1c2b0 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61  \n", pParse->iCa
1c2c0 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23  cheLevel);.  }.#
1c2d0 65 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 20 69  endif.  while( i
1c2e0 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1c2f0 68 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  he ){.    if( pP
1c300 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1c310 69 5d 2e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  i].iLevel>pParse
1c320 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
1c330 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
1c340 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69  yClear(pParse, i
1c350 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c360 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20      i++;.    }. 
1c370 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
1c380 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
1c390 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
1c3a0 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
1c3b0 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
1c3c0 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
1c3d0 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
1c3e0 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
1c3f0 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
1c400 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
1c410 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
1c420 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
1c430 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
1c440 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
1c450 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
1c460 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1c470 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
1c480 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1c490 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
1c4a0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1c4b0 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
1c4c0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1c4d0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
1c4e0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1c4f0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
1c500 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
1c510 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
1c520 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
1c530 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74   }.}../* Generat
1c540 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1c550 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73   load into regis
1c560 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c  ter regOut a val
1c570 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70  ue that is.** ap
1c580 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
1c590 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c  e iIdxCol-th col
1c5a0 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
1c5b0 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
1c5c0 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e  e3ExprCodeLoadIn
1c5d0 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  dexColumn(.  Par
1c5e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20  se *pParse,  /* 
1c5f0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1c600 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
1c610 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20  pIdx,    /* The 
1c620 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75  index whose colu
1c630 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64  mn is to be load
1c640 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
1c650 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f  Cur,    /* Curso
1c660 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  r pointing to a 
1c670 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69  table row */.  i
1c680 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f  nt iIdxCol,    /
1c690 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  * The column of 
1c6a0 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  the index to be 
1c6b0 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
1c6c0 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53  regOut      /* S
1c6d0 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63  tore the index c
1c6e0 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74  olumn value in t
1c6f0 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1c700 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c  ){.  i16 iTabCol
1c710 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
1c720 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66  n[iIdxCol];.  if
1c730 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58  ( iTabCol==XN_EX
1c740 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  PR ){.    assert
1c750 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
1c760 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1c770 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1c780 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b  nExpr>iIdxCol );
1c790 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65  .    pParse->iSe
1c7a0 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 20  lfTab = iTabCur 
1c7b0 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  + 1;.    sqlite3
1c7c0 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61  ExprCodeCopy(pPa
1c7d0 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45  rse, pIdx->aColE
1c7e0 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e  xpr->a[iIdxCol].
1c7f0 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a  pExpr, regOut);.
1c800 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
1c810 66 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  fTab = 0;.  }els
1c820 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1c830 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
1c840 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70  fTable(pParse->p
1c850 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62  Vdbe, pIdx->pTab
1c860 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20  le, iTabCur,.   
1c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c890 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74   iTabCol, regOut
1c8a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1c8b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1c8c0 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   extract the val
1c8d0 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74  ue of the iCol-t
1c8e0 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  h column of a ta
1c8f0 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
1c900 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1c910 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20  olumnOfTable(.  
1c920 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
1c930 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65  /* The VDBE unde
1c940 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1c950 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1c960 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1c970 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1c980 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
1c990 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68  TabCur,    /* Th
1c9a0 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20  e table cursor. 
1c9b0 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f   Or the PK curso
1c9c0 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  r for WITHOUT RO
1c9d0 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  WID */.  int iCo
1c9e0 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  l,       /* Inde
1c9f0 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
1ca00 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20  to extract */.  
1ca10 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
1ca20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
1ca30 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72  alue into this r
1ca40 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1ca50 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
1ca60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ca70 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1ca80 6e 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c  n, iTabCur, iCol
1ca90 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 72  , regOut);.    r
1caa0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
1cab0 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d   iCol<0 || iCol=
1cac0 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
1cad0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cae0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
1caf0 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f  d, iTabCur, regO
1cb00 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
1cb10 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
1cb20 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
1cb30 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
1cb40 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  umn;.    int x =
1cb50 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21   iCol;.    if( !
1cb60 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
1cb70 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
1cb80 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20  b) ){.      x = 
1cb90 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
1cba0 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d  ndex(sqlite3Prim
1cbb0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
1cbc0 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  ), iCol);.    }.
1cbd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cbe0 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61  ddOp3(v, op, iTa
1cbf0 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29  bCur, x, regOut)
1cc00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
1cc10 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
1cc20 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28  e3ColumnDefault(
1cc30 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72  v, pTab, iCol, r
1cc40 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  egOut);.  }.}../
1cc50 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1cc60 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  de that will ext
1cc70 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e  ract the iColumn
1cc80 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a  -th column from.
1cc90 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  ** table pTab an
1cca0 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  d store the colu
1ccb0 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65  mn value in a re
1ccc0 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41  gister. .**.** A
1ccd0 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
1cce0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
1ccf0 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
1cd00 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68  gister iReg.  Th
1cd10 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72  is.** is not gar
1cd20 61 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74 43  anteeed for GetC
1cd30 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65  olumn() - the re
1cd40 73 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72  sult can be stor
1cd50 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67  ed in.** any reg
1cd60 69 73 74 65 72 2e 20 20 42 75 74 20 74 68 65 20  ister.  But the 
1cd70 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e  result is guaran
1cd80 74 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20  teed to land in 
1cd90 72 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a  register iReg.**
1cda0 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f   for GetColumnTo
1cdb0 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Reg()..**.** The
1cdc0 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
1cdd0 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61  en cursor to pTa
1cde0 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e  b in iTable when
1cdf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1ce00 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20   is called.  If 
1ce10 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63  iColumn<0 then c
1ce20 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
1ce30 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
1ce40 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  he rowid..*/.int
1ce50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ce60 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  GetColumn(.  Par
1ce70 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
1ce80 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1ce90 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1cea0 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1ceb0 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
1cec0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1ced0 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
1cee0 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
1cef0 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
1cf00 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1cf10 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
1cf20 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1cf30 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1cf40 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
1cf50 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1cf60 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a   iReg,        /*
1cf70 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
1cf80 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  ere */.  u8 p5  
1cf90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20            /* P5 
1cfa0 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c  value for OP_Col
1cfb0 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29  umn + FLAGS */.)
1cfc0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1cfd0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1cfe0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1cff0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
1d000 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
1d010 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
1d020 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1d030 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
1d040 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d    if( p->iTable=
1d050 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43  =iTable && p->iC
1d060 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
1d070 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d  {.      p->lru =
1d080 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
1d090 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
1d0a0 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52  te3ExprCachePinR
1d0b0 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
1d0c0 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20  p->iReg);.      
1d0d0 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a  return p->iReg;.
1d0e0 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73      }.  }  .  as
1d0f0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
1d100 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1d110 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1d120 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c  v, pTab, iTable,
1d130 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
1d140 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20  .  if( p5 ){.   
1d150 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1d160 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d  geP5(v, p5);.  }
1d170 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c  else{   .    sql
1d180 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1d190 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c  re(pParse, iTabl
1d1a0 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
1d1b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d1c0 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  iReg;.}.void sql
1d1d0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1d1e0 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61  olumnToReg(.  Pa
1d1f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
1d200 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1d210 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1d220 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
1d230 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
1d240 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1d250 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
1d260 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
1d270 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
1d280 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1d290 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
1d2a0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1d2b0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1d2c0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
1d2d0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1d2e0 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20 2f  t iReg         /
1d2f0 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
1d300 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1d310 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1d320 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
1d330 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f  Parse, pTab, iCo
1d340 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52  lumn, iTable, iR
1d350 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31  eg, 0);.  if( r1
1d360 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65 33  !=iReg ) sqlite3
1d370 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
1d380 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
1d390 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d  py, r1, iReg);.}
1d3a0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  .../*.** Clear a
1d3b0 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  ll column cache 
1d3c0 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64  entries..*/.void
1d3d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1d3e0 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  eClear(Parse *pP
1d3f0 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
1d400 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1d410 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1d420 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1d430 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1d440 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1d450 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20  tf("CLEAR\n");. 
1d460 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
1d470 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
1d480 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a  ColCache; i++){.
1d490 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1d4a0 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d  aColCache[i].tem
1d4b0 70 52 65 67 0a 20 20 20 20 20 26 26 20 70 50 61  pReg.     && pPa
1d4c0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
1d4d0 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
1d4e0 61 54 65 6d 70 52 65 67 29 0a 20 20 20 20 29 7b  aTempReg).    ){
1d4f0 0a 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  .       pParse->
1d500 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
1d510 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
1d520 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1d530 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a  [i].iReg;.    }.
1d540 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43    }.  pParse->nC
1d550 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a  olCache = 0;.}..
1d560 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
1d570 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66   fact that an af
1d580 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61  finity change ha
1d590 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43  s occurred on iC
1d5a0 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  ount.** register
1d5b0 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
1d5c0 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20  iStart..*/.void 
1d5d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1d5e0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50  AffinityChange(P
1d5f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1d600 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43  t iStart, int iC
1d610 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  ount){.  sqlite3
1d620 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1d630 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20  pParse, iStart, 
1d640 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCount);.}../*.*
1d650 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d660 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
1d670 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
1d680 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
1d690 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
1d6a0 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20  To..iTo+nReg-1. 
1d6b0 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Keep the column 
1d6c0 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65  cache up-to-date
1d6d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d6e0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
1d6f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1d700 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
1d710 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73   int nReg){.  as
1d720 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f  sert( iFrom>=iTo
1d730 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e  +nReg || iFrom+n
1d740 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71  Reg<=iTo );.  sq
1d750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d760 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1d770 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
1d780 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c  To, nReg);.  sql
1d790 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
1d7a0 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f  ove(pParse, iFro
1d7b0 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66  m, nReg);.}..#if
1d7c0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1d7d0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1d7e0 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  d(SQLITE_COVERAG
1d7f0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1d800 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79  turn true if any
1d810 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
1d820 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54   range iFrom..iT
1d830 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a  o (inclusive).**
1d840 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
1d850 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   of the column c
1d860 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
1d870 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1d880 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
1d890 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20   and testcase() 
1d8a0 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61  macros only.** a
1d8b0 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  nd does not appe
1d8c0 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62  ar in a normal b
1d8d0 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
1d8e0 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  int usedAsColumn
1d8f0 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
1d900 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
1d910 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20  int iTo){.  int 
1d920 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1d930 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
1d940 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1d950 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
1d960 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1d970 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
1d980 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t r = p->iReg;. 
1d990 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20     if( r>=iFrom 
1d9a0 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75  && r<=iTo ) retu
1d9b0 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45  rn 1;    /*NO_TE
1d9c0 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ST*/.  }.  retur
1d9d0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
1d9e0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c   SQLITE_DEBUG ||
1d9f0 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45   SQLITE_COVERAGE
1da00 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  _TEST */.../*.**
1da10 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61   Convert a scala
1da20 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  r expression nod
1da30 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  e to a TK_REGIST
1da40 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a  ER referencing.*
1da50 2a 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  * register iReg.
1da60 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73    The caller mus
1da70 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 52  t ensure that iR
1da80 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  eg already conta
1da90 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ins.** the corre
1daa0 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  ct value for the
1dab0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
1dac0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
1dad0 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72 20  ToRegister(Expr 
1dae0 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  *p, int iReg){. 
1daf0 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b   p->op2 = p->op;
1db00 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  .  p->op = TK_RE
1db10 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61  GISTER;.  p->iTa
1db20 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78  ble = iReg;.  Ex
1db30 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
1db40 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a  p, EP_Skip);.}..
1db50 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61  /*.** Evaluate a
1db60 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69  n expression (ei
1db70 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72  ther a vector or
1db80 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
1db90 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a  sion) and store.
1dba0 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  ** the result in
1dbb0 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d   continguous tem
1dbc0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
1dbd0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1dbe0 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  dex of.** the fi
1dbf0 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73 65  rst register use
1dc00 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  d to store the r
1dc10 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  esult..**.** If 
1dc20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73  the returned res
1dc30 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
1dc40 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c  a temporary scal
1dc50 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  ar, then also wr
1dc60 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69  ite.** that regi
1dc70 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f  ster number into
1dc80 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49   *piFreeable.  I
1dc90 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1dca0 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a  esult register.*
1dcb0 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  * is not a tempo
1dcc0 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20 65  rary or if the e
1dcd0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
1dce0 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65  ector set *piFre
1dcf0 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a  eable.** to 0..*
1dd00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
1dd10 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
1dd20 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1dd30 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61  *p, int *piFreea
1dd40 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73  ble){.  int iRes
1dd50 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75  ult;.  int nResu
1dd60 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
1dd70 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20  VectorSize(p);. 
1dd80 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20   if( nResult==1 
1dd90 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d  ){.    iResult =
1dda0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ddb0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Temp(pParse, p, 
1ddc0 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d  piFreeable);.  }
1ddd0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65  else{.    *piFre
1dde0 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69  eable = 0;.    i
1ddf0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  f( p->op==TK_SEL
1de00 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ECT ){.#if SQLIT
1de10 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1de20 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20        iResult = 
1de30 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  0;.#else.      i
1de40 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
1de50 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
1de60 61 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  arse, p, 0, 0);.
1de70 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1de80 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1de90 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70       iResult = p
1dea0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1deb0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
1dec0 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20  m += nResult;.  
1ded0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1dee0 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20  Result; i++){.  
1def0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1df00 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
1df10 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69  pParse, p->x.pLi
1df20 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1df30 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  i+iResult);.    
1df40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1df50 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a  return iResult;.
1df60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1df70 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
1df80 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
1df90 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
1dfa0 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1dfb0 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
1dfc0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1dfd0 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
1dfe0 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1dff0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1e000 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1e010 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1e020 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1e030 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1e040 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1e050 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1e060 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1e070 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1e080 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1e090 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1e0a0 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1e0b0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1e0c0 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1e0d0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1e0e0 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1e0f0 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1e100 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1e110 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1e120 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1e130 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e140 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1e150 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1e160 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1e170 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1e180 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1e190 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1e1a0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1e1b0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1e1c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1e1d0 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1e1e0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1e1f0 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1e200 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1e210 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1e220 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1e230 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1e240 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1e250 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1e260 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1e270 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1e280 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1e290 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1e2a0 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1e2b0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1e2c0 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1e2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1e2e0 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1e2f0 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20  mbers */.  Expr 
1e300 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20  tempX;          
1e310 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
1e320 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  y expression nod
1e330 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20  e */.  int p5 = 
1e340 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  0;..  assert( ta
1e350 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
1e360 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
1e370 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
1e380 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1e390 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1e3a0 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
1e3b0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
1e3c0 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
1e3d0 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
1e3e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
1e3f0 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
1e400 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1e410 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1e420 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1e430 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1e440 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
1e450 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
1e460 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1e470 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
1e480 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
1e490 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
1e4a0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
1e4b0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
1e4c0 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
1e4d0 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  m>0 );.        r
1e4e0 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d  eturn pCol->iMem
1e4f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1e500 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
1e510 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
1e520 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e530 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1e540 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
1e550 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20  ortingIdxPTab,. 
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1e580 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
1e590 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e5a0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e5b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e5c0 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  /* Otherwise, fa
1e5d0 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
1e5e0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20   TK_COLUMN case 
1e5f0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
1e600 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
1e610 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20       int iTab = 
1e620 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
1e630 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20       if( iTab<0 
1e640 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1e650 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c  Parse->iSelfTab<
1e660 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1e670 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1e680 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1e690 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1e6a0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1e6b0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1e6c0 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  rn pExpr->iColum
1e6d0 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  n - pParse->iSel
1e6e0 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 65  fTab;.        }e
1e6f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1e700 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1e710 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1e720 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1e730 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1e740 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1e750 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1e760 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1e770 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1e780 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1e790 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1e7a0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1e7b0 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 1;.        }. 
1e7c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1e7d0 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1e7e0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1e7f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  rse, pExpr->pTab
1e800 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e820 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1e830 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20   iTab, target,. 
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1e860 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d  xpr->op2);.    }
1e870 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
1e880 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
1e890 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1e8a0 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
1e8b0 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1e8c0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1e8d0 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 45      case TK_TRUE
1e8e0 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20 20 73  FALSE: {.      s
1e8f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e900 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1e910 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
1e920 56 61 6c 75 65 28 70 45 78 70 72 29 2c 20 74 61  Value(pExpr), ta
1e930 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1e940 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1e950 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1e960 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1e970 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
1e980 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1e990 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1e9a0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e9b0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1e9c0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1e9d0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1e9e0 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
1e9f0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1ea00 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  et;.    }.#endif
1ea10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
1ea20 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ING: {.      ass
1ea30 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1ea40 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1ea50 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1ea60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1ea70 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67  adString(v, targ
1ea80 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  et, pExpr->u.zTo
1ea90 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ken);.      retu
1eaa0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1eab0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1eac0 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
1ead0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1eae0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
1eaf0 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1eb00 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1eb10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1eb20 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
1eb30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
1eb40 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
1eb50 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
1eb60 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61  ar *z;.      cha
1eb70 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20  r *zBlob;.      
1eb80 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1eb90 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1eba0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1ebb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1ebc0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
1ebd0 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e  =='x' || pExpr->
1ebe0 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27  u.zToken[0]=='X'
1ebf0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ec00 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1ec10 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  n[1]=='\'' );.  
1ec20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e      z = &pExpr->
1ec30 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20  u.zToken[2];.   
1ec40 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
1ec50 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20  rlen30(z) - 1;. 
1ec60 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e       assert( z[n
1ec70 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
1ec80 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   zBlob = sqlite3
1ec90 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65  HexToBlob(sqlite
1eca0 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e  3VdbeDb(v), z, n
1ecb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ecc0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1ecd0 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67  _Blob, n/2, targ
1ece0 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34  et, 0, zBlob, P4
1ecf0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
1ed00 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1ed10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1ed20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
1ed30 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
1ed40 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1ed50 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1ed60 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1ed70 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ed80 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
1ed90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1eda0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
1edb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1edc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1edd0 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
1ede0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
1edf0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1ee00 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1ee10 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
1ee20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1ee30 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75  = sqlite3VListNu
1ee40 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e  mToName(pParse->
1ee50 70 56 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 69  pVList, pExpr->i
1ee60 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
1ee70 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ee80 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27  u.zToken[0]=='?'
1ee90 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72   || strcmp(pExpr
1eea0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d  ->u.zToken, z)==
1eeb0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
1eec0 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d  rse->pVList[0] =
1eed0 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65 20   0; /* Indicate 
1eee0 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e  VList may no lon
1eef0 67 65 72 20 62 65 20 65 6e 6c 61 72 67 65 64 20  ger be enlarged 
1ef00 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
1ef10 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
1ef20 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53  , (char*)z, P4_S
1ef30 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
1ef40 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1ef50 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
1ef60 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
1ef70 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1ef80 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
1ef90 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1efa0 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
1efb0 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
1efc0 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
1efd0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
1efe0 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
1eff0 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
1f000 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1f010 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1f020 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
1f030 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
1f040 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
1f050 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
1f060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f070 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1f080 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
1f090 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1f0a0 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
1f0b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1f0c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f0d0 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20  _Cast, target,. 
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66         sqlite3Af
1f100 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
1f110 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b  ->u.zToken, 0));
1f120 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f130 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
1f140 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  he(pParse, inReg
1f150 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20  , inReg) );.    
1f160 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f170 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1f180 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1f190 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
1f1a0 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65   inReg;.    }.#e
1f1b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1f1c0 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
1f1d0 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
1f1e0 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
1f1f0 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
1f200 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
1f210 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20  TK_NE;.      p5 
1f220 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
1f230 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74  .      /* fall-t
1f240 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61  hrough */.    ca
1f250 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1f260 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1f270 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1f280 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1f290 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1f2a0 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1f2b0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
1f2c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1f2d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1f2e0 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66  xprIsVector(pLef
1f2f0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  t) ){.        co
1f300 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28  deVectorCompare(
1f310 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1f320 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a  arget, op, p5);.
1f330 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f340 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1f350 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f360 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65  arse, pLeft, &re
1f370 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
1f380 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1f390 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f3a0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f3b0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1f3c0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1f3d0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1f3e0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1f3f0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  p,.            r
1f400 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
1f410 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70  LITE_STOREP2 | p
1f420 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  5);.        asse
1f430 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
1f440 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f450 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
1f460 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1f470 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
1f480 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
1f490 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f4a0 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
1f4b0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1f4c0 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
1f4d0 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
1f4e0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f4f0 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
1f500 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1f510 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
1f520 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
1f530 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f540 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
1f550 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1f560 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
1f570 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
1f580 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f590 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
1f5a0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
1f5b0 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  q);.        asse
1f5c0 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
1f5d0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f5e0 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
1f5f0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
1f600 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
1f610 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f620 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
1f630 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1f640 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
1f650 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f660 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1f670 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
1f680 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
1f690 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
1f6a0 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
1f6b0 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
1f6c0 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
1f6d0 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
1f6e0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
1f6f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
1f700 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
1f710 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
1f720 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
1f730 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
1f740 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1f750 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
1f760 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65  );            te
1f770 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41  stcase( op==TK_A
1f780 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
1f790 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
1f7a0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
1f7b0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f7c0 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  K_OR );.      as
1f7d0 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
1f7e0 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20  P_Add );        
1f7f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f800 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
1f810 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
1f820 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
1f830 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28  );     testcase(
1f840 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
1f850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f860 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
1f870 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74  der );      test
1f880 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
1f890 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f8a0 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
1f8b0 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74  BitAnd );      t
1f8c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f8d0 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  BITAND );.      
1f8e0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
1f8f0 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20  ==OP_BitOr );   
1f900 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f910 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
1f920 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f930 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
1f940 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61   );       testca
1f950 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48  se( op==TK_SLASH
1f960 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f970 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
1f980 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74  ShiftLeft );   t
1f990 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f9a0 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  LSHIFT );.      
1f9b0 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
1f9c0 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
1f9d0 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f   );  testcase( o
1f9e0 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a  p==TK_RSHIFT );.
1f9f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1fa00 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
1fa10 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  at );      testc
1fa20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43  ase( op==TK_CONC
1fa30 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  AT );.      r1 =
1fa40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fa50 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1fa60 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1fa70 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1fa80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fa90 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1faa0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1fab0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73  gFree2);.      s
1fac0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1fad0 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20  (v, op, r2, r1, 
1fae0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74  target);.      t
1faf0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fb00 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1fb10 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1fb20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1fb30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fb40 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
1fb50 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
1fb60 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
1fb70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fb80 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
1fb90 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
1fba0 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
1fbb0 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
1fbc0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31  pParse, pLeft, 1
1fbd0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1fbe0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1fbf0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1fc00 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1fc10 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65  OINT.      }else
1fc20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
1fc30 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
1fc40 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1fc50 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1fc60 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1fc70 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
1fc80 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75  Real(v, pLeft->u
1fc90 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67  .zToken, 1, targ
1fca0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1fcb0 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64  urn target;.#end
1fcc0 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  if.      }else{.
1fcd0 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70          tempX.op
1fce0 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20   = TK_INTEGER;. 
1fcf0 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61         tempX.fla
1fd00 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs = EP_IntValue
1fd10 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20  |EP_TokenOnly;. 
1fd20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69         tempX.u.i
1fd30 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20  Value = 0;.     
1fd40 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1fd50 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1fd60 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67  se, &tempX, &reg
1fd70 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
1fd80 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1fd90 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1fda0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1fdb0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1fdc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1fdd0 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
1fde0 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72  act, r2, r1, tar
1fdf0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  get);.        te
1fe00 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1fe10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
1fe20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fe30 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
1fe40 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
1fe50 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
1fe60 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
1fe70 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20  ==OP_BitNot );  
1fe80 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fe90 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20  K_BITNOT );.    
1fea0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
1feb0 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20  ==OP_Not );     
1fec0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1fed0 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20  ==TK_NOT );.    
1fee0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1fef0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1ff00 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1ff10 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1ff20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1ff30 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1ff40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ff50 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69  Op2(v, op, r1, i
1ff60 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
1ff70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1ff80 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20  se TK_TRUTH: {. 
1ff90 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b       int isTrue;
1ffa0 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f      /* IS TRUE o
1ffb0 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f  r IS NOT TRUE */
1ffc0 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 72 6d  .      int bNorm
1ffd0 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54 52 55 45  al;   /* IS TRUE
1ffe0 20 6f 72 20 49 53 20 46 41 4c 53 45 20 2a 2f 0a   or IS FALSE */.
1fff0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
20000 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
20010 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
20020 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
20030 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20040 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
20050 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73        isTrue = s
20060 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56  qlite3ExprTruthV
20070 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67  alue(pExpr->pRig
20080 68 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72 6d  ht);.      bNorm
20090 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d  al = pExpr->op2=
200a0 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74 65  =TK_IS;.      te
200b0 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26  stcase( isTrue &
200c0 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20  & bNormal);.    
200d0 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54    testcase( !isT
200e0 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b  rue && bNormal);
200f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20100 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
20110 50 5f 49 73 54 72 75 65 2c 20 72 31 2c 20 69 6e  P_IsTrue, r1, in
20120 52 65 67 2c 20 21 69 73 54 72 75 65 2c 20 69 73  Reg, !isTrue, is
20130 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b  True ^ bNormal);
20140 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20150 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
20160 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
20170 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
20180 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
20190 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
201a0 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
201b0 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
201c0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
201d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
201e0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
201f0 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
20200 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
20210 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  LL );.      sqli
20220 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20230 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
20240 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
20250 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
20260 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
20270 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
20280 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
20290 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
202a0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  e1==0 );.      a
202b0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
202c0 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72  eAddOp1(v, op, r
202d0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
202e0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
202f0 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
20300 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
20310 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
20320 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
20330 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20340 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74  OP_Integer, 0, t
20350 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
20360 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
20370 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
20380 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
20390 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
203a0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
203b0 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
203c0 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
203d0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
203e0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
203f0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
20400 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
20410 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
20420 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20430 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20440 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
20450 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45  egate: %s()", pE
20460 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
20470 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20480 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66       return pInf
20490 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
204a0 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
204b0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
204c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
204d0 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
204e0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
204f0 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
20500 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
20510 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
20520 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
20530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20540 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
20550 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
20560 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
20570 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
20580 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
20590 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
205a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
205b0 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  *zId;       /* T
205c0 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
205d0 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f   */.      u32 co
205e0 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  nstMask = 0;    
205f0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63   /* Mask of func
20600 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
20610 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  hat are constant
20620 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20640 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20650 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
20660 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
20670 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  db;  /* The data
20680 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
20690 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
206a0 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20  = ENC(db);      
206b0 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f  /* The text enco
206c0 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69  ding used by thi
206d0 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
206e0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
206f0 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20  ll = 0;    /* A 
20700 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
20710 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  ce */..      if(
20720 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
20730 50 61 72 73 65 29 20 26 26 20 73 71 6c 69 74 65  Parse) && sqlite
20740 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
20750 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b  otJoin(pExpr) ){
20760 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20  .        /* SQL 
20770 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65  functions can be
20780 20 65 78 70 65 6e 73 69 76 65 2e 20 53 6f 20 74   expensive. So t
20790 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73 74  ry to move const
207a0 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20  ant functions.  
207b0 20 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66 20        ** out of 
207c0 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20  the inner loop, 
207d0 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
207e0 6e 73 20 61 6e 20 65 78 74 72 61 20 4f 50 5f 43  ns an extra OP_C
207f0 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  opy. */.        
20800 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
20810 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
20820 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b  rse, pExpr, -1);
20830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
20840 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
20850 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
20860 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
20870 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
20880 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
20890 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
208a0 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
208b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
208c0 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
208d0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
208e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
208f0 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20  nFarg = pFarg ? 
20900 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30  pFarg->nExpr : 0
20910 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20920 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
20930 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
20940 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49  lue) );.      zI
20950 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  d = pExpr->u.zTo
20960 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20  ken;.      pDef 
20970 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
20980 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e  ction(db, zId, n
20990 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23  Farg, enc, 0);.#
209a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
209b0 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f  BLE_UNKNOWN_SQL_
209c0 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69  FUNCTION.      i
209d0 66 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50  f( pDef==0 && pP
209e0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
209f0 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
20a00 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
20a10 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e  ion(db, "unknown
20a20 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  ", nFarg, enc, 0
20a30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
20a40 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  f.      if( pDef
20a50 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69  ==0 || pDef->xFi
20a60 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20  nalize!=0 ){.   
20a70 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
20a80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
20a90 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20  known function: 
20aa0 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20  %s()", zId);.   
20ab0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20ac0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74    }..      /* At
20ad0 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69  tempt a direct i
20ae0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
20af0 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f   the built-in CO
20b00 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20  ALESCE() and.   
20b10 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66     ** IFNULL() f
20b20 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  unctions.  This 
20b30 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61  avoids unnecessa
20b40 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66  ry evaluation of
20b50 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  .      ** argume
20b60 6e 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72  nts past the fir
20b70 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75  st non-NULL argu
20b80 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
20b90 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
20ba0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
20bb0 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20  E_FUNC_COALESCE 
20bc0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
20bd0 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c  ndCoalesce = sql
20be0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
20bf0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73  l(v);.        as
20c00 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29  sert( nFarg>=2 )
20c10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20c20 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
20c30 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
20c40 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
20c50 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
20c60 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
20c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20c80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20c90 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c  NotNull, target,
20ca0 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
20cb0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
20cc0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
20cd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20ce0 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
20cf0 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20  e, target, 1);. 
20d00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20d10 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
20d20 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
20d30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20d40 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
20d50 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[i].pExpr, targ
20d60 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  et);.          s
20d70 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
20d80 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
20d90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
20da0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
20db0 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c  Label(v, endCoal
20dc0 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62  esce);.        b
20dd0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
20de0 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49       /* The UNLI
20df0 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20  KELY() function 
20e00 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65  is a no-op.  The
20e10 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76   result is the v
20e20 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  alue.      ** of
20e30 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
20e40 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
20e50 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
20e60 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
20e70 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29  _FUNC_UNLIKELY )
20e80 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
20e90 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20  ( nFarg>=1 );.  
20ea0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
20eb0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
20ec0 65 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  et(pParse, pFarg
20ed0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
20ee0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  rget);.      }..
20ef0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
20f00 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  BUG.      /* The
20f10 20 41 46 46 49 4e 49 54 59 28 29 20 66 75 6e 63   AFFINITY() func
20f20 74 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  tion evaluates t
20f30 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  o a string that 
20f40 64 65 73 63 72 69 62 65 73 0a 20 20 20 20 20 20  describes.      
20f50 2a 2a 20 74 68 65 20 74 79 70 65 20 61 66 66 69  ** the type affi
20f60 6e 69 74 79 20 6f 66 20 74 68 65 20 61 72 67 75  nity of the argu
20f70 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20 75  ment.  This is u
20f80 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
20f90 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
20fa0 53 51 4c 69 74 65 20 74 79 70 65 20 6c 6f 67 69  SQLite type logi
20fb0 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
20fc0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
20fd0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
20fe0 55 4e 43 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a  UNC_AFFINITY ){.
20ff0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
21000 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20  ar *azAff[] = { 
21010 22 62 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c 20  "blob", "text", 
21020 22 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e 74 65  "numeric", "inte
21030 67 65 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a  ger", "real" };.
21040 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
21050 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
21060 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
21070 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69        aff = sqli
21080 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
21090 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
210a0 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
210b0 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
210c0 67 28 76 2c 20 74 61 72 67 65 74 2c 20 0a 20 20  g(v, target, .  
210d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210e0 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66 20              aff 
210f0 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49  ? azAff[aff-SQLI
21100 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22  TE_AFF_BLOB] : "
21110 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20  none");.        
21120 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
21130 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
21140 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
21150 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
21160 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
21170 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
21180 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
21190 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
211a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
211b0 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20   i==31 );.      
211c0 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
211d0 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20   MASKBIT32(i);. 
211e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
211f0 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
21200 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
21210 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30  UNC_NEEDCOLL)!=0
21220 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
21230 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
21240 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
21250 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  eq(pParse, pFarg
21260 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
21270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21280 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
21290 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
212a0 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20  constMask ){.   
212b0 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72         r1 = pPar
212c0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
212d0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
212e0 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20  em += nFarg;.   
212f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21300 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
21310 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
21320 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20  Parse, nFarg);. 
21330 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
21340 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28    /* For length(
21350 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66  ) and typeof() f
21360 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20  unctions with a 
21370 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c  column argument,
21380 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
21390 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72  the P5 parameter
213a0 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d   to the OP_Colum
213b0 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c  n opcode to OPFL
213c0 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20  AG_LENGTHARG.   
213d0 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41       ** or OPFLA
213e0 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70  G_TYPEOFARG resp
213f0 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f  ectively, to avo
21400 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64  id unnecessary d
21410 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ata.        ** l
21420 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  oading..        
21430 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
21440 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
21450 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  & (SQLITE_FUNC_L
21460 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e  ENGTH|SQLITE_FUN
21470 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b  C_TYPEOF))!=0 ){
21480 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78  .          u8 ex
21490 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  prOp;.          
214a0 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31  assert( nFarg==1
214b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
214c0 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30  sert( pFarg->a[0
214d0 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
214e0 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d          exprOp =
214f0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21500 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20  pr->op;.        
21510 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b    if( exprOp==TK
21520 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f  _COLUMN || exprO
21530 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
21540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21550 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
21560 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c  UNC_LENGTH==OPFL
21570 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
21580 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
21590 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
215a0 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54  TYPEOF==OPFLAG_T
215b0 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20  YPEOFARG );.    
215c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
215d0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
215e0 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  s & OPFLAG_LENGT
215f0 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
21600 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e      pFarg->a[0].
21610 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20  pExpr->op2 = .  
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21630 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
21640 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  & (OPFLAG_LENGTH
21650 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f  ARG|OPFLAG_TYPEO
21660 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20  FARG);.         
21670 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
21680 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21690 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
216a0 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65  e);     /* Ticke
216b0 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a  t 2ea2425d34be *
216c0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
216d0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
216e0 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c  t(pParse, pFarg,
216f0 20 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20   r1, 0,.        
21700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21710 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45          SQLITE_E
21720 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45  CEL_DUP|SQLITE_E
21730 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20  CEL_FACTOR);.   
21740 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21750 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
21760 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  ;      /* Ticket
21770 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
21780 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21790 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20        r1 = 0;.  
217a0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
217b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
217c0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
217d0 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
217e0 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
217f0 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
21800 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
21810 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
21820 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
21830 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
21840 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
21850 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
21860 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
21870 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
21880 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
21890 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
218a0 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
218b0 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
218c0 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
218d0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
218e0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
218f0 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
21900 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
21910 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
21920 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
21930 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
21940 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
21950 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
21960 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
21970 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
21980 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
21990 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
219a0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
219b0 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
219c0 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
219d0 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
219e0 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
219f0 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
21a00 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
21a10 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
21a20 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
21a30 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
21a40 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
21a50 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
21a60 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
21a70 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66  >=2 && (pExpr->f
21a80 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46  lags & EP_InfixF
21a90 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
21aa0 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
21ab0 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
21ac0 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
21ad0 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e  rg, pFarg->a[1].
21ae0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
21af0 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20  lse if( nFarg>0 
21b00 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
21b10 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
21b20 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
21b30 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
21b40 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
21b50 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
21b60 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  f.      if( pDef
21b70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
21b80 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
21b90 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  LL ){.        if
21ba0 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
21bb0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
21bc0 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
21bd0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
21be0 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
21bf0 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
21c00 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
21c10 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
21c20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46  SQLITE_ENABLE_OF
21c30 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20  FSET_SQL_FUNC.  
21c40 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
21c50 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
21c60 5f 46 55 4e 43 5f 4f 46 46 53 45 54 20 29 7b 0a  _FUNC_OFFSET ){.
21c70 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 41          Expr *pA
21c80 72 67 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rg = pFarg->a[0]
21c90 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
21ca0 69 66 28 20 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b  if( pArg->op==TK
21cb0 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
21cc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21cd0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66  AddOp3(v, OP_Off
21ce0 73 65 74 2c 20 70 41 72 67 2d 3e 69 54 61 62 6c  set, pArg->iTabl
21cf0 65 2c 20 70 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e  e, pArg->iColumn
21d00 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
21d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21d20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21d30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
21d40 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
21d50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
21d60 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
21d70 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
21d80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
21d90 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
21da0 20 3f 20 4f 50 5f 50 75 72 65 46 75 6e 63 30 20   ? OP_PureFunc0 
21db0 3a 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a  : OP_Function0,.
21dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21dd0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
21de0 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c  ask, r1, target,
21df0 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34   (char*)pDef, P4
21e00 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
21e10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
21e20 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46  angeP5(v, (u8)nF
21e30 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arg);.      }.  
21e40 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 26 26      if( nFarg &&
21e50 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b   constMask==0 ){
21e60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21e70 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
21e80 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61  (pParse, r1, nFa
21e90 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
21ea0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
21eb0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
21ec0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21ed0 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
21ee0 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
21ef0 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
21f00 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
21f10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
21f20 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
21f30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21f40 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
21f50 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
21f60 4b 5f 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f  K_SELECT && (nCo
21f70 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
21f80 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
21f90 78 70 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20  xpr)!=1 ){.     
21fa0 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
21fb0 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
21fc0 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20   nCol, 1);.     
21fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21fe0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6f  return sqlite3Co
21ff0 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
22000 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
22010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22020 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
22030 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f   case TK_SELECT_
22040 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
22050 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69 66 28  int n;.      if(
22060 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
22070 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
22080 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
22090 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  ->iTable = sqlit
220a0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
220b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
220c0 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Left, 0, 0);.   
220d0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
220e0 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
220f0 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c  ==0 || pExpr->pL
22100 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  eft->op==TK_SELE
22110 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
22120 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20  pExpr->iTable.  
22130 20 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69       && pExpr->i
22140 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73 71 6c 69  Table!=(n = sqli
22150 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
22160 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 29  e(pExpr->pLeft))
22170 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
22180 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
22190 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63  sg(pParse, "%d c
221a0 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20  olumns assigned 
221b0 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20  %d values",.    
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221d0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
221e0 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20  r->iTable, n);. 
221f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
22200 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  urn pExpr->pLeft
22210 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72  ->iTable + pExpr
22220 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d  ->iColumn;.    }
22230 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
22240 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
22250 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
22260 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
22270 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
22280 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
22290 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
222a0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
222b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
222c0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
222d0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
222e0 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
222f0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
22300 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
22310 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
22320 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22330 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
22340 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
22350 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
22360 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
22370 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alse);.      sql
22380 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22390 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
223a0 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  get, 0);.      s
223b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
223c0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
223d0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  Null);.      ret
223e0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
223f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
22400 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
22410 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20   */...    /*.   
22420 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   **    x BETWEEN
22430 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a   y AND z.    **.
22440 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65      ** This is e
22450 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20  quivalent to.   
22460 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e   **.    **    x>
22470 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
22480 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73  **.    ** X is s
22490 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
224a0 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
224b0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
224c0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
224d0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20  pExpr..    ** Z 
224e0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
224f0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
22500 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  pExpr..    */.  
22510 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
22520 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78 70 72 43  N: {.      exprC
22530 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
22540 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
22550 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  , 0, 0);.      r
22560 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
22570 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
22580 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  SPAN:.    case T
22590 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20  K_COLLATE: .    
225a0 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
225b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
225c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
225d0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
225e0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
225f0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  );.    }..    ca
22600 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
22610 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
22620 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
22630 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
22640 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
22650 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
22660 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
22670 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
22680 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
22690 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
226a0 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
226b0 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
226c0 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
226d0 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
226e0 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
226f0 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
22700 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
22710 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
22720 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
22730 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
22740 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
22750 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
22760 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
22770 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
22780 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
22790 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
227a0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  *.      ** The e
227b0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70  xpression is imp
227c0 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
227d0 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64  n OP_Param opcod
227e0 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20  e. The p1.      
227f0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
22800 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20  set to 0 for an 
22810 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65  old.rowid refere
22820 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29  nce, or to (i+1)
22830 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66  .      ** to ref
22840 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63  erence another c
22850 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64  olumn of the old
22860 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
22870 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a   where .      **
22880 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   i is the index 
22890 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46  of the column. F
228a0 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72  or a new.rowid r
228b0 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a  eference, p1 is.
228c0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
228d0 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69  (n+1), where n i
228e0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
228f0 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20  columns in each 
22900 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20  pseudo-table..  
22910 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66      ** For a ref
22920 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74  erence to any ot
22930 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  her column in th
22940 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  e new.* pseudo-t
22950 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a  able, p1.      *
22960 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32  * is set to (n+2
22970 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64  +i), where n and
22980 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65   i are as define
22990 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f  d previously. Fo
229a0 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70  r.      ** examp
229b0 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65  le, if the table
229c0 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65   on which trigge
229d0 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72  rs are being fir
229e0 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ed is.      ** d
229f0 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20  eclared as:.    
22a00 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
22a10 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
22a20 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a  a, b);.      **.
22a30 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31        ** Then p1
22a40 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
22a50 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
22a60 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
22a70 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==0   ->    ol
22a80 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d  d.rowid     p1==
22a90 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f  3   ->    new.ro
22aa0 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  wid.      **   p
22ab0 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==1   ->    old
22ac0 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34  .a         p1==4
22ad0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20     ->    new.a. 
22ae0 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20       **   p1==2 
22af0 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20    ->    old.b   
22b00 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e        p1==5   ->
22b10 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20      new.b       
22b20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22b30 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
22b40 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
22b50 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d   int p1 = pExpr-
22b60 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d  >iTable * (pTab-
22b70 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70  >nCol+1) + 1 + p
22b80 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a  Expr->iColumn;..
22b90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
22ba0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
22bb0 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  | pExpr->iTable=
22bc0 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =1 );.      asse
22bd0 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
22be0 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d  mn>=-1 && pExpr-
22bf0 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >iColumn<pTab->n
22c00 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Col );.      ass
22c10 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79  ert( pTab->iPKey
22c20 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f  <0 || pExpr->iCo
22c30 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65  lumn!=pTab->iPKe
22c40 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  y );.      asser
22c50 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28  t( p1>=0 && p1<(
22c60 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20  pTab->nCol*2+2) 
22c70 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
22c80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22c90 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72  P_Param, p1, tar
22ca0 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  get);.      Vdbe
22cb0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
22cc0 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20  %s -> $%d",.    
22cd0 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62      (pExpr->iTab
22ce0 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c  le ? "new" : "ol
22cf0 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45  d"),.        (pE
22d00 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
22d10 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
22d20 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  ->pTab->aCol[pEx
22d30 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61  pr->iColumn].zNa
22d40 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72  me),.        tar
22d50 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23  get.      ));..#
22d60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22d70 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
22d80 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  T.      /* If th
22d90 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41  e column has REA
22da0 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d  L affinity, it m
22db0 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
22dc0 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20  stored as an.   
22dd0 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55     ** integer. U
22de0 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  se OP_RealAffini
22df0 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ty to make sure 
22e00 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61  it is really rea
22e10 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  l..      **.    
22e20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
22e30 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20  : R-60985-57662 
22e40 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76  SQLite will conv
22e50 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62 61  ert the value ba
22e60 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66  ck to.      ** f
22e70 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68  loating point wh
22e80 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 74  en extracting it
22e90 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64   from the record
22ea0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
22eb0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
22ec0 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61  0 .       && pTa
22ed0 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
22ee0 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
22ef0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
22f00 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  L.      ){.     
22f10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22f20 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41  dOp1(v, OP_RealA
22f30 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29  ffinity, target)
22f40 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
22f50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22f60 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
22f70 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20  _VECTOR: {.     
22f80 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
22f90 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61  (pParse, "row va
22fa0 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20  lue misused");. 
22fb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22fc0 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  }..    case TK_I
22fd0 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a 20 20  F_NULL_ROW: {.  
22fe0 20 20 20 20 69 6e 74 20 61 64 64 72 49 4e 52 3b      int addrINR;
22ff0 0a 20 20 20 20 20 20 61 64 64 72 49 4e 52 20 3d  .      addrINR =
23000 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23010 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c 6c 52  p1(v, OP_IfNullR
23020 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ow, pExpr->iTabl
23030 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
23040 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
23050 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
23060 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
23070 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
23080 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
23090 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
230a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
230b0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
230c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
230d0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
230e0 4e 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  NR);.      sqlit
230f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
23100 2c 20 61 64 64 72 49 4e 52 2c 20 69 6e 52 65 67  , addrINR, inReg
23110 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
23120 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
23130 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20    ** Form A:.   
23140 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45   **   CASE x WHE
23150 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
23160 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
23170 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
23180 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
23190 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42  **.    ** Form B
231a0 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
231b0 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
231c0 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
231d0 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
231e0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
231f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
23200 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72  m A is can be tr
23210 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74  ansformed into t
23220 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  he equivalent fo
23230 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  rm B as follows:
23240 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
23250 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31  HEN x=e1 THEN r1
23260 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20   WHEN x=e2 THEN 
23270 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20  r2 ....    **   
23280 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54       WHEN x=eN T
23290 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
232a0 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
232b0 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  X (if it exists)
232c0 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
232d0 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
232e0 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65   in the last ele
232f0 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78  ment of pExpr->x
23300 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d  .pList if pExpr-
23310 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
23320 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20  is.    ** odd.  
23330 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
23340 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20  tional.  If the 
23350 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
23360 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20  ts in x.pList.  
23370 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68    ** is even, th
23380 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20  en Y is omitted 
23390 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77 69  and the "otherwi
233a0 73 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55  se" result is NU
233b0 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73  LL..    ** Ei is
233c0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
233d0 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20  ->a[i*2] and Ri 
233e0 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  is pExpr->pList-
233f0 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a  >a[i*2+1]..    *
23400 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  *.    ** The res
23410 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ult of the expre
23420 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20  ssion is the Ri 
23430 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  for the first ma
23440 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a  tching Ei,.    *
23450 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  * or if there is
23460 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c   no matching Ei,
23470 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59   the ELSE term Y
23480 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
23490 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20  .    ** no ELSE 
234a0 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20  term, NULL..    
234b0 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
234c0 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43  assert( op==TK_C
234d0 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ASE ); {.      i
234e0 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20  nt endLabel;    
234f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23500 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
23510 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73  or end of CASE s
23520 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
23530 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20   nextCase;      
23540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23550 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
23560 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73   next WHEN claus
23570 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
23580 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
23590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
235a0 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45  2x number of WHE
235b0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
235c0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235e0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
235f0 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  er */.      Expr
23600 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23620 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65   List of WHEN te
23630 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  rms */.      str
23640 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
23650 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f  m *aListelem;  /
23660 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20  * Array of WHEN 
23670 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45  terms */.      E
23680 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20  xpr opCompare;  
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236a0 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78   /* The X==Ei ex
236b0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
236c0 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236e0 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70      /* The X exp
236f0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
23700 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30   Expr *pTest = 0
23710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23720 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72     /* X==Ei (for
23730 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20  m A) or just Ei 
23740 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20  (form B) */.    
23750 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
23760 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50  iCacheLevel = pP
23770 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
23780 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65  l; )..      asse
23790 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
237a0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
237b0 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78  IsSelect) && pEx
237c0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20  pr->x.pList );. 
237d0 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
237e0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
237f0 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
23800 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
23810 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
23820 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
23830 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
23840 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
23850 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20  .      endLabel 
23860 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
23870 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
23880 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72   if( (pX = pExpr
23890 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
238a0 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a         tempX = *
238b0 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  pX;.        test
238c0 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
238d0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
238e0 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65     exprToRegiste
238f0 72 28 26 74 65 6d 70 58 2c 20 65 78 70 72 43 6f  r(&tempX, exprCo
23900 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  deVector(pParse,
23910 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65   &tempX, &regFre
23920 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e1));.        te
23930 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
23940 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ==0 );.        m
23950 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70 61 72 65  emset(&opCompare
23960 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f  , 0, sizeof(opCo
23970 6d 70 61 72 65 29 29 3b 0a 20 20 20 20 20 20 20  mpare));.       
23980 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
23990 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
239a0 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
239b0 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20   &tempX;.       
239c0 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70   pTest = &opComp
239d0 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  are;.        /* 
239e0 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39  Ticket b351d95f9
239f0 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31  cd5ef17e9d9dbae1
23a00 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a  8f5ca8611190001:
23a10 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
23a20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65  value in regFree
23a30 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70  1 might get SCop
23a40 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69  y-ed into the fi
23a50 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20  le result..     
23a60 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75     ** So make su
23a70 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46  re that the regF
23a80 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73  ree1 register is
23a90 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20   not reused for 
23aa0 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  other.        **
23ab0 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f   purposes and po
23ac0 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74  ssibly overwritt
23ad0 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  en.  */.        
23ae0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
23af0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
23b00 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20  i=0; i<nExpr-1; 
23b10 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20  i=i+2){.        
23b20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
23b30 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
23b40 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a        if( pX ){.
23b50 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23b60 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20  ( pTest!=0 );.  
23b70 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
23b80 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74  e.pRight = aList
23b90 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
23ba0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23bb0 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
23bc0 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
23bd0 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
23be0 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d        nextCase =
23bf0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
23c00 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
23c10 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73    testcase( pTes
23c20 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
23c30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
23c40 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
23c50 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65  Parse, pTest, ne
23c60 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a  xtCase, SQLITE_J
23c70 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
23c80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
23c90 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
23ca0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
23cb0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
23cc0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23cd0 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
23ce0 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  +1].pExpr, targe
23cf0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
23d00 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65  te3VdbeGoto(v, e
23d10 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
23d20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
23d30 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
23d40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23d50 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
23d60 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
23d70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
23d80 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20  nExpr&1)!=0 ){. 
23d90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23da0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
23db0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
23dc0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23dd0 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e  rse, pEList->a[n
23de0 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74  Expr-1].pExpr, t
23df0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
23e00 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
23e10 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
23e20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23e30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23e40 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
23e50 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
23e60 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
23e70 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
23e80 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
23e90 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20  arse->nErr>0 .  
23ea0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
23eb0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d  se->iCacheLevel=
23ec0 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a  =iCacheLevel );.
23ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23ee0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
23ef0 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
23f00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
23f10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23f20 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
23f30 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
23f40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
23f50 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
23f60 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20  E_Rollback .    
23f70 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
23f80 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
23f90 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ort.           |
23fa0 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
23fb0 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  y==OE_Fail.     
23fc0 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
23fd0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
23fe0 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ore.      );.   
23ff0 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
24000 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
24010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
24020 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
24030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24040 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
24050 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
24060 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
24070 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
24080 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
24090 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
240a0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
240b0 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
240c0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
240d0 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
240e0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
240f0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
24100 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
24110 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
24120 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
24130 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
24140 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24150 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
24160 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50             v, OP
24170 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  _Halt, SQLITE_OK
24180 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20  , OE_Ignore, 0, 
24190 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
241a0 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
241b0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
241c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
241d0 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
241e0 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
241f0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
24200 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20  T_TRIGGER,.     
24210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24220 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
24230 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d  affinity, pExpr-
24240 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29  >u.zToken, 0, 0)
24250 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
24260 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
24270 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
24280 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
24290 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
242a0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
242b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
242c0 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
242d0 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
242e0 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f  ../*.** Factor o
242f0 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74  ut the code of t
24300 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
24310 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ion to initializ
24320 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a  ation time..**.*
24330 2a 20 49 66 20 72 65 67 44 65 73 74 3e 3d 30 20  * If regDest>=0 
24340 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
24350 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64  is always stored
24360 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
24370 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 73  r and the.** res
24380 75 6c 74 20 69 73 20 6e 6f 74 20 72 65 75 73 61  ult is not reusa
24390 62 6c 65 2e 20 20 49 66 20 72 65 67 44 65 73 74  ble.  If regDest
243a0 3c 30 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  <0 then this rou
243b0 74 69 6e 65 20 69 73 20 66 72 65 65 20 74 6f 20  tine is free to 
243c0 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 76 61  .** store the va
243d0 6c 75 65 20 77 68 65 72 65 65 76 65 72 20 69 74  lue whereever it
243e0 20 77 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67   wants.  The reg
243f0 69 73 74 65 72 20 77 68 65 72 65 20 74 68 65 20  ister where the 
24400 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 69  expression .** i
24410 73 20 73 74 6f 72 65 64 20 69 73 20 72 65 74 75  s stored is retu
24420 72 6e 65 64 2e 20 20 57 68 65 6e 20 72 65 67 44  rned.  When regD
24430 65 73 74 3c 30 2c 20 74 77 6f 20 69 64 65 6e 74  est<0, two ident
24440 69 63 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73  ical expressions
24450 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f   will.** code to
24460 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74   the same regist
24470 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
24480 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
24490 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
244a0 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
244b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
244c0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
244d0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
244e0 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74  n to code when t
244f0 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69  he VDBE initiali
24500 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zes */.  int reg
24510 44 65 73 74 20 20 20 20 20 20 20 2f 2a 20 53 74  Dest       /* St
24520 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
24530 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
24540 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
24550 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f  *p;.  assert( Co
24560 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
24570 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61  se) );.  p = pPa
24580 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b  rse->pConstExpr;
24590 0a 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30  .  if( regDest<0
245a0 20 26 26 20 70 20 29 7b 0a 20 20 20 20 73 74 72   && p ){.    str
245b0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
245c0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e  m *pItem;.    in
245d0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  t i;.    for(pIt
245e0 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45  em=p->a, i=p->nE
245f0 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b  xpr; i>0; pItem+
24600 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  +, i--){.      i
24610 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62  f( pItem->reusab
24620 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  le && sqlite3Exp
24630 72 43 6f 6d 70 61 72 65 28 30 2c 70 49 74 65 6d  rCompare(0,pItem
24640 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31  ->pExpr,pExpr,-1
24650 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
24660 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e  return pItem->u.
24670 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20  iConstExprReg;. 
24680 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24690 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
246a0 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
246b0 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
246c0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
246d0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
246e0 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a  rse, p, pExpr);.
246f0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
24700 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
24710 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
24720 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b  ->a[p->nExpr-1];
24730 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75  .     pItem->reu
24740 73 61 62 6c 65 20 3d 20 72 65 67 44 65 73 74 3c  sable = regDest<
24750 30 3b 0a 20 20 20 20 20 69 66 28 20 72 65 67 44  0;.     if( regD
24760 65 73 74 3c 30 20 29 20 72 65 67 44 65 73 74 20  est<0 ) regDest 
24770 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
24780 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e  ;.     pItem->u.
24790 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20  iConstExprReg = 
247a0 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70  regDest;.  }.  p
247b0 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
247c0 72 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20  r = p;.  return 
247d0 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  regDest;.}../*.*
247e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
247f0 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
24800 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
24810 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
24820 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
24830 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
24840 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
24850 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
24860 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
24870 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
24880 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
24890 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
248a0 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
248b0 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
248c0 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
248d0 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
248e0 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
248f0 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  ster is not.** a
24900 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e   temporary, then
24910 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65   set *pReg to ze
24920 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  ro..**.** If pEx
24930 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  pr is a constant
24940 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
24950 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61  ine might genera
24960 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20  te this.** code 
24970 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69  to fill the regi
24980 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74  ster in the init
24990 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69  ialization secti
249a0 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42  on of the.** VDB
249b0 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72  E program, in or
249c0 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74  der to factor it
249d0 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c   out of the eval
249e0 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a  uation loop..*/.
249f0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
24a00 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70  odeTemp(Parse *p
24a10 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
24a20 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a  pr, int *pReg){.
24a30 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70    int r2;.  pExp
24a40 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
24a50 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
24a60 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61  );.  if( ConstFa
24a70 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20  ctorOk(pParse). 
24a80 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d    && pExpr->op!=
24a90 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26  TK_REGISTER.   &
24aa0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
24ab0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
24ac0 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a  Expr).  ){.    *
24ad0 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 72  pReg  = 0;.    r
24ae0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
24af0 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
24b00 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20  , pExpr, -1);.  
24b10 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
24b20 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
24b30 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
24b40 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
24b50 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
24b60 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
24b70 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31  ;.    if( r2==r1
24b80 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20   ){.      *pReg 
24b90 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = r1;.    }else{
24ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
24bb0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
24bc0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
24bd0 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  *pReg = 0;.    }
24be0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
24bf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
24c00 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
24c10 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
24c20 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
24c30 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
24c40 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
24c50 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
24c60 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
24c70 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
24c80 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
24c90 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  arget..*/.void s
24ca0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
24cb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
24cc0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
24cd0 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
24ce0 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
24cf0 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
24d00 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
24d10 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
24d20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
24d30 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
24d40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24d50 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
24d60 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
24d70 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
24d80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24d90 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
24da0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
24db0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
24dc0 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
24dd0 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
24de0 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
24df0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
24e00 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
24e10 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
24e20 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
24e30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24e40 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
24e50 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
24e60 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
24e70 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
24e80 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74  Make a transient
24e90 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
24ea0 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68  ion pExpr and th
24eb0 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67  en code it using
24ec0 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43  .** sqlite3ExprC
24ed0 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75  ode().  This rou
24ee0 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20  tine works just 
24ef0 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
24f00 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74  Code().** except
24f10 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20   that the input 
24f20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75  expression is gu
24f30 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75  aranteed to be u
24f40 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
24f50 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
24f60 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61  eCopy(Parse *pPa
24f70 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
24f80 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
24f90 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
24fa0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78  Parse->db;.  pEx
24fb0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
24fc0 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
24fd0 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  );.  if( !db->ma
24fe0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c  llocFailed ) sql
24ff0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
25000 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
25010 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  et);.  sqlite3Ex
25020 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
25030 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  pr);.}../*.** Ge
25040 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
25050 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
25060 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
25070 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
25080 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
25090 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
250a0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
250b0 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
250c0 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
250d0 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68  r target.  If th
250e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
250f0 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
25100 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
25110 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63  ight choose to c
25120 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ode the expressi
25130 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61  on at initializa
25140 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f  tion time..*/.vo
25150 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
25160 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72  deFactorable(Par
25170 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
25180 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
25190 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72  get){.  if( pPar
251a0 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
251b0 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  r && sqlite3Expr
251c0 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
251d0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
251e0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
251f0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
25200 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
25210 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25220 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
25230 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a  r, target);.  }.
25240 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
25250 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
25260 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  uates the given 
25270 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
25280 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  uts the result.*
25290 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
252a0 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rget..**.** Also
252b0 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
252c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
252d0 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74  esults into anot
252e0 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69  her "cache" regi
252f0 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69  ster.** and modi
25300 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
25310 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  n so that the ne
25320 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76  xt time it is ev
25330 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20  aluated,.** the 
25340 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79  result is a copy
25350 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65   of the cache re
25360 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  gister..**.** Th
25370 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
25380 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ed for expressio
25390 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ns that are used
253a0 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
253b0 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65  mes.  They are e
253c0 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e  valuated once an
253d0 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
253e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
253f0 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a  ** are reused..*
25400 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
25410 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
25420 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
25430 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
25440 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
25450 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
25460 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a  e;.  int iMem;..
25470 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
25480 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
25490 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
254a0 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69  GISTER );.  sqli
254b0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
254c0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
254d0 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  t);.  iMem = ++p
254e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
254f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
25500 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72  (v, OP_Copy, tar
25510 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78  get, iMem);.  ex
25520 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45 78  prToRegister(pEx
25530 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a  pr, iMem);.}../*
25540 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
25550 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
25560 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
25570 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
25580 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
25590 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  ion list into a 
255a0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
255b0 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
255c0 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  at target..**.**
255d0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
255e0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65  er of elements e
255f0 76 61 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e  valuated.  The n
25600 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 77  umber returned w
25610 69 6c 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62  ill.** usually b
25620 65 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62  e pList->nExpr b
25630 75 74 20 6d 69 67 68 74 20 62 65 20 72 65 64 75  ut might be redu
25640 63 65 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43  ced if SQLITE_EC
25650 45 4c 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73  EL_OMITREF.** is
25660 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
25670 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
25680 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74  DUP flag prevent
25690 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s the arguments 
256a0 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69  from being.** fi
256b0 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43  lled using OP_SC
256c0 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75  opy.  OP_Copy mu
256d0 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  st be used inste
256e0 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ad..**.** The SQ
256f0 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
25700 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73   argument allows
25710 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
25720 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63  nts to be.** fac
25730 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69  tored out into i
25740 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f  nitialization co
25750 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  de..**.** The SQ
25760 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c  LITE_ECEL_REF fl
25770 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78  ag means that ex
25780 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
25790 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78   list with.** Ex
257a0 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69  prList.a[].u.x.i
257b0 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76  OrderByCol>0 hav
257c0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
257d0 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f  valuated and sto
257e0 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  red.** in regist
257f0 65 72 73 20 61 74 20 73 72 63 52 65 67 2c 20 61  ers at srcReg, a
25800 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20  nd so the value 
25810 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72  can be copied fr
25820 6f 6d 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20  om there..** If 
25830 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
25840 52 45 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c  REF is also set,
25850 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
25860 20 77 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72   with u.x.iOrder
25870 42 79 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73  ByCol>0.** are s
25880 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61  imply omitted ra
25890 74 68 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20  ther than being 
258a0 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52  copied from srcR
258b0 65 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  eg..*/.int sqlit
258c0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
258d0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
258e0 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
258f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
25900 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
25910 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
25920 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
25930 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
25940 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
25950 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
25960 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
25970 74 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20  t srcReg,       
25980 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73   /* Source regis
25990 74 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45  ters if SQLITE_E
259a0 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20  CEL_REF */.  u8 
259b0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
259c0 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a  /* SQLITE_ECEL_*
259d0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73   flags */.){.  s
259e0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
259f0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
25a00 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20  t i, j, n;.  u8 
25a10 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20  copyOp = (flags 
25a20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  & SQLITE_ECEL_DU
25a30 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f  P) ? OP_Copy : O
25a40 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20  P_SCopy;.  Vdbe 
25a50 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
25a60 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  be;.  assert( pL
25a70 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ist!=0 );.  asse
25a80 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
25a90 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
25aa0 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f  ->pVdbe!=0 );  /
25ab0 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69  * Never gets thi
25ac0 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20  s far otherwise 
25ad0 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  */.  n = pList->
25ae0 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f  nExpr;.  if( !Co
25af0 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
25b00 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e  se) ) flags &= ~
25b10 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
25b20 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  OR;.  for(pItem=
25b30 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
25b40 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
25b50 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
25b60 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
25b70 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  r;.    if( (flag
25b80 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
25b90 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20  REF)!=0 && (j = 
25ba0 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
25bb0 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20  rByCol)>0 ){.   
25bc0 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53     if( flags & S
25bd0 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52  QLITE_ECEL_OMITR
25be0 45 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2d  EF ){.        i-
25bf0 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a  -;.        n--;.
25c00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25c10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25c20 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
25c30 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74 61  , j+srcReg-1, ta
25c40 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d  rget+i);.      }
25c50 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
25c60 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25c70 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26  CEL_FACTOR)!=0 &
25c80 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
25c90 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29  onstant(pExpr) )
25ca0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
25cb0 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
25cc0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
25cd0 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73  get+i);.    }els
25ce0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52  e{.      int inR
25cf0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
25d00 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
25d10 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
25d20 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  +i);.      if( i
25d30 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  nReg!=target+i )
25d40 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
25d50 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69   *pOp;.        i
25d60 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f  f( copyOp==OP_Co
25d70 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  py.         && (
25d80 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47  pOp=sqlite3VdbeG
25d90 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70  etOp(v, -1))->op
25da0 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  code==OP_Copy.  
25db0 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
25dc0 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52  1+pOp->p3+1==inR
25dd0 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
25de0 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31  Op->p2+pOp->p3+1
25df0 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20  ==target+i.     
25e00 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
25e10 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20  pOp->p3++;.     
25e20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25e40 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
25e50 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69   inReg, target+i
25e60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25e70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
25e80 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
25e90 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
25ea0 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
25eb0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
25ec0 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
25ed0 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
25ee0 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
25ef0 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
25f00 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
25f10 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
25f20 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
25f30 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
25f40 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
25f50 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f  ** elimination o
25f60 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78  f x..**.** The x
25f70 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72  JumpIf parameter
25f80 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61   determines deta
25f90 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55  ils:.**.**    NU
25fa0 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
25fb0 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20        Store the 
25fc0 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69  boolean result i
25fd0 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20  n reg[dest].**  
25fe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
25ff0 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74  rue:      Jump t
26000 6f 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a  o dest if true.*
26010 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  *    sqlite3Expr
26020 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d  IfFalse:     Jum
26030 70 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c  p to dest if fal
26040 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d  se.**.** The jum
26050 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65  pIfNull paramete
26060 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  r is ignored if 
26070 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e  xJumpIf is NULL.
26080 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26090 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
260a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
260b0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
260c0 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
260d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
260e0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
260f0 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45     /* The BETWEE
26100 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
26110 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
26120 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
26130 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61  ination or stora
26140 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20  ge location */. 
26150 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50   void (*xJump)(P
26160 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c  arse*,Expr*,int,
26170 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20  int), /* Action 
26180 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74  to take */.  int
26190 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
261a0 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * Take the jump 
261b0 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  if the BETWEEN i
261c0 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78  s NULL */.){. Ex
261d0 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20  pr exprAnd;     
261e0 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61  /* The AND opera
261f0 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44  tor in  x>=y AND
26200 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72   x<=z  */.  Expr
26210 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a   compLeft;    /*
26220 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d   The  x>=y  term
26230 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52   */.  Expr compR
26240 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20  ight;   /* The  
26250 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x<=z  term */.  
26260 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20  Expr exprX;     
26270 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62    /* The  x  sub
26280 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
26290 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
262a0 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75  ; /* Temporary u
262b0 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a  se register */..
262c0 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c  .  memset(&compL
262d0 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  eft, 0, sizeof(E
262e0 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  xpr));.  memset(
262f0 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73  &compRight, 0, s
26300 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
26310 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c  memset(&exprAnd,
26320 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
26330 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45  );..  assert( !E
26340 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
26350 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
26360 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d  ct) );.  exprX =
26370 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a   *pExpr->pLeft;.
26380 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54    exprAnd.op = T
26390 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64  K_AND;.  exprAnd
263a0 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65  .pLeft = &compLe
263b0 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52  ft;.  exprAnd.pR
263c0 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68  ight = &compRigh
263d0 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70  t;.  compLeft.op
263e0 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70   = TK_GE;.  comp
263f0 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  Left.pLeft = &ex
26400 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  prX;.  compLeft.
26410 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
26420 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
26430 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  xpr;.  compRight
26440 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63  .op = TK_LE;.  c
26450 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d  ompRight.pLeft =
26460 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52   &exprX;.  compR
26470 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45  ight.pRight = pE
26480 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
26490 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72  1].pExpr;.  expr
264a0 54 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72  ToRegister(&expr
264b0 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  X, exprCodeVecto
264c0 72 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  r(pParse, &exprX
264d0 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
264e0 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20   if( xJump ){.  
264f0 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20    xJump(pParse, 
26500 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
26510 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
26520 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 72  else{.    /* Mar
26530 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  k the expression
26540 20 69 73 20 62 65 69 6e 67 20 66 72 6f 6d 20 74   is being from t
26550 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
26560 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a  lause of a join.
26570 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74      ** so that t
26580 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  he sqlite3ExprCo
26590 64 65 54 61 72 67 65 74 28 29 20 72 6f 75 74 69  deTarget() routi
265a0 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  ne will not atte
265b0 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20  mpt to move.    
265c0 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20 50  ** it into the P
265d0 61 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72 20  arse.pConstExpr 
265e0 6c 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c 64  list.  We should
265f0 20 75 73 65 20 61 20 6e 65 77 20 62 69 74 20 66   use a new bit f
26600 6f 72 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a 20  or this,.    ** 
26610 66 6f 72 20 63 6c 61 72 69 74 79 2c 20 62 75 74  for clarity, but
26620 20 77 65 20 61 72 65 20 6f 75 74 20 6f 66 20 62   we are out of b
26630 69 74 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e  its in the Expr.
26640 66 6c 61 67 73 20 66 69 65 6c 64 20 73 6f 20 77  flags field so w
26650 65 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f  e.    ** have to
26660 20 72 65 75 73 65 20 74 68 65 20 45 50 5f 46 72   reuse the EP_Fr
26670 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d  omJoin bit.  Bum
26680 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70 72  mer. */.    expr
26690 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72  X.flags |= EP_Fr
266a0 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69  omJoin;.    sqli
266b0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
266c0 74 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  t(pParse, &exprA
266d0 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20  nd, dest);.  }. 
266e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
266f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
26700 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20  egFree1);..  /* 
26710 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20  Ensure adequate 
26720 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f  test coverage */
26730 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26740 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26750 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
26760 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
26770 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
26780 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26790 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
267a0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
267b0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
267c0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
267d0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
267e0 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
267f0 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
26800 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
26810 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26820 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26830 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21    && jumpIfNull!
26840 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
26850 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26860 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26870 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
26880 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
26890 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
268a0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
268b0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
268c0 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
268d0 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
268e0 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
268f0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
26900 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
26910 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
26920 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26930 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26940 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26950 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
26960 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
26970 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
26980 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b  ase( xJump==0 );
26990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
269a0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
269b0 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
269c0 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
269d0 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
269e0 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
269f0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
26a00 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
26a10 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
26a20 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
26a30 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
26a40 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
26a50 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
26a60 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
26a70 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
26a80 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
26a90 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
26aa0 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
26ab0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
26ac0 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
26ad0 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FNULL..**.** Thi
26ae0 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
26af0 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
26b00 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
26b10 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
26b20 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
26b30 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
26b40 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
26b50 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
26b60 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
26b70 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
26b80 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
26b90 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
26ba0 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
26bb0 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
26bc0 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
26bd0 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
26be0 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
26bf0 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
26c00 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
26c10 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
26c20 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
26c30 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
26c40 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
26c50 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
26c60 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
26c70 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
26c80 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
26c90 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
26ca0 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
26cb0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
26cc0 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
26cd0 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
26ce0 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
26cf0 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
26d00 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
26d10 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
26d20 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
26d30 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65  R(v==0) )     re
26d40 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65  turn;  /* Existe
26d50 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
26d60 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
26d70 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
26d80 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  pr==0) ) return;
26d90 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73    /* No way this
26da0 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20   can happen */. 
26db0 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
26dc0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
26dd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
26de0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
26df0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
26e00 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
26e10 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
26e20 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
26e30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
26e40 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
26e50 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a  xpr->pLeft, d2,j
26e60 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
26e70 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
26e80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26e90 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
26ea0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26eb0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
26ec0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
26ed0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
26ee0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
26ef0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
26f00 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
26f10 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
26f20 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
26f30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
26f40 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
26f50 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
26f60 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26f70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26f80 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
26f90 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
26fa0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
26fb0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
26fc0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
26fd0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
26fe0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
26ff0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27000 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
27010 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27020 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
27030 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
27040 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27050 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
27060 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
27070 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27080 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
27090 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
270a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
270b0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
270c0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
270d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
270e0 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20  e TK_TRUTH: {.  
270f0 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20      int isNot;  
27100 20 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52      /* IS NOT TR
27110 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c  UE or IS NOT FAL
27120 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  SE */.      int 
27130 69 73 54 72 75 65 3b 20 20 20 20 20 2f 2a 20 49  isTrue;     /* I
27140 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54  S TRUE or IS NOT
27150 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74   TRUE */.      t
27160 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27170 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27180 69 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f  isNot = pExpr->o
27190 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20  p2==TK_ISNOT;.  
271a0 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c      isTrue = sql
271b0 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c  ite3ExprTruthVal
271c0 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ue(pExpr->pRight
271d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
271e0 65 28 20 69 73 54 72 75 65 20 26 26 20 69 73 4e  e( isTrue && isN
271f0 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ot );.      test
27200 63 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26  case( !isTrue &&
27210 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
27220 69 66 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e  if( isTrue ^ isN
27230 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ot ){.        sq
27240 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
27250 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27260 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20  Left, dest,.    
27270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27280 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51        isNot ? SQ
27290 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
272a0 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  : 0);.      }els
272b0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
272c0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
272d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
272e0 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20  ft, dest,.      
272f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27300 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c       isNot ? SQL
27310 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a  ITE_JUMPIFNULL :
27320 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
27330 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27340 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
27350 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
27360 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  T:.      testcas
27370 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
27380 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27390 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
273a0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
273b0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
273c0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75   TK_NE;.      ju
273d0 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54  mpIfNull = SQLIT
273e0 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
273f0 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
27400 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
27410 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
27420 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
27430 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
27440 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
27450 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
27460 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
27470 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
27480 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20  pExpr->pLeft) ) 
27490 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70  goto default_exp
274a0 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  r;.      testcas
274b0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
274c0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
274d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
274e0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
274f0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
27500 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
27510 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27520 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27530 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
27540 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
27550 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
27560 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
27570 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
27580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27590 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
275a0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
275b0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
275c0 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
275d0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
275e0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
275f0 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
27600 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
27610 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
27620 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
27630 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
27640 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
27650 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
27660 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
27670 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
27680 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
27690 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
276a0 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
276b0 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
276c0 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
276d0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
276e0 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
276f0 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
27700 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
27710 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64  OP_Eq);.      Vd
27720 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27730 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
27740 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
27750 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
27760 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27770 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
27780 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
27790 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
277a0 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
277b0 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
277c0 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
277d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
277e0 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
277f0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
27800 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
27810 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27820 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
27830 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
27840 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
27850 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
27860 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
27870 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27880 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
27890 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
278a0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
278b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
278c0 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61  TNULL: {.      a
278d0 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
278e0 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20  ==OP_IsNull );  
278f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
27900 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
27910 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
27920 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
27930 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70   ); testcase( op
27940 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
27950 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
27960 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
27970 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27980 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
27990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
279a0 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
279b0 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
279c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
279d0 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
279e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
279f0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
27a00 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
27a10 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27a20 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
27a30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27a40 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
27a50 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
27a60 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
27a70 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
27a80 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
27a90 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
27aa0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
27ab0 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ue, jumpIfNull);
27ac0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27ad0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
27ae0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
27af0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
27b00 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
27b10 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
27b20 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
27b30 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
27b40 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49  stIfNull = jumpI
27b50 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64  fNull ? dest : d
27b60 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20  estIfFalse;.    
27b70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
27b80 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
27b90 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  r, destIfFalse, 
27ba0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
27bb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
27bc0 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
27bd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
27be0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
27bf0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
27c00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
27c10 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
27c20 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74  t: {.    default
27c30 5f 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28  _expr:.      if(
27c40 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   exprAlwaysTrue(
27c50 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
27c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
27c70 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
27c80 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
27c90 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70  AlwaysFalse(pExp
27ca0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
27cb0 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   No-op */.      
27cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
27cd0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
27ce0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
27cf0 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
27d00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
27d10 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
27d20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c  OP_If, r1, dest,
27d30 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
27d40 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
27d50 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
27d60 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27d70 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
27d80 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
27d90 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
27da0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
27db0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
27dc0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
27dd0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
27de0 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
27df0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
27e00 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
27e10 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
27e20 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
27e30 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
27e40 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
27e50 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
27e60 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
27e70 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
27e80 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
27e90 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
27ea0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
27eb0 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
27ec0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
27ed0 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
27ee0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
27ef0 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
27f00 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
27f10 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
27f20 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
27f30 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
27f40 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
27f50 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
27f60 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
27f70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
27f80 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
27f90 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
27fa0 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
27fb0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
27fc0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
27fd0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
27fe0 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
27ff0 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
28000 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
28010 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
28020 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
28030 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
28040 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
28050 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
28060 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
28070 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74  return; /* Exist
28080 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
28090 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
280a0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
280b0 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20   )    return;.. 
280c0 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
280d0 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
280e0 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
280f0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
28100 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
28110 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
28120 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
28130 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
28140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
28150 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
28160 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
28170 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
28180 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
28190 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
281a0 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
281b0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
281c0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
281d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
281e0 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
281f0 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
28200 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
28210 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
28220 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
28230 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
28240 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
28250 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
28260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
28270 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
28280 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
28290 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
282a0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
282b0 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
282c0 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
282d0 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
282e0 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
282f0 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
28300 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
28310 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
28320 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
28330 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
28340 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
28350 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
28360 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
28370 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
28380 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
28390 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
283a0 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
283b0 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
283c0 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
283d0 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
283e0 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
283f0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
28400 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
28410 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
28420 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28430 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
28440 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
28450 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
28460 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
28470 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
28480 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28490 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
284a0 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
284b0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
284c0 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
284d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
284e0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
284f0 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
28500 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28510 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
28520 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
28530 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28540 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
28550 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
28560 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
28570 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
28580 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28590 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
285a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
285b0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
285c0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
285d0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
285e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
285f0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
28600 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
28610 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
28620 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28630 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
28640 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
28650 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
28660 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
28670 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28680 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
28690 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
286a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
286b0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
286c0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
286d0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
286e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
286f0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
28700 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d  ->pLeft, d2, jum
28710 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
28720 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
28730 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
28740 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
28750 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28760 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
28770 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
28780 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
28790 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
287a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
287b0 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
287c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
287d0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
287e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
287f0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
28800 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
28810 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
28820 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28830 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
28840 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28850 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
28860 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
28870 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
28880 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20  TK_TRUTH: {.    
28890 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20 2f    int isNot;   /
288a0 2a 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72  * IS NOT TRUE or
288b0 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f   IS NOT FALSE */
288c0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75  .      int isTru
288d0 65 3b 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f  e;  /* IS TRUE o
288e0 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f  r IS NOT TRUE */
288f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28900 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
28910 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20  ;.      isNot = 
28920 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49  pExpr->op2==TK_I
28930 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72  SNOT;.      isTr
28940 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ue = sqlite3Expr
28950 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70 72  TruthValue(pExpr
28960 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
28970 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75   testcase( isTru
28980 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
28990 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
289a0 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29  sTrue && isNot )
289b0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72  ;.      if( isTr
289c0 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20  ue ^ isNot ){.  
289d0 20 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45        /* IS TRUE
289e0 20 61 6e 64 20 49 53 20 4e 4f 54 20 46 41 4c 53   and IS NOT FALS
289f0 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  E */.        sql
28a00 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
28a10 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28a20 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20  Left, dest,.    
28a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a40 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30         isNot ? 0
28a50 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   : SQLITE_JUMPIF
28a60 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 7d 65  NULL);..      }e
28a70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
28a80 49 53 20 46 41 4c 53 45 20 61 6e 64 20 49 53 20  IS FALSE and IS 
28a90 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20  NOT TRUE */.    
28aa0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
28ab0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
28ac0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
28ad0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
28af0 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a  t ? 0 : SQLITE_J
28b00 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
28b10 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
28b20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
28b30 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
28b40 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20  TK_ISNOT:.      
28b50 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
28b60 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
28b70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
28b80 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
28b90 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
28ba0 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
28bb0 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f  S) ? TK_NE : TK_
28bc0 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66  EQ;.      jumpIf
28bd0 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55  Null = SQLITE_NU
28be0 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46  LLEQ;.      /* F
28bf0 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
28c00 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
28c10 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
28c20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
28c30 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
28c40 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
28c50 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
28c60 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
28c70 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70  xprIsVector(pExp
28c80 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f  r->pLeft) ) goto
28c90 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20   default_expr;. 
28ca0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
28cb0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28cc0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
28cd0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
28ce0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28cf0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
28d00 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
28d10 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
28d20 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28d30 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
28d40 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
28d50 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
28d60 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
28d70 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d90 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
28da0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
28db0 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
28dc0 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
28dd0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
28de0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
28df0 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
28e00 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
28e10 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
28e20 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
28e30 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
28e40 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
28e50 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
28e60 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
28e70 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
28e80 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
28e90 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
28ea0 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
28eb0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
28ec0 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
28ed0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
28ee0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28ef0 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
28f00 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
28f10 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  q);.      VdbeCo
28f20 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
28f30 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
28f40 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
28f50 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
28f60 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
28f70 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
28f80 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
28f90 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LEQ);.      asse
28fa0 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
28fb0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
28fc0 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Ne);.      Vdb
28fd0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
28fe0 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
28ff0 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
29000 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
29010 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
29020 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
29030 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
29040 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74  NULLEQ);.      t
29050 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
29060 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
29070 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
29080 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
29090 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
290a0 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
290b0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
290c0 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  L: {.      r1 = 
290d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
290e0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
290f0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
29100 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
29110 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
29120 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
29130 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29140 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
29150 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
29160 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  f(v, op==TK_ISNU
29170 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
29180 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
29190 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65  ULL );  VdbeCove
291a0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
291b0 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
291c0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
291d0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
291e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
291f0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
29200 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
29210 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
29220 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
29230 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
29240 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
29250 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
29260 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  se, jumpIfNull);
29270 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
29280 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
29290 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
292a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
292b0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d   {.      if( jum
292c0 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  pIfNull ){.     
292d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
292e0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
292f0 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b  pr, dest, dest);
29300 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29310 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
29320 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
29330 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
29340 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
29350 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
29360 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
29370 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
29380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
29390 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
293a0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
293b0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
293c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
293d0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
293e0 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a   default_expr: .
293f0 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
29400 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
29410 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29420 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
29430 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
29440 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
29450 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
29460 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20         /* no-op 
29470 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
29480 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
29490 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
294a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
294b0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
294c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
294d0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
294e0 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
294f0 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
29500 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
29510 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
29520 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
29530 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
29540 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
29550 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
29560 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
29570 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
29580 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
29590 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
295a0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
295b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
295c0 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d  se, regFree2);.}
295d0 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c  ../*.** Like sql
295e0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
295f0 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20  ) except that a 
29600 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
29610 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20  pExpr before.** 
29620 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c  code generation,
29630 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69   and that copy i
29640 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20  s deleted after 
29650 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
29660 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73   This.** ensures
29670 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
29680 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68  al pExpr is unch
29690 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anged..*/.void s
296a0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
296b0 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  eDup(Parse *pPar
296c0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
296d0 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75   int dest,int ju
296e0 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c  mpIfNull){.  sql
296f0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
29700 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
29710 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78  Copy = sqlite3Ex
29720 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
29730 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
29740 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
29750 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
29760 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
29770 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75   pCopy, dest, ju
29780 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  mpIfNull);.  }. 
29790 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
297a0 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d  te(db, pCopy);.}
297b0 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
297c0 6f 6e 20 70 56 61 72 20 69 73 20 67 75 61 72 61  on pVar is guara
297d0 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 53  nteed to be an S
297e0 51 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45 78  QL variable. pEx
297f0 70 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a 2a  pr may be any.**
29800 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73 73   type of express
29810 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ion..**.** If pE
29820 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20  xpr is a simple 
29830 53 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20 69  SQL value - an i
29840 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74  nteger, real, st
29850 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72  ring, blob.** or
29860 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74 68   NULL value - th
29870 65 6e 20 74 68 65 20 56 44 42 45 20 63 75 72 72  en the VDBE curr
29880 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65 70  ently being prep
29890 61 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75 72  ared is configur
298a0 65 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65 70  ed.** to re-prep
298b0 61 72 65 20 65 61 63 68 20 74 69 6d 65 20 61 20  are each time a 
298c0 6e 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f 75  new value is bou
298d0 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70  nd to variable p
298e0 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74  Var..**.** Addit
298f0 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78 70  ionally, if pExp
29900 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51  r is a simple SQ
29910 4c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  L value and the 
29920 76 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20  value is the.** 
29930 73 61 6d 65 20 61 73 20 74 68 61 74 20 63 75 72  same as that cur
29940 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f 20  rently bound to 
29950 76 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20 6e  variable pVar, n
29960 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
29970 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
29980 65 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 73  e, if the values
29990 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d   are not the sam
299a0 65 20 6f 72 20 69 66 20 70 45 78 70 72 20 69 73  e or if pExpr is
299b0 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a 2a   not a simple.**
299c0 20 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72 6f   SQL value, zero
299d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
299e0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
299f0 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28  CompareVariable(
29a00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
29a10 78 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72 20  xpr *pVar, Expr 
29a20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
29a30 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  es = 0;.  int iV
29a40 61 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ar;.  sqlite3_va
29a50 6c 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20 30  lue *pL, *pR = 0
29a60 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56 61  ;.  .  sqlite3Va
29a70 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
29a80 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53  se->db, pExpr, S
29a90 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
29aa0 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70 52  TE_AFF_BLOB, &pR
29ab0 29 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a 20  );.  if( pR ){. 
29ac0 20 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d 3e     iVar = pVar->
29ad0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c  iColumn;.    sql
29ae0 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
29af0 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
29b00 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c 20  , iVar);.    pL 
29b10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
29b20 42 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72 73  BoundValue(pPars
29b30 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69  e->pReprepare, i
29b40 56 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Var, SQLITE_AFF_
29b50 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70  BLOB);.    if( p
29b60 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  L ){.      if( s
29b70 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
29b80 65 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54 45  e(pL)==SQLITE_TE
29b90 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  XT ){.        sq
29ba0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
29bb0 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75  (pL); /* Make su
29bc0 72 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  re the encoding 
29bd0 69 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20  is UTF-8 */.    
29be0 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20    }.      res = 
29bf0 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43 6f   0==sqlite3MemCo
29c00 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30 29  mpare(pL, pR, 0)
29c10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29c20 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 29  te3ValueFree(pR)
29c30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
29c40 75 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d 0a  ueFree(pL);.  }.
29c50 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
29c60 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
29c70 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
29c80 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
29c90 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
29ca0 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
29cb0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
29cc0 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
29cd0 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
29ce0 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
29cf0 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
29d00 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
29d10 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
29d20 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
29d30 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
29d40 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
29d50 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
29d60 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
29d70 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
29d80 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
29d90 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
29da0 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
29db0 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
29dc0 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
29dd0 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
29de0 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
29df0 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
29e00 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
29e10 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
29e20 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
29e30 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
29e40 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
29e50 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
29e60 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
29e70 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
29e80 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
29e90 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
29ea0 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
29eb0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
29ec0 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
29ed0 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
29ee0 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
29ef0 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
29f00 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
29f10 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
29f20 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
29f30 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
29f40 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
29f50 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
29f60 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
29f70 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
29f80 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
29f90 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
29fa0 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
29fb0 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
29fc0 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
29fd0 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
29fe0 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
29ff0 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
2a000 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
2a010 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
2a020 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
2a030 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
2a040 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
2a050 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
2a060 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
2a070 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
2a080 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
2a090 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
2a0a0 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
2a0b0 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
2a0c0 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
2a0d0 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
2a0e0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
2a0f0 20 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e   pParse is not N
2a100 55 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52 49  ULL then TK_VARI
2a110 41 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70 41  ABLE terms in pA
2a120 20 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20 69   with bindings i
2a130 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52 65  n.** pParse->pRe
2a140 70 72 65 70 61 72 65 20 63 61 6e 20 62 65 20 6d  prepare can be m
2a150 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 6c  atched against l
2a160 69 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20 20  iterals in pB.  
2a170 54 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  The .** pParse->
2a180 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 62  pVdbe->expmask b
2a190 69 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74 65  itmask is update
2a1a0 64 20 66 6f 72 20 65 61 63 68 20 76 61 72 69 61  d for each varia
2a1b0 62 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e 0a  ble referenced..
2a1c0 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
2a1d0 4e 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61 6c  NULL (the normal
2a1e0 20 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79 20   case) then any 
2a1f0 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d  TK_VARIABLE term
2a200 20 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74   in .** Argument
2a210 20 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20 6e   pParse should n
2a220 6f 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e  ormally be NULL.
2a230 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
2a240 4c 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a 20  LL and pA or.** 
2a250 70 42 20 63 61 75 73 65 73 20 61 20 72 65 74 75  pB causes a retu
2a260 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a 2a  rn value of 2..*
2a270 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2a280 72 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a  rCompare(Parse *
2a290 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 41  pParse, Expr *pA
2a2a0 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
2a2b0 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d  iTab){.  u32 com
2a2c0 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66  binedFlags;.  if
2a2d0 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
2a2e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2a2f0 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
2a300 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 20   }.  if( pParse 
2a310 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  && pA->op==TK_VA
2a320 52 49 41 42 4c 45 20 26 26 20 65 78 70 72 43 6f  RIABLE && exprCo
2a330 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 70 50  mpareVariable(pP
2a340 61 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29 7b  arse, pA, pB) ){
2a350 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2a360 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61   }.  combinedFla
2a370 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c  gs = pA->flags |
2a380 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66   pB->flags;.  if
2a390 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
2a3a0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
2a3b0 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  .    if( (pA->fl
2a3c0 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50  ags&pB->flags&EP
2a3d0 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26  _IntValue)!=0 &&
2a3e0 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70   pA->u.iValue==p
2a3f0 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
2a400 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2a410 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2a420 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
2a430 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20  >op!=pB->op ){. 
2a440 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
2a450 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
2a460 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2a470 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66  pParse, pA->pLef
2a480 74 2c 70 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a  t,pB,iTab)<2 ){.
2a490 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2a4a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
2a4b0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
2a4c0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
2a4d0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2a4e0 41 2c 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62  A,pB->pLeft,iTab
2a4f0 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
2a500 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2a510 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
2a520 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
2a530 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70  COLUMN && pA->op
2a540 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
2a550 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  && pA->u.zToken 
2a560 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
2a570 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
2a580 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
2a590 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75  te3StrICmp(pA->u
2a5a0 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
2a5b0 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72  oken)!=0 ) retur
2a5c0 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 2;.    }else i
2a5d0 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e  f( strcmp(pA->u.
2a5e0 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
2a5f0 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ken)!=0 ){.     
2a600 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d   return pA->op==
2a610 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a  TK_COLLATE ? 1 :
2a620 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
2a630 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
2a640 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28   EP_Distinct)!=(
2a650 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pB->flags & EP_D
2a660 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72  istinct) ) retur
2a670 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  n 2;.  if( ALWAY
2a680 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  S((combinedFlags
2a690 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29   & EP_TokenOnly)
2a6a0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ==0) ){.    if( 
2a6b0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
2a6c0 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72  EP_xIsSelect ) r
2a6d0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
2a6e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2a6f0 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e  are(pParse, pA->
2a700 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
2a710 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
2a720 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
2a730 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a740 50 61 72 73 65 2c 20 70 41 2d 3e 70 52 69 67 68  Parse, pA->pRigh
2a750 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69  t, pB->pRight, i
2a760 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
2a770 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2a780 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
2a790 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d  pA->x.pList, pB-
2a7a0 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20  >x.pList, iTab) 
2a7b0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a7c0 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62  if( ALWAYS((comb
2a7d0 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52  inedFlags & EP_R
2a7e0 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70  educed)==0) && p
2a7f0 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47  A->op!=TK_STRING
2a800 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
2a810 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
2a820 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
2a830 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  2;.      if( pA-
2a840 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
2a850 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28  ble .       && (
2a860 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62  pA->iTable!=iTab
2a870 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54   || NEVER(pB->iT
2a880 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75  able>=0)) ) retu
2a890 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
2a8a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a8b0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
2a8c0 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
2a8d0 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
2a8e0 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
2a8f0 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a  al and .** non-z
2a900 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66  ero if they diff
2a910 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
2a920 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
2a930 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
2a940 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
2a950 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
2a960 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
2a970 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
2a980 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
2a990 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
2a9a0 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
2a9b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2a9c0 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
2a9d0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
2a9e0 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
2a9f0 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
2aa00 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
2aa10 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
2aa20 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
2aa30 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
2aa40 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
2aa50 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
2aa60 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
2aa70 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
2aa80 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
2aa90 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
2aaa0 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
2aab0 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
2aac0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
2aad0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
2aae0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
2aaf0 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
2ab00 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
2ab10 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
2ab20 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
2ab30 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
2ab40 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
2ab50 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
2ab60 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
2ab70 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74  0 && pB==0 ) ret
2ab80 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d  urn 0;.  if( pA=
2ab90 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65  =0 || pB==0 ) re
2aba0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41  turn 1;.  if( pA
2abb0 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78  ->nExpr!=pB->nEx
2abc0 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pr ) return 1;. 
2abd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
2abe0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2abf0 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
2ac00 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pA->a[i].pExpr;.
2ac10 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
2ac20 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pB->a[i].pExp
2ac30 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61  r;.    if( pA->a
2ac40 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70  [i].sortOrder!=p
2ac50 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  B->a[i].sortOrde
2ac60 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
2ac70 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2ac80 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70  rCompare(0, pExp
2ac90 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62  rA, pExprB, iTab
2aca0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
2acb0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2acc0 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
2acd0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29  te3ExprCompare()
2ace0 20 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20   except COLLATE 
2acf0 6f 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65  operators at the
2ad00 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72   top-level.** ar
2ad10 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e  e ignored..*/.in
2ad20 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
2ad30 70 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70  pareSkip(Expr *p
2ad40 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
2ad50 20 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e   iTab){.  return
2ad60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2ad70 61 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20 20  are(0,.         
2ad80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
2ad90 6b 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a  kipCollate(pA),.
2ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2adb0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2adc0 61 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20 20  ate(pB),.       
2add0 20 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a        iTab);.}..
2ade0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
2adf0 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76  e if we can prov
2ae00 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61  e the pE2 will a
2ae10 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66  lways be true if
2ae20 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e   pE1 is.** true.
2ae30 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
2ae40 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70  f we cannot comp
2ae50 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f  lete the proof o
2ae60 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a  r if pE2 might.*
2ae70 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61  * be false.  Exa
2ae80 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
2ae90 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE1: x==5      
2aea0 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE2: x==5      
2aeb0 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74         Result: t
2aec0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
2aed0 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20  x>0        pE2: 
2aee0 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
2aef0 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
2af00 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20  *     pE1: x=21 
2af10 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20        pE2: x=21 
2af20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75  OR y=43     Resu
2af30 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
2af40 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20  pE1: x!=123     
2af50 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
2af60 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  LL    Result: tr
2af70 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
2af80 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78  !=?1      pE2: x
2af90 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
2afa0 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2afb0 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55      pE1: x IS NU
2afc0 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f  LL  pE2: x IS NO
2afd0 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
2afe0 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
2aff0 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70  E1: x IS ?2    p
2b000 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
2b010 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c  L    Reuslt: fal
2b020 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  se.**.** When co
2b030 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d  mparing TK_COLUM
2b040 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20  N nodes between 
2b050 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20  pE1 and pE2, if 
2b060 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e  pE2 has.** Expr.
2b070 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73  iTable<0 then as
2b080 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d  sume a table num
2b090 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61  ber given by iTa
2b0a0 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72  b..**.** If pPar
2b0b0 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  se is not NULL, 
2b0c0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20  then the values 
2b0d0 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c  of bound variabl
2b0e0 65 73 20 69 6e 20 70 45 31 20 61 72 65 20 0a 2a  es in pE1 are .*
2b0f0 2a 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e  * compared again
2b100 73 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65  st literal value
2b110 73 20 69 6e 20 70 45 32 20 61 6e 64 20 70 50 61  s in pE2 and pPa
2b120 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d  rse->pVdbe->expm
2b130 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69  ask is.** modifi
2b140 65 64 20 74 6f 20 72 65 63 6f 72 64 20 77 68 69  ed to record whi
2b150 63 68 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c  ch bound variabl
2b160 65 73 20 61 72 65 20 72 65 66 65 72 65 6e 63 65  es are reference
2b170 64 2e 20 20 49 66 20 70 50 61 72 73 65 20 0a 2a  d.  If pParse .*
2b180 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  * is NULL, then 
2b190 66 61 6c 73 65 20 77 69 6c 6c 20 62 65 20 72 65  false will be re
2b1a0 74 75 72 6e 65 64 20 69 66 20 70 45 31 20 63 6f  turned if pE1 co
2b1b0 6e 74 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64  ntains any bound
2b1c0 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
2b1d0 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  * When in doubt,
2b1e0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20   return false.  
2b1f0 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d  Returning true m
2b200 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
2b210 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f  ormance.** impro
2b220 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69  vement.  Returni
2b230 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63  ng false might c
2b240 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  ause a performan
2b250 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75  ce reduction, bu
2b260 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77  t.** it will alw
2b270 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72  ays give the cor
2b280 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20  rect answer and 
2b290 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20  is hence always 
2b2a0 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  safe..*/.int sql
2b2b0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2b2c0 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  xpr(Parse *pPars
2b2d0 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78  e, Expr *pE1, Ex
2b2e0 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61  pr *pE2, int iTa
2b2f0 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  b){.  if( sqlite
2b300 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
2b310 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2c 20 69  rse, pE1, pE2, i
2b320 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Tab)==0 ){.    r
2b330 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
2b340 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f  f( pE2->op==TK_O
2b350 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33  R.   && (sqlite3
2b360 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
2b370 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
2b380 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20  ->pLeft, iTab). 
2b390 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2b3a0 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2b3b0 73 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  sExpr(pParse, pE
2b3c0 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20  1, pE2->pRight, 
2b3d0 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20  iTab) ).  ){.   
2b3e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
2b3f0 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
2b400 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31 2d  _NOTNULL && pE1-
2b410 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26  >op!=TK_ISNULL &
2b420 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53  & pE1->op!=TK_IS
2b430 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58   ){.    Expr *pX
2b440 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
2b450 69 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e 70  ipCollate(pE1->p
2b460 4c 65 66 74 29 3b 0a 20 20 20 20 74 65 73 74 63  Left);.    testc
2b470 61 73 65 28 20 70 58 21 3d 70 45 31 2d 3e 70 4c  ase( pX!=pE1->pL
2b480 65 66 74 20 29 3b 0a 20 20 20 20 69 66 28 20 73  eft );.    if( s
2b490 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2b4a0 65 28 70 50 61 72 73 65 2c 20 70 58 2c 20 70 45  e(pParse, pX, pE
2b4b0 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d  2->pLeft, iTab)=
2b4c0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
2b4d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2b4e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2b4f0 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 63 61  the Expr node ca
2b500 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c 69 74  llback for sqlit
2b510 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74  e3ExprImpliesNot
2b520 4e 75 6c 6c 52 6f 77 28 29 2e 0a 2a 2a 20 49 66  NullRow()..** If
2b530 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2b540 6e 6f 64 65 20 72 65 71 75 69 72 65 73 20 74 68  node requires th
2b550 61 74 20 74 68 65 20 74 61 62 6c 65 20 61 74 20  at the table at 
2b560 70 57 61 6c 6b 65 72 2d 3e 69 43 75 72 0a 2a 2a  pWalker->iCur.**
2b570 20 68 61 76 65 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   have a non-NULL
2b580 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 73 65   column, then se
2b590 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  t pWalker->eCode
2b5a0 20 74 6f 20 31 20 61 6e 64 20 61 62 6f 72 74 2e   to 1 and abort.
2b5b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
2b5c0 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2b5d0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2b5e0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2b5f0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
2b600 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2b610 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
2b620 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2b630 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
2b640 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
2b650 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
2b660 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
2b670 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
2b680 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
2b690 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
2b6a0 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 72  UNCTION:.      r
2b6b0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2b6c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
2b6d0 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
2b6e0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
2b6f0 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
2b700 75 2e 69 43 75 72 3d 3d 70 45 78 70 72 2d 3e 69  u.iCur==pExpr->i
2b710 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
2b720 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
2b730 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
2b740 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2b750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2b760 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2b770 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2b780 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2b790 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tinue;.  }.}../*
2b7a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
2b7b0 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 65 78  (non-zero) if ex
2b7c0 70 72 65 73 73 69 6f 6e 20 70 20 63 61 6e 20 6f  pression p can o
2b7d0 6e 6c 79 20 62 65 20 74 72 75 65 20 69 66 20 61  nly be true if a
2b7e0 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63  t least.** one c
2b7f0 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69  olumn of table i
2b800 54 61 62 20 69 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e  Tab is non-null.
2b810 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
2b820 2c 20 72 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a  , return true.**
2b830 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   if expression p
2b840 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
2b850 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20 69 66  NULL or false if
2b860 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
2b870 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c   iTab.** is NULL
2b880 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
2b890 20 70 20 74 68 61 74 20 61 72 65 20 6d 61 72 6b   p that are mark
2b8a0 65 64 20 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a  ed with EP_FromJ
2b8b0 6f 69 6e 20 28 61 6e 64 20 68 65 6e 63 65 20 74  oin (and hence t
2b8c0 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 0a 2a 2a  hat come from.**
2b8d0 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
2b8e0 20 63 6c 61 75 73 65 73 20 6f 66 20 4c 45 46 54   clauses of LEFT
2b8f0 20 4a 4f 49 4e 53 29 20 61 72 65 20 65 78 63 6c   JOINS) are excl
2b900 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20 61 6e  uded from the an
2b910 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  alysis..**.** Th
2b920 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2b930 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 61  ed to check if a
2b940 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62   LEFT JOIN can b
2b950 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
2b960 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  .** an ordinary 
2b970 4a 4f 49 4e 2e 20 20 54 68 65 20 70 20 61 72 67  JOIN.  The p arg
2b980 75 6d 65 6e 74 20 69 73 20 74 68 65 20 57 48 45  ument is the WHE
2b990 52 45 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  RE clause.  If t
2b9a0 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75  he WHERE.** clau
2b9b0 73 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74  se requires that
2b9c0 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e 20 6f 66 20   some column of 
2b9d0 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
2b9e0 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e  of the LEFT JOIN
2b9f0 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c  .** be non-NULL,
2ba00 20 74 68 65 6e 20 74 68 65 20 4c 45 46 54 20 4a   then the LEFT J
2ba10 4f 49 4e 20 63 61 6e 20 62 65 20 73 61 66 65 6c  OIN can be safel
2ba20 79 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  y converted into
2ba30 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20   an.** ordinary 
2ba40 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  join..*/.int sql
2ba50 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e  ite3ExprImpliesN
2ba60 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78 70 72 20 2a  onNullRow(Expr *
2ba70 70 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  p, int iTab){.  
2ba80 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45  Walker w;.  w.xE
2ba90 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 69 6d  xprCallback = im
2baa0 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 3b  pliesNotNullRow;
2bab0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2bac0 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 78 53  back = 0;.  w.xS
2bad0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
2bae0 20 30 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20   0;.  w.eCode = 
2baf0 30 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20  0;.  w.u.iCur = 
2bb00 69 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 57  iTab;.  sqlite3W
2bb10 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a  alkExpr(&w, p);.
2bb20 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65    return w.eCode
2bb30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  ;.}../*.** An in
2bb40 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2bb50 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2bb60 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
2bb70 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
2bb80 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
2bb90 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  an expression ca
2bba0 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 62  n be evaluated b
2bbb0 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  y reference to t
2bbc0 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79  he.** index only
2bbd0 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  , without having
2bbe0 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68 20   to do a search 
2bbf0 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
2bc00 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65  nding.** table e
2bc10 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78 43 6f  ntry.  The IdxCo
2bc20 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20 69  ver.pIdx field i
2bc30 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 64  s the index.  Id
2bc40 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69  xCover.iCur.** i
2bc50 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
2bc60 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
2bc70 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 7b  truct IdxCover {
2bc80 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
2bc90 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2bca0 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 66 6f   to be tested fo
2bcb0 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20  r coverage */.  
2bcc0 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
2bcd0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
2bce0 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
2bcf0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2bd00 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b   the index */.};
2bd10 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
2bd20 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
2bd30 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
2bd40 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
2bd50 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   .** pWalker->u.
2bd60 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 20  pIdxCover->iCur 
2bd70 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64  can be satisfied
2bd80 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78   using the index
2bd90 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  .** pWalker->u.p
2bda0 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a  IdxCover->pIdx..
2bdb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
2bdc0 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b 65  prIdxCover(Walke
2bdd0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2bde0 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20   *pExpr){.  if( 
2bdf0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
2be00 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72  LUMN.   && pExpr
2be10 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65  ->iTable==pWalke
2be20 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
2be30 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74  iCur.   && sqlit
2be40 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
2be50 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2be60 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78 70  over->pIdx, pExp
2be70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20  r->iColumn)<0.  
2be80 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
2be90 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 72  eCode = 1;.    r
2bea0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2beb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2bec0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2bed0 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
2bee0 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78 20  f an index pIdx 
2bef0 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  on table with cu
2bf00 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61 69  rsor iCur contai
2bf10 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65  ns will.** the e
2bf20 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
2bf30 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
2bf40 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73 20   the index does 
2bf50 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78 70  cover the.** exp
2bf60 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73  ression and fals
2bf70 65 20 69 66 20 74 68 65 20 70 45 78 70 72 20 65  e if the pExpr e
2bf80 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72 65  xpression refere
2bf90 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d  nces table colum
2bfa0 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 6e  ns.** that are n
2bfb0 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  ot found in the 
2bfc0 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a  index pIdx..**.*
2bfd0 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65 72  * An index cover
2bfe0 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ing an expressio
2bff0 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  n means that the
2c000 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
2c010 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20  be.** evaluated 
2c020 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69  using only the i
2c030 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75 74  ndex and without
2c040 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75   having to looku
2c050 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  p the.** corresp
2c060 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e 74  onding table ent
2c070 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
2c080 65 33 45 78 70 72 43 6f 76 65 72 65 64 42 79 49  e3ExprCoveredByI
2c090 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70 45  ndex(.  Expr *pE
2c0a0 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  xpr,        /* T
2c0b0 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74  he index to be t
2c0c0 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ested */.  int i
2c0d0 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Cur,           /
2c0e0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * The cursor num
2c0f0 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ber for the corr
2c100 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
2c110 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
2c120 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c130 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68 74  index that might
2c140 20 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f 76   be used for cov
2c150 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61  erage */.){.  Wa
2c160 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74  lker w;.  struct
2c170 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a   IdxCover xcov;.
2c180 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
2c190 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78 63  sizeof(w));.  xc
2c1a0 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  ov.iCur = iCur;.
2c1b0 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70 49    xcov.pIdx = pI
2c1c0 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  dx;.  w.xExprCal
2c1d0 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78 43  lback = exprIdxC
2c1e0 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78  over;.  w.u.pIdx
2c1f0 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20  Cover = &xcov;. 
2c200 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2c210 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 72  (&w, pExpr);.  r
2c220 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a  eturn !w.eCode;.
2c230 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  }.../*.** An ins
2c240 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2c250 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2c260 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
2c270 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74  tree walker.** t
2c280 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63  o count referenc
2c290 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75  es to table colu
2c2a0 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d  mns in the argum
2c2b0 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61  ents of an .** a
2c2c0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2c2d0 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  n, in order to i
2c2e0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  mplement the.** 
2c2f0 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54  sqlite3FunctionT
2c300 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65  hisSrc() routine
2c310 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43  ..*/.struct SrcC
2c320 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74  ount {.  SrcList
2c330 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65   *pSrc;   /* One
2c340 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d   particular FROM
2c350 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73   clause in a nes
2c360 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ted query */.  i
2c370 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20  nt nThis;       
2c380 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
2c390 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
2c3a0 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a  ns in pSrcList *
2c3b0 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20  /.  int nOther; 
2c3c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c3d0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2c3e0 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72  columns in other
2c3f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f   FROM clauses */
2c400 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  .};../*.** Count
2c410 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2c420 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2c430 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  umns..*/.static 
2c440 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74  int exprSrcCount
2c450 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2c460 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2c470 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29    /* The NEVER()
2c480 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74   on the second t
2c490 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73  erm is because s
2c4a0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
2c4b0 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a  esThisSrc().  **
2c4c0 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65   is always calle
2c4d0 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  d before sqlite3
2c4e0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2c4f0 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74  gates() and so t
2c500 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d  he.  ** TK_COLUM
2c510 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  Ns have not yet 
2c520 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69  been converted i
2c530 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
2c540 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69  N.  If.  ** sqli
2c550 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
2c560 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64  hisSrc() is used
2c570 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20   differently in 
2c580 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a  the future, the.
2c590 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c    ** NEVER() wil
2c5a0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d  l need to be rem
2c5b0 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70  oved. */.  if( p
2c5c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
2c5d0 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78  UMN || NEVER(pEx
2c5e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
2c5f0 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e  OLUMN) ){.    in
2c600 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
2c610 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57  SrcCount *p = pW
2c620 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75  alker->u.pSrcCou
2c630 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  nt;.    SrcList 
2c640 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
2c650 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20  .    int nSrc = 
2c660 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72  pSrc ? pSrc->nSr
2c670 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  c : 0;.    for(i
2c680 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29  =0; i<nSrc; i++)
2c690 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
2c6a0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d  r->iTable==pSrc-
2c6b0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
2c6c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2c6d0 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20   if( i<nSrc ){. 
2c6e0 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b       p->nThis++;
2c6f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c700 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20    p->nOther++;. 
2c710 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2c720 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2c730 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
2c740 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ne if any of the
2c750 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
2c760 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e  e pExpr Function
2c770 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53   reference.** pS
2c780 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  rcList.  Return 
2c790 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e  true if they do.
2c7a0 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72    Also return tr
2c7b0 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ue if the functi
2c7c0 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67  on.** has no arg
2c7d0 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e  uments or has on
2c7e0 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  ly constant argu
2c7f0 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66  ments.  Return f
2c800 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a  alse if pExpr.**
2c810 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75   references colu
2c820 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75  mns but not colu
2c830 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f  mns of tables fo
2c840 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e  und in pSrcList.
2c850 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2c860 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2c870 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  rc(Expr *pExpr, 
2c880 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
2c890 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
2c8a0 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
2c8b0 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  t cnt;.  assert(
2c8c0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2c8d0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
2c8e0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2c8f0 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b   = exprSrcCount;
2c900 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2c910 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  back = 0;.  w.u.
2c920 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74  pSrcCount = &cnt
2c930 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70  ;.  cnt.pSrc = p
2c940 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e  SrcList;.  cnt.n
2c950 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e  This = 0;.  cnt.
2c960 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71  nOther = 0;.  sq
2c970 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
2c980 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(&w, pExpr->x.p
2c990 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
2c9a0 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63  cnt.nThis>0 || c
2c9b0 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a  nt.nOther==0;.}.
2c9c0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
2c9d0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
2c9e0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
2c9f0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
2ca00 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
2ca10 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
2ca20 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
2ca30 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
2ca40 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
2ca50 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
2ca60 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
2ca70 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
2ca80 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
2ca90 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
2caa0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
2cab0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
2cac0 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
2cad0 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
2cae0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
2caf0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49  [0]),.       &pI
2cb00 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20  nfo->nColumn,.  
2cb10 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
2cb20 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
2cb30 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
2cb40 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
2cb50 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
2cb60 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
2cb70 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
2cb80 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
2cb90 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
2cba0 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
2cbb0 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
2cbc0 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
2cbd0 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33  InfoFunc(sqlite3
2cbe0 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
2cbf0 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
2cc00 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
2cc10 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
2cc20 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
2cc30 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  , .       pInfo-
2cc40 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73  >aFunc,.       s
2cc50 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
2cc60 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  nc[0]),.       &
2cc70 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
2cc80 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
2cc90 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
2cca0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
2ccb0 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  e xExprCallback 
2ccc0 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65  for a tree walke
2ccd0 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74  r.  It is used t
2cce0 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73  o.** implement s
2ccf0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2cd00 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
2cd10 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
2cd20 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2cd30 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
2cd40 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
2cd50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
2cd60 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57  alyzeAggregate(W
2cd70 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2cd80 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2cd90 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
2cda0 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
2cdb0 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61  ker->u.pNC;.  Pa
2cdc0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
2cdd0 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
2cde0 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
2cdf0 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
2ce00 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
2ce10 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49  nfo = pNC->pAggI
2ce20 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  nfo;..  switch( 
2ce30 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
2ce40 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
2ce50 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
2ce60 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
2ce70 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2ce80 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
2ce90 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
2cea0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2ceb0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
2cec0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
2ced0 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
2cee0 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
2cef0 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
2cf00 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
2cf10 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
2cf20 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
2cf30 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
2cf40 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29  S(pSrcList!=0) )
2cf50 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
2cf60 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2cf70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
2cf80 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
2cf90 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
2cfa0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
2cfb0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
2cfc0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
2cfd0 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
2cfe0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2cff0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2d000 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
2d010 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2d020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2d030 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
2d040 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
2d050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2d060 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
2d070 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
2d080 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
2d090 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
2d0a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
2d0b0 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
2d0c0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
2d0d0 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
2d0e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
2d0f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
2d100 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
2d110 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
2d120 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
2d130 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
2d140 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
2d150 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
2d160 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
2d170 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
2d180 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
2d190 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
2d1a0 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
2d1b0 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
2d1c0 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
2d1d0 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
2d1e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2d1f0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
2d200 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
2d210 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
2d220 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
2d230 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
2d240 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
2d250 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2d260 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2d270 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d280 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
2d290 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
2d2a0 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
2d2b0 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
2d2c0 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
2d2d0 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
2d2e0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
2d2f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2d300 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
2d310 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
2d320 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2d330 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
2d340 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
2d350 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
2d360 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
2d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2d380 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
2d390 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
2d3a0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2d3b0 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
2d3c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
2d3d0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
2d3e0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
2d3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2d400 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
2d410 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2d420 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
2d430 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
2d440 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2d450 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
2d460 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
2d470 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
2d480 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
2d490 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2d4a0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2d4b0 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
2d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4d0 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
2d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4f0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
2d500 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
2d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
2d520 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
2d530 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
2d540 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2d550 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2d560 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
2d570 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
2d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d590 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
2d5a0 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
2d5b0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2d5c0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2d5d0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
2d5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2d5f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2d610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d620 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2d630 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2d640 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
2d650 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
2d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2d670 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2d680 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
2d690 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
2d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2d6b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2d6c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d6d0 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
2d6e0 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
2d6f0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
2d700 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
2d710 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
2d720 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
2d730 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
2d740 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
2d750 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
2d760 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
2d770 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
2d780 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
2d790 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
2d7a0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
2d7b0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
2d7c0 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
2d7d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  */.            E
2d7e0 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2d7f0 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
2d800 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  duce);.         
2d810 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
2d820 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
2d830 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2d840 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
2d850 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
2d860 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
2d870 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20  (i16)k;.        
2d880 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2d890 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
2d8a0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
2d8b0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
2d8c0 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
2d8d0 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
2d8e0 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
2d8f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2d900 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  _Prune;.    }.  
2d910 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
2d920 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
2d930 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67  if( (pNC->ncFlag
2d940 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63  s & NC_InAggFunc
2d950 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )==0.       && p
2d960 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
2d970 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a  pth==pExpr->op2.
2d980 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2d990 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
2d9a0 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
2d9b0 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
2d9c0 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
2d9d0 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
2d9e0 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
2d9f0 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
2da00 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
2da10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2da20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2da30 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
2da40 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
2da50 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2da60 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2da70 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
2da80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2da90 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2daa0 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  e(0, pItem->pExp
2dab0 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30  r, pExpr, -1)==0
2dac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dad0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2dae0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2daf0 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
2db00 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
2db10 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
2db20 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
2db30 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
2db40 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
2db50 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
2db60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
2db70 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
2db80 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
2db90 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
2dba0 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
2dbb0 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
2dbc0 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
2dbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
2dbe0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2dbf0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2dc00 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2dc10 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
2dc20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
2dc30 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
2dc40 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
2dc50 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
2dc60 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
2dc70 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2dc80 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  m;.            a
2dc90 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2dca0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2dcb0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
2dcc0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2dcd0 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->pFunc = sqlite
2dce0 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
2dcf0 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
2dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2dd10 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20  pr->u.zToken, . 
2dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd30 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74    pExpr->x.pList
2dd40 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   ? pExpr->x.pLis
2dd50 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
2dd60 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
2dd70 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
2dd80 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
2dd90 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
2dda0 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
2ddb0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
2ddc0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
2ddd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2dde0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
2ddf0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
2de00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2de10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2de20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
2de30 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
2de40 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
2de50 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2de60 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
2de70 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2de80 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2de90 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
2dea0 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2deb0 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
2dec0 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2ded0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
2dee0 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20  educe);.        
2def0 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
2df00 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45  16)i;.        pE
2df10 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
2df20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
2df30 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2df40 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ne;.      }else{
2df50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2df60 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
2df70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2df80 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2df90 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
2dfa0 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
2dfb0 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61  gatesInSelect(Wa
2dfc0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
2dfd0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
2dfe0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2dff0 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  TER(pSelect);.  
2e000 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44  pWalker->walkerD
2e010 65 70 74 68 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  epth++;.  return
2e020 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2e030 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61  .static void ana
2e040 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
2e050 53 65 6c 65 63 74 45 6e 64 28 57 61 6c 6b 65 72  SelectEnd(Walker
2e060 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
2e070 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55  t *pSelect){.  U
2e080 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2e090 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c  pSelect);.  pWal
2e0a0 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
2e0b0 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  --;.}../*.** Ana
2e0c0 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65  lyze the pExpr e
2e0d0 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
2e0e0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
2e0f0 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
2e100 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
2e110 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
2e120 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20  dded to AggInfo 
2e130 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d  object that pNC-
2e140 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69  >pAggInfo.** poi
2e150 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f  nts to.  Additio
2e160 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20  nal entries are 
2e170 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49  made on the AggI
2e180 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a  nfo object as.**
2e190 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
2e1a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
2e1b0 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
2e1c0 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
2e1d0 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
2e1e0 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
2e1f0 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
2e200 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
2e210 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
2e220 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2e230 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
2e240 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
2e250 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2e260 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
2e270 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
2e280 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  te;.  w.xSelectC
2e290 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
2e2a0 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
2e2b0 65 63 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ect;.  w.xSelect
2e2c0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 61 6e 61 6c  Callback2 = anal
2e2d0 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2e2e0 65 6c 65 63 74 45 6e 64 3b 0a 20 20 77 2e 77 61  electEnd;.  w.wa
2e2f0 6c 6b 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20  lkerDepth = 0;. 
2e300 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
2e310 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
2e320 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
2e330 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2e340 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  &w, pExpr);.}../
2e350 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
2e360 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2e370 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65  egates() for eve
2e380 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
2e390 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   an.** expressio
2e3a0 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  n list.  Return 
2e3b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
2e3c0 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rors..**.** If a
2e3d0 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64  n error is found
2e3e0 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69  , the analysis i
2e3f0 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a  s cut short..*/.
2e400 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
2e410 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
2e420 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
2e430 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2e440 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
2e450 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2e460 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
2e470 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
2e480 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
2e490 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
2e4a0 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
2e4b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  m++){.      sqli
2e4c0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2e4d0 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49  gregates(pNC, pI
2e4e0 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
2e4f0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2e500 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c  Allocate a singl
2e510 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66  e new register f
2e520 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73  or use to hold s
2e530 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ome intermediate
2e540 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20   result..*/.int 
2e550 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2e560 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
2e570 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
2e580 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20  nTempReg==0 ){. 
2e590 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72     return ++pPar
2e5a0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20  se->nMem;.  }.  
2e5b0 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61  return pParse->a
2e5c0 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65  TempReg[--pParse
2e5d0 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a  ->nTempReg];.}..
2e5e0 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2e5f0 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b   a register, mak
2e600 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ing available fo
2e610 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65  r reuse for some
2e620 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73   other.** purpos
2e630 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  e..**.** If a re
2e640 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e  gister is curren
2e650 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62  tly being used b
2e660 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  y the column cac
2e670 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  he, then.** the 
2e680 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  deallocation is 
2e690 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
2e6a0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
2e6b0 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a  line that uses.*
2e6c0 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62  * the register b
2e6d0 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f  ecomes stale..*/
2e6e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
2e6f0 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73  easeTempReg(Pars
2e700 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2e710 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67  Reg){.  if( iReg
2e720 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d   && pParse->nTem
2e730 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
2e740 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
2e750 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2e760 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
2e770 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  che *p;.    for(
2e780 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
2e790 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
2e7a0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
2e7b0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, p++){.      
2e7c0 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65  if( p->iReg==iRe
2e7d0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  g ){.        p->
2e7e0 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20  tempReg = 1;.   
2e7f0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2e800 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
2e810 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2e820 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2e830 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  ++] = iReg;.  }.
2e840 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2e850 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20  e or deallocate 
2e860 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20  a block of nReg 
2e870 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
2e880 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  sters..*/.int sq
2e890 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
2e8a0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2e8b0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
2e8c0 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52  t i, n;.  if( nR
2e8d0 65 67 3d 3d 31 20 29 20 72 65 74 75 72 6e 20 73  eg==1 ) return s
2e8e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2e8f0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 20 3d 20  (pParse);.  i = 
2e900 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2e910 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
2e920 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
2e930 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20  ( nReg<=n ){.   
2e940 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73   assert( !usedAs
2e950 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
2e960 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b  se, i, i+n-1) );
2e970 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
2e980 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
2e990 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
2e9a0 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
2e9b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
2e9c0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
2e9d0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
2e9e0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
2e9f0 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
2ea00 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2ea10 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
2ea20 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
2ea30 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
2ea40 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20  f( nReg==1 ){.  
2ea50 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
2ea60 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
2ea70 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75 72  iReg);.    retur
2ea80 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
2ea90 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
2eaa0 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52  pParse, iReg, nR
2eab0 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg);.  if( nReg>
2eac0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2ead0 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
2eae0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
2eaf0 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
2eb00 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
2eb10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
2eb20 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  rk all temporary
2eb30 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65   registers as be
2eb40 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20  ing unavailable 
2eb50 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f  for reuse..*/.vo
2eb60 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54  id sqlite3ClearT
2eb70 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73  empRegCache(Pars
2eb80 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
2eb90 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d  arse->nTempReg =
2eba0 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52   0;.  pParse->nR
2ebb0 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a  angeReg = 0;.}..
2ebc0 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74  /*.** Validate t
2ebd0 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79  hat no temporary
2ebe0 20 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20   register falls 
2ebf0 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
2ec00 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69   of.** iFirst..i
2ec10 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e  Last, inclusive.
2ec20 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2ec30 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d  s only call from
2ec40 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
2ec50 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  .** statements..
2ec60 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2ec70 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  _DEBUG.int sqlit
2ec80 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65  e3NoTempsInRange
2ec90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2eca0 69 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20  int iFirst, int 
2ecb0 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  iLast){.  int i;
2ecc0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2ecd0 52 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26  RangeReg>0.   &&
2ece0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2ecf0 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg+pParse->nRang
2ed00 65 52 65 67 20 3e 20 69 46 69 72 73 74 0a 20 20  eReg > iFirst.  
2ed10 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e   && pParse->iRan
2ed20 67 65 52 65 67 20 3c 3d 20 69 4c 61 73 74 0a 20  geReg <= iLast. 
2ed30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
2ed40 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
2ed50 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d  ; i<pParse->nTem
2ed60 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  pReg; i++){.    
2ed70 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  if( pParse->aTem
2ed80 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20  pReg[i]>=iFirst 
2ed90 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  && pParse->aTemp
2eda0 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b  Reg[i]<=iLast ){
2edb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
2edc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2edd0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
2ede0 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
2edf0 2a 2f 0a                                         */.