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

Artifact e5861888a30d63611f59861d9b8c7adb591f04a6924d3683484e4f47ce59e148:


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 20 20 69 66 28 20  ;.    }.    if( 
8a10: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8a20: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20  (p, EP_Reduced) 
8a30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8a40: 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 64 62 2c  WindowDelete(db,
8a50: 20 70 2d 3e 70 57 69 6e 29 3b 0a 20 20 20 20 7d   p->pWin);.    }
8a60: 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48  .  }.  if( ExprH
8a70: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8a80: 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c  _MemToken) ) sql
8a90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8aa0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69  ->u.zToken);.  i
8ab0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8ac0: 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63  rty(p, EP_Static
8ad0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8ae0: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
8af0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
8b00: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
8b10: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
8b20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73  *p){.  if( p ) s
8b30: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8b40: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  NN(db, p);.}../*
8b50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
8b60: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
8b70: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
8b80: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75   expression stru
8b90: 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64  cture .** passed
8ba0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
8bb0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
8bc0: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58  always one of EX
8bd0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20  PR_FULLSIZE,.** 
8be0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8bf0: 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   or EXPR_TOKENON
8c00: 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  LYSIZE..*/.stati
8c10: 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74  c int exprStruct
8c20: 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  Size(Expr *p){. 
8c30: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8c40: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8c50: 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45  Only) ) return E
8c60: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
8c70: 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  E;.  if( ExprHas
8c80: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
8c90: 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e  educed) ) return
8ca0: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
8cb0: 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52  E;.  return EXPR
8cc0: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  _FULLSIZE;.}../*
8cd0: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8ce0: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
8cf0: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
8d00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
8d10: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
8d20: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
8d30: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
8d40: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
8d50: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
8d60: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
8d70: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
8d80: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
8d90: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
8da0: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
8db0: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
8dc0: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
8dd0: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
8de0: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
8df0: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
8e00: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
8e10: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
8e20: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
8e30: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
8e40: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
8e50: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
8e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
8ea0: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
8eb0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
8ec0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
8ed0: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
8ee0: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
8ef0: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
8f00: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
8f10: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
8f20: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
8f30: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
8f40: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
8f50: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
8f60: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
8f70: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
8f80: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
8f90: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
8fa0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
8fb0: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
8fc0: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
8fd0: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
8fe0: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
8ff0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
9000: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
9010: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
9020: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
9030: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
9040: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
9050: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
9060: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
9070: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
9080: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
9090: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
90a0: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
90b0: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
90c0: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
90d0: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
90e0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
90f0: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
9100: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
9110: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
9120: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
9130: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
9140: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
9150: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
9160: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
9170: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
9180: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
9190: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
91a0: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
91b0: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
91c0: 66 20 74 68 65 20 45 78 70 72 20 6f 62 6a 65 63  f the Expr objec
91d0: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
91e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
91f0: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
9200: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
9210: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
9220: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
9230: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
9240: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
9250: 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  an EXPRDUP_REDUC
9260: 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75  E copy of a redu
9270: 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ced expression. 
9280: 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61   It is only lega
9290: 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61  l.** to reduce a
92a0: 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73   pristine expres
92b0: 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74  sion tree from t
92c0: 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20  he parser.  The 
92d0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
92e0: 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74  * of dupedExprSt
92f0: 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61  ructSize() conta
9300: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65  in multiple asse
9310: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
9320: 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20  that attempt.** 
9330: 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
9340: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
9350: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
9360: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
9370: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
9380: 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a  ){.  int nSize;.
9390: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
93a0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
93b0: 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f  || flags==0 ); /
93c0: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20  * Only one flag 
93d0: 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  value allowed */
93e0: 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f  .  assert( EXPR_
93f0: 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20  FULLSIZE<=0xfff 
9400: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78  );.  assert( (0x
9410: 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65  fff & (EP_Reduce
9420: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29  d|EP_TokenOnly))
9430: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d  ==0 );.  if( 0==
9440: 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  flags || p->op==
9450: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
9460: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
9470: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
9480: 0a 20 20 20 7c 7c 20 70 2d 3e 70 57 69 6e 20 0a  .   || p->pWin .
9490: 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
94a0: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c  nSize = EXPR_FUL
94b0: 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LSIZE;.  }else{.
94c0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
94d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
94e0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
94f0: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
9500: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
9510: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
9520: 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20  romJoin) ); .   
9530: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
9540: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9550: 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20  MemToken) );.   
9560: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
9570: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9580: 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20  NoReduce) );.   
9590: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c   if( p->pLeft ||
95a0: 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20   p->x.pList ){. 
95b0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
95c0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20  R_REDUCEDSIZE | 
95d0: 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20  EP_Reduced;.    
95e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
95f0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
9600: 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65  0 );.      nSize
9610: 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c   = EXPR_TOKENONL
9620: 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e  YSIZE | EP_Token
9630: 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Only;.    }.  }.
9640: 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a    return nSize;.
9650: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
9660: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
9670: 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65  he space in byte
9680: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  s required to st
9690: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a  ore the copy .**
96a0: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
96b0: 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70  ucture and a cop
96c0: 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e  y of the Expr.u.
96d0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
96e0: 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67  f that.** string
96f0: 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f   is defined.).*/
9700: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
9710: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78  dExprNodeSize(Ex
9720: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
9730: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
9740: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
9750: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26  Size(p, flags) &
9760: 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45   0xfff;.  if( !E
9770: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9780: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
9790: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
97a0: 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71  .    nByte += sq
97b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
97c0: 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20  >u.zToken)+1;.  
97d0: 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  }.  return ROUND
97e0: 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  8(nByte);.}../*.
97f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
9800: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
9810: 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65  quired to create
9820: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
9830: 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  the .** expressi
9840: 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65  on passed as the
9850: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
9860: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
9870: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73  ment is a.** mas
9880: 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50  k containing EXP
9890: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
98a0: 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
98b0: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
98c0: 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74  s space to creat
98d0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
98e0: 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69  Expr struct.** i
98f0: 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75  tself and the bu
9900: 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f  ffer referred to
9910: 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65   by Expr.u.zToke
9920: 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a  n, if any..**.**
9930: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
9940: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
9950: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  et, then the ret
9960: 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64  urn value includ
9970: 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20  es .** space to 
9980: 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78  duplicate all Ex
9990: 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20  pr nodes in the 
99a0: 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45  tree formed by E
99b0: 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e  xpr.pLeft .** an
99c0: 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61  d Expr.pRight va
99d0: 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74  riables (but not
99e0: 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75   for any structu
99f0: 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f  res pointed to o
9a00: 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20  r .** descended 
9a10: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
9a20: 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e  pList or Expr.x.
9a30: 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65  pSelect variable
9a40: 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s)..*/.static in
9a50: 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  t dupedExprSize(
9a60: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
9a70: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
9a80: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b   = 0;.  if( p ){
9a90: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70  .    nByte = dup
9aa0: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70  edExprNodeSize(p
9ab0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
9ac0: 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f  ( flags&EXPRDUP_
9ad0: 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20  REDUCE ){.      
9ae0: 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78  nByte += dupedEx
9af0: 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c  prSize(p->pLeft,
9b00: 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45   flags) + dupedE
9b10: 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68  xprSize(p->pRigh
9b20: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  t, flags);.    }
9b30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42  .  }.  return nB
9b40: 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  yte;.}../*.** Th
9b50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
9b60: 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
9b70: 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65  3ExprDup(), exce
9b80: 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66  pt that if pzBuf
9b90: 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e  fer .** is not N
9ba0: 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66  ULL then *pzBuff
9bb0: 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
9bc0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
9bd0: 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  er large enough 
9be0: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65  .** to store the
9bf0: 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
9c00: 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65  ion p, the copie
9c10: 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  s of p->u.zToken
9c20: 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62  .** (if applicab
9c30: 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70  le), and the cop
9c40: 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c  ies of the p->pL
9c50: 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68  eft and p->pRigh
9c60: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  t expressions,.*
9c70: 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65  * if any. Before
9c80: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42   returning, *pzB
9c90: 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20  uffer is set to 
9ca0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
9cb0: 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69  ast the.** porti
9cc0: 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  on of the buffer
9cd0: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20   copied into by 
9ce0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
9cf0: 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65  /.static Expr *e
9d00: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
9d10: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
9d20: 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a   dupFlags, u8 **
9d30: 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70  pzBuffer){.  Exp
9d40: 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  r *pNew;        
9d50: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
9d60: 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a  eturn */.  u8 *z
9d70: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
9d80: 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65   /* Memory space
9d90: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62   from which to b
9da0: 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74  uild Expr object
9db0: 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63   */.  u32 static
9dc0: 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45  Flag;       /* E
9dd0: 50 5f 53 74 61 74 69 63 20 69 66 20 73 70 61 63  P_Static if spac
9de0: 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66  e not obtained f
9df0: 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  rom malloc */.. 
9e00: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
9e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ;.  assert( p );
9e20: 0a 20 20 61 73 73 65 72 74 28 20 64 75 70 46 6c  .  assert( dupFl
9e30: 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61  ags==0 || dupFla
9e40: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
9e50: 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CE );.  assert( 
9e60: 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64  pzBuffer==0 || d
9e70: 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  upFlags==EXPRDUP
9e80: 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a  _REDUCE );..  /*
9e90: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
9ea0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e  e to write the n
9eb0: 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72  ew Expr structur
9ec0: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75  e. */.  if( pzBu
9ed0: 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c  ffer ){.    zAll
9ee0: 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a  oc = *pzBuffer;.
9ef0: 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d      staticFlag =
9f00: 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65   EP_Static;.  }e
9f10: 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20  lse{.    zAlloc 
9f20: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
9f30: 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64  cRawNN(db, duped
9f40: 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46  ExprSize(p, dupF
9f50: 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74  lags));.    stat
9f60: 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a  icFlag = 0;.  }.
9f70: 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a    pNew = (Expr *
9f80: 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20  )zAlloc;..  if( 
9f90: 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53  pNew ){.    /* S
9fa0: 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74  et nNewSize to t
9fb0: 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65  he size allocate
9fc0: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
9fd0: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20  ure pointed to. 
9fe0: 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54     ** by pNew. T
9ff0: 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58  his is either EX
a000: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50  PR_FULLSIZE, EXP
a010: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
a020: 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b  .    ** EXPR_TOK
a030: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b  ENONLYSIZE. nTok
a040: 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  en is set to the
a050: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
a060: 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a   consumed.    **
a070: 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20   by the copy of 
a080: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
a090: 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e  string (if any).
a0a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  .    */.    cons
a0b0: 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75  t unsigned nStru
a0c0: 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78  ctSize = dupedEx
a0d0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
a0e0: 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63  dupFlags);.    c
a0f0: 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a  onst int nNewSiz
a100: 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20  e = nStructSize 
a110: 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74  & 0xfff;.    int
a120: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28   nToken;.    if(
a130: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
a140: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
a150: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
a160: 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e   ){.      nToken
a170: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a180: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
a190: 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  + 1;.    }else{.
a1a0: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30        nToken = 0
a1b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a1c0: 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  dupFlags ){.    
a1d0: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
a1e0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
a1f0: 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20  Reduced)==0 );. 
a200: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c       memcpy(zAll
a210: 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29  oc, p, nNewSize)
a220: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a230: 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28     u32 nSize = (
a240: 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53 69  u32)exprStructSi
a250: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ze(p);.      mem
a260: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
a270: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
a280: 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c   nSize<EXPR_FULL
a290: 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20  SIZE ){ .       
a2a0: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
a2b0: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
a2c0: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
a2d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
a2e0: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45      /* Set the E
a2f0: 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f  P_Reduced, EP_To
a300: 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f  kenOnly, and EP_
a310: 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70  Static flags app
a320: 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  ropriately. */. 
a330: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26     pNew->flags &
a340: 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45  = ~(EP_Reduced|E
a350: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53  P_TokenOnly|EP_S
a360: 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65  tatic|EP_MemToke
a370: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c  n);.    pNew->fl
a380: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
a390: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
a3a0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
a3b0: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
a3c0: 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a  |= staticFlag;..
a3d0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
a3e0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
a3f0: 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ng, if any. */. 
a400: 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b     if( nToken ){
a410: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f  .      char *zTo
a420: 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54  ken = pNew->u.zT
a430: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a  oken = (char*)&z
a440: 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b  Alloc[nNewSize];
a450: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54  .      memcpy(zT
a460: 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  oken, p->u.zToke
a470: 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  n, nToken);.    
a480: 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28  }..    if( 0==((
a490: 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66  p->flags|pNew->f
a4a0: 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65  lags) & (EP_Toke
a4b0: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20  nOnly|EP_Leaf)) 
a4c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  ){.      /* Fill
a4d0: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
a4e0: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
a4f0: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
a500: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78   */.      if( Ex
a510: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
a520: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
a530: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a540: 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  x.pSelect = sqli
a550: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
a560: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64   p->x.pSelect, d
a570: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
a580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
a590: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73  New->x.pList = s
a5a0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
a5b0: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  p(db, p->x.pList
a5c0: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a5d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
a5e0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
a5f0: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
a600: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
a610: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
a620: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
a630: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
a640: 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  y) ){.      zAll
a650: 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e  oc += dupedExprN
a660: 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  odeSize(p, dupFl
a670: 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
a680: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a690: 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f  (pNew, EP_TokenO
a6a0: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
a6b0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
a6c0: 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f  eft = p->pLeft ?
a6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a6e0: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a6f0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50  b, p->pLeft, EXP
a700: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
a710: 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20  lloc) : 0;.     
a720: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a730: 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20  = p->pRight ?.  
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c       exprDup(db,
a760: 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52   p->pRight, EXPR
a770: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
a780: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
a790: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75  }.      if( pzBu
a7a0: 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ffer ){.        
a7b0: 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c  *pzBuffer = zAll
a7c0: 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  oc;.      }.    
a7d0: 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53  }else{.#ifndef S
a7e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
a7f0: 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20  WFUNC.      if( 
a800: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a810: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  p, EP_Reduced|EP
a820: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
a830: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 57 69         pNew->pWi
a840: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  n = 0;.      }el
a850: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
a860: 2d 3e 70 57 69 6e 20 3d 20 73 71 6c 69 74 65 33  ->pWin = sqlite3
a870: 57 69 6e 64 6f 77 44 75 70 28 64 62 2c 20 70 4e  WindowDup(db, pN
a880: 65 77 2c 20 70 2d 3e 70 57 69 6e 29 3b 0a 20 20  ew, p->pWin);.  
a890: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
a8a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
a8b0: 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20 20 20 20  OWFUNC */.      
a8c0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
a8d0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
a8e0: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b  Only|EP_Leaf) ){
a8f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
a900: 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  w->op==TK_SELECT
a910: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
a920: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
a930: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
a940: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a950: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20  ->iColumn==0 || 
a960: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
a970: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
a980: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20  ( p->pRight==0  
a990: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d  || p->pRight==p-
a9a0: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
a9b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a9c0: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
a9d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a9e0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29  db, p->pLeft, 0)
a9f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
aa00: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
aa10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
aa20: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
aa30: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
aa40: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
aa50: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pNew;.}../*.** C
aa60: 72 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  reate and return
aa70: 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20   a deep copy of 
aa80: 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  the object passe
aa90: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
aaa0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66  .** argument. If
aab0: 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   an OOM conditio
aac0: 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  n is encountered
aad0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
aae0: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62  ed.** and the db
aaf0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
ab00: 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e  lag set..*/.#ifn
ab10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ab20: 43 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20  CTE.static With 
ab30: 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33  *withDup(sqlite3
ab40: 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a   *db, With *p){.
ab50: 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30    With *pRet = 0
ab60: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
ab70: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
ab80: 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66  eof(*p) + sizeof
ab90: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
aba0: 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65  nCte-1);.    pRe
abb0: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
abc0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
abd0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74  e);.    if( pRet
abe0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
abf0: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74  .      pRet->nCt
ac00: 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20  e = p->nCte;.   
ac10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
ac20: 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
ac30: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
ac40: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
ac50: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
ac60: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20  ->a[i].pSelect, 
ac70: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  0);.        pRet
ac80: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73  ->a[i].pCols = s
ac90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
aca0: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43  p(db, p->a[i].pC
acb0: 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ols, 0);.       
acc0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d   pRet->a[i].zNam
acd0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
ace0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
acf0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
ad00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
ad10: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65  rn pRet;.}.#else
ad20: 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75  .# define withDu
ad30: 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a  p(x,y) 0.#endif.
ad40: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
ad50: 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f  wing group of ro
ad60: 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70  utines make deep
ad70: 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65   copies of expre
ad80: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65  ssions,.** expre
ad90: 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20  ssion lists, ID 
ada0: 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63  lists, and selec
adb0: 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54  t statements.  T
adc0: 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a  he copies can.**
add0: 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20   be deleted (by 
ade0: 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20  being passed to 
adf0: 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65  their respective
ae00: 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75   ...Delete() rou
ae10: 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75  tines).** withou
ae20: 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20  t effecting the 
ae30: 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a  originals..**.**
ae40: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
ae50: 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f  list, ID, and so
ae60: 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72  urce lists retur
ae70: 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  n by sqlite3Expr
ae80: 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71  ListDup(),.** sq
ae90: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29  lite3IdListDup()
aea0: 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63  , and sqlite3Src
aeb0: 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f  ListDup() can no
aec0: 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70  t be further exp
aed0: 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62  anded .** by sub
aee0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
aef0: 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65   sqlite*ListAppe
af00: 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  nd() routines..*
af10: 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20  *.** Any tables 
af20: 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74  that the SrcList
af30: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
af40: 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74  are not duplicat
af50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
af60: 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ags parameter co
af70: 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61  ntains a combina
af80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52  tion of the EXPR
af90: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
afa0: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
afb0: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
afc0: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74  set, then the st
afd0: 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
afe0: 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74   is a.** truncat
aff0: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
b000: 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72  e usual Expr str
b010: 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
b020: 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a   be stored as.**
b030: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d   part of the in-
b040: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
b050: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
b060: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f  abase schema..*/
b070: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
b080: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
b090: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
b0a0: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
b0b0: 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
b0c0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
b0d0: 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UCE );.  return 
b0e0: 70 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20  p ? exprDup(db, 
b0f0: 70 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30  p, flags, 0) : 0
b100: 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  ;.}.ExprList *sq
b110: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
b120: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
b130: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  prList *p, int f
b140: 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73  lags){.  ExprLis
b150: 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63  t *pNew;.  struc
b160: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
b170: 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65  *pItem, *pOldIte
b180: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  m;.  int i;.  Ex
b190: 70 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63 74  pr *pPriorSelect
b1a0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  Col = 0;.  asser
b1b0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
b1c0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
b1d0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
b1e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b1f0: 28 64 62 2c 20 73 71 6c 69 74 65 33 44 62 4d 61  (db, sqlite3DbMa
b200: 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 29 29  llocSize(db, p))
b210: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
b220: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
b230: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e  ew->nExpr = p->n
b240: 45 78 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d 20  Expr;.  pItem = 
b250: 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49  pNew->a;.  pOldI
b260: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
b270: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
b280: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
b290: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
b2a0: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
b2b0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
b2c0: 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e  pr;.    Expr *pN
b2d0: 65 77 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65  ewExpr;.    pIte
b2e0: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
b2f0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
b300: 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a  ldExpr, flags);.
b310: 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72      if( pOldExpr
b320: 20 0a 20 20 20 20 20 26 26 20 70 4f 6c 64 45 78   .     && pOldEx
b330: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
b340: 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26  T_COLUMN.     &&
b350: 20 28 70 4e 65 77 45 78 70 72 20 3d 20 70 49 74   (pNewExpr = pIt
b360: 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a 20  em->pExpr)!=0 . 
b370: 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
b380: 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43  rt( pNewExpr->iC
b390: 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20  olumn==0 || i>0 
b3a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
b3b0: 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  wExpr->iColumn==
b3c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
b3d0: 65 72 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e 70  ert( pOldExpr->p
b3e0: 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e  Left==pOldExpr->
b3f0: 70 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20  pRight );.      
b400: 20 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f    pPriorSelectCo
b410: 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c  l = pNewExpr->pL
b420: 65 66 74 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e  eft = pNewExpr->
b430: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d 65  pRight;.      }e
b440: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
b450: 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
b460: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
b470: 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20 29  m[-1].pExpr!=0 )
b480: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b490: 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c  ( pNewExpr->iCol
b4a0: 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70  umn==pItem[-1].p
b4b0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20  Expr->iColumn+1 
b4c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b4d0: 74 28 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43  t( pPriorSelectC
b4e0: 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45  ol==pItem[-1].pE
b4f0: 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  xpr->pLeft );.  
b500: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 2d 3e        pNewExpr->
b510: 70 4c 65 66 74 20 3d 20 70 50 72 69 6f 72 53 65  pLeft = pPriorSe
b520: 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20 7d  lectCol;.      }
b530: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 6d  .    }.    pItem
b540: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
b550: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
b560: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
b570: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
b580: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b590: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b5a0: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
b5b0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
b5c0: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
b5d0: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
b5e0: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49  done = 0;.    pI
b5f0: 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20  tem->bSpanIsTab 
b600: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61  = pOldItem->bSpa
b610: 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65  nIsTab;.    pIte
b620: 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 3d 20  m->bSorterRef = 
b630: 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 6f 72 74 65  pOldItem->bSorte
b640: 72 52 65 66 3b 0a 20 20 20 20 70 49 74 65 6d 2d  rRef;.    pItem-
b650: 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75  >u = pOldItem->u
b660: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b670: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  New;.}../*.** If
b680: 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65   cursors, trigge
b690: 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75  rs, views and su
b6a0: 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c  bqueries are all
b6b0: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a   omitted from.**
b6c0: 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e   the build, then
b6d0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   none of the fol
b6e0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c  lowing routines,
b6f0: 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20   except for .** 
b700: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
b710: 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  (), can be calle
b720: 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  d. sqlite3Select
b730: 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d  Dup() is sometim
b740: 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74  es.** called wit
b750: 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  h a NULL argumen
b760: 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  t..*/.#if !defin
b770: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
b780: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
b790: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
b7a0: 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66  GGER) \. || !def
b7b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b7c0: 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69  _SUBQUERY).SrcLi
b7d0: 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
b7e0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
b7f0: 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69  b, SrcList *p, i
b800: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63  nt flags){.  Src
b810: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
b820: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  t i;.  int nByte
b830: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
b840: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
b850: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42  ) return 0;.  nB
b860: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
b870: 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20   + (p->nSrc>0 ? 
b880: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
b890: 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20  * (p->nSrc-1) : 
b8a0: 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  0);.  pNew = sql
b8b0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b8c0: 4e 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  N(db, nByte );. 
b8d0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
b8e0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
b8f0: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
b900: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
b910: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
b920: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
b930: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
b940: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
b950: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
b960: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
b970: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
b980: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
b990: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
b9a0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pNewItem->pSchem
b9b0: 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  a = pOldItem->pS
b9c0: 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49  chema;.    pNewI
b9d0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
b9e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
b9f0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
ba00: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
ba10: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
ba20: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
ba30: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
ba40: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
ba50: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
ba60: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
ba70: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  , pOldItem->zAli
ba80: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
ba90: 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d  m->fg = pOldItem
baa0: 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74  ->fg;.    pNewIt
bab0: 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f  em->iCursor = pO
bac0: 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ldItem->iCursor;
bad0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61  .    pNewItem->a
bae0: 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c  ddrFillSub = pOl
baf0: 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  dItem->addrFillS
bb00: 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ub;.    pNewItem
bb10: 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f  ->regReturn = pO
bb20: 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  ldItem->regRetur
bb30: 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49  n;.    if( pNewI
bb40: 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
bb50: 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  dBy ){.      pNe
bb60: 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  wItem->u1.zIndex
bb70: 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62  edBy = sqlite3Db
bb80: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
bb90: 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
bba0: 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  By);.    }.    p
bbb0: 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65  NewItem->pIBInde
bbc0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49  x = pOldItem->pI
bbd0: 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  BIndex;.    if( 
bbe0: 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54  pNewItem->fg.isT
bbf0: 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  abFunc ){.      
bc00: 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75  pNewItem->u1.pFu
bc10: 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20  ncArg = .       
bc20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
bc30: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
bc40: 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c  em->u1.pFuncArg,
bc50: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20   flags);.    }. 
bc60: 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74     pTab = pNewIt
bc70: 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49  em->pTab = pOldI
bc80: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
bc90: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20  f( pTab ){.     
bca0: 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b   pTab->nTabRef++
bcb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
bcc0: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Item->pSelect = 
bcd0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
bce0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
bcf0: 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a  Select, flags);.
bd00: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f      pNewItem->pO
bd10: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
bd20: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
bd30: 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20  >pOn, flags);.  
bd40: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69    pNewItem->pUsi
bd50: 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ng = sqlite3IdLi
bd60: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
bd70: 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20  em->pUsing);.   
bd80: 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73   pNewItem->colUs
bd90: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63  ed = pOldItem->c
bda0: 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65  olUsed;.  }.  re
bdb0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
bdc0: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
bdd0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
bde0: 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  b, IdList *p){. 
bdf0: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
be00: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
be10: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
be20: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
be30: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
be40: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
be50: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
be60: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
be70: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
be80: 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e   pNew->nId = p->
be90: 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  nId;.  pNew->a =
bea0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
beb0: 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64  RawNN(db, p->nId
bec0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
bed0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
bee0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
bef0: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
bf00: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
bf10: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f  n 0;.  }.  /* No
bf20: 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  te that because 
bf30: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
bf40: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
bf50: 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a  ->a[] is not.  *
bf60: 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20  * necessarily a 
bf70: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71  power of two, sq
bf80: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
bf90: 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  d() may not be c
bfa0: 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  alled.  ** on th
bfb0: 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61  e duplicate crea
bfc0: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
bfd0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
bfe0: 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b  =0; i<p->nId; i+
bff0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49  +){.    struct I
c000: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  dList_item *pNew
c010: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
c020: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  i];.    struct I
c030: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  dList_item *pOld
c040: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
c050: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
c060: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
c070: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
c080: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
c090: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
c0a0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
c0b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
c0c0: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
c0d0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
c0e0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
c0f0: 74 20 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c 61  t *pDup, int fla
c100: 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  gs){.  Select *p
c110: 52 65 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63  Ret = 0;.  Selec
c120: 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t *pNext = 0;.  
c130: 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26 70  Select **pp = &p
c140: 52 65 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  Ret;.  Select *p
c150: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
c160: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44  =0 );.  for(p=pD
c170: 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69  up; p; p=p->pPri
c180: 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  or){.    Select 
c190: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  *pNew = sqlite3D
c1a0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c1b0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
c1c0: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
c1d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77   break;.    pNew
c1e0: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
c1f0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
c200: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61  , p->pEList, fla
c210: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c220: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
c230: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
c240: 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Src, flags);.   
c250: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
c260: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
c270: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c  b, p->pWhere, fl
c280: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c290: 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
c2a0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
c2b0: 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66  , p->pGroupBy, f
c2c0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lags);.    pNew-
c2d0: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
c2e0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
c2f0: 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29  >pHaving, flags)
c300: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64  ;.    pNew->pOrd
c310: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
c320: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
c330: 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73  >pOrderBy, flags
c340: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  );.    pNew->op 
c350: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65  = p->op;.    pNe
c360: 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74  w->pNext = pNext
c370: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69  ;.    pNew->pPri
c380: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  or = 0;.    pNew
c390: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
c3a0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
c3b0: 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b  >pLimit, flags);
c3c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  .    pNew->iLimi
c3d0: 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  t = 0;.    pNew-
c3e0: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >iOffset = 0;.  
c3f0: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
c400: 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26   = p->selFlags &
c410: 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72   ~SF_UsesEphemer
c420: 61 6c 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  al;.    pNew->ad
c430: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
c440: 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  -1;.    pNew->ad
c450: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
c460: 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53  -1;.    pNew->nS
c470: 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53  electRow = p->nS
c480: 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e  electRow;.    pN
c490: 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68  ew->pWith = with
c4a0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  Dup(db, p->pWith
c4b0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
c4c0: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
c4d0: 43 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e  C.    pNew->pWin
c4e0: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
c4f0: 70 57 69 6e 44 65 66 6e 20 3d 20 73 71 6c 69 74  pWinDefn = sqlit
c500: 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 75 70 28  e3WindowListDup(
c510: 64 62 2c 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29  db, p->pWinDefn)
c520: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
c530: 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
c540: 65 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e  e(pNew, p->zSelN
c550: 61 6d 65 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  ame);.    *pp = 
c560: 70 4e 65 77 3b 0a 20 20 20 20 70 70 20 3d 20 26  pNew;.    pp = &
c570: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pNew->pPrior;.  
c580: 20 20 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a    pNext = pNew;.
c590: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
c5a0: 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  et;.}.#else.Sele
c5b0: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
c5c0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
c5d0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
c5e0: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
c5f0: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
c600: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
c610: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
c620: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
c630: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
c640: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
c650: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
c660: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
c670: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
c680: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
c690: 2a 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74 20 61  *.** The pList a
c6a0: 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
c6b0: 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61  either NULL or a
c6c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 45   pointer to an E
c6d0: 78 70 72 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69  xprList.** obtai
c6e0: 6e 65 64 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ned from a prior
c6f0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
c700: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29  ExprListAppend()
c710: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
c720: 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73  ** may not be us
c730: 65 64 20 77 69 74 68 20 61 6e 20 45 78 70 72 4c  ed with an ExprL
c740: 69 73 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ist obtained fro
c750: 6d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  m sqlite3ExprLis
c760: 74 44 75 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f  tDup()..** Reaso
c770: 6e 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n:  This routine
c780: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
c790: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74  e number of slot
c7a0: 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a  s in pList->a[].
c7b0: 2a 2a 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ** is a power of
c7c0: 20 74 77 6f 2e 20 20 54 68 61 74 20 69 73 20 74   two.  That is t
c7d0: 72 75 65 20 66 6f 72 20 73 71 6c 69 74 65 33 45  rue for sqlite3E
c7e0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 20  xprListAppend() 
c7f0: 72 65 74 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69  returns.** but i
c800: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
c810: 79 20 74 72 75 65 20 66 72 6f 6d 20 74 68 65 20  y true from the 
c820: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
c830: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
c840: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  up()..**.** If a
c850: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
c860: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
c870: 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74   the entire list
c880: 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a   is freed and.**
c890: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
c8a0: 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20  d.  If non-NULL 
c8b0: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
c8c0: 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
c8d0: 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e  ed.** that the n
c8e0: 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63  ew entry was suc
c8f0: 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64  cessfully append
c900: 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  ed..*/.ExprList 
c910: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
c920: 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20  Append(.  Parse 
c930: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
c940: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c950: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
c960: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
c970: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
c980: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
c990: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
c9a0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
c9b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
c9c0: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70  ession to be app
c9d0: 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20  ended. Might be 
c9e0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  NULL */.){.  str
c9f0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
ca00: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
ca10: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
ca20: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
ca30: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
ca40: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
ca50: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
ca60: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
ca70: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
ca80: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
ca90: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
caa0: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
cab0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70  .    pList->nExp
cac0: 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  r = 0;.  }else i
cad0: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
cae0: 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72   & (pList->nExpr
caf0: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45  -1))==0 ){.    E
cb00: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
cb10: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
cb20: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
cb30: 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20  List, .         
cb40: 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73      sizeof(*pLis
cb50: 74 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e 45 78  t)+(2*pList->nEx
cb60: 70 72 20 2d 20 31 29 2a 73 69 7a 65 6f 66 28 70  pr - 1)*sizeof(p
cb70: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
cb80: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
cb90: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
cba0: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
cbb0: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
cbc0: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
cbd0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
cbe0: 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ++];.  assert( o
cbf0: 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45  ffsetof(struct E
cc00: 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61  xprList_item,zNa
cc10: 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49 74 65  me)==sizeof(pIte
cc20: 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20 20 61  m->pExpr) );.  a
cc30: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
cc40: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
cc50: 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30 20 29  item,pExpr)==0 )
cc60: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 49 74 65  ;.  memset(&pIte
cc70: 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f  m->zName,0,sizeo
cc80: 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73 65 74  f(*pItem)-offset
cc90: 6f 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69  of(struct ExprLi
cca0: 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b  st_item,zName));
ccb0: 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20  .  pItem->pExpr 
ccc0: 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72  = pExpr;.  retur
ccd0: 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d  n pList;..no_mem
cce0: 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69  :     .  /* Avoi
ccf0: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
cd00: 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66   if malloc has f
cd10: 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69  ailed. */.  sqli
cd20: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
cd30: 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  , pExpr);.  sqli
cd40: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
cd50: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
cd60: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
cd70: 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20  ** pColumns and 
cd80: 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76 65 63  pExpr form a vec
cd90: 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 20 77  tor assignment w
cda0: 68 69 63 68 20 69 73 20 70 61 72 74 20 6f 66 20  hich is part of 
cdb0: 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73  the SET.** claus
cdc0: 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73  e of an UPDATE s
cdd0: 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20  tatement.  Like 
cde0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
cdf0: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 65 78     (a,b,c) = (ex
ce00: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
ce10: 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c  .** Or:    (a,b,
ce20: 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78 2c 79  c) = (SELECT x,y
ce30: 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a  ,z FROM ....).**
ce40: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72  .** For each ter
ce50: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  m of the vector 
ce60: 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65  assignment, appe
ce70: 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74  nd new entries t
ce80: 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  o the.** express
ce90: 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20  ion list pList. 
cea0: 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20   In the case of 
ceb0: 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  a subquery on th
cec0: 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a  e RHS, append.**
ced0: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
cee0: 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a  N expressions..*
cef0: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
cf00: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
cf10: 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72 73 65  dVector(.  Parse
cf20: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
cf30: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
cf40: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
cf50: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
cf60: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
cf70: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
cf80: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
cf90: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73  IdList *pColumns
cfa0: 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ,      /* List o
cfb0: 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f  f names of LHS o
cfc0: 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65 6e 74  f the assignment
cfd0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
cfe0: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
cff0: 56 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  Vector expressio
d000: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
d010: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
d020: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
d030: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d040: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
d050: 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74   i;.  int iFirst
d060: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
d070: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f  ->nExpr : 0;.  /
d080: 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f  * pColumns can o
d090: 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75 65 20  nly be NULL due 
d0a0: 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e  to an OOM but an
d0b0: 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20   OOM will cause 
d0c0: 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70 72 69  an.  ** exit pri
d0d0: 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
d0e0: 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64  ne being invoked
d0f0: 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
d100: 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67  pColumns==0) ) g
d110: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
d120: 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70  d_error;.  if( p
d130: 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76  Expr==0 ) goto v
d140: 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72  ector_append_err
d150: 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  or;..  /* If the
d160: 20 52 48 53 20 69 73 20 61 20 76 65 63 74 6f 72   RHS is a vector
d170: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 69 6d  , then we can im
d180: 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63 6b 20  mediately check 
d190: 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20 20 2a  to see that .  *
d1a0: 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * the size of th
d1b0: 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 6d 61  e RHS and LHS ma
d1c0: 74 63 68 2e 20 20 42 75 74 20 69 66 20 74 68 65  tch.  But if the
d1d0: 20 52 48 53 20 69 73 20 61 20 53 45 4c 45 43 54   RHS is a SELECT
d1e0: 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61 72 64  , .  ** wildcard
d1f0: 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65 20 72  s ("*") in the r
d200: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
d210: 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20   SELECT must be 
d220: 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
d230: 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20 74    ** we can do t
d240: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c 20 73  he size check, s
d250: 6f 20 64 65 66 65 72 20 74 68 65 20 73 69 7a 65  o defer the size
d260: 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64   check until cod
d270: 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20  e generation..  
d280: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
d290: 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op!=TK_SELECT &&
d2a0: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d   pColumns->nId!=
d2b0: 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65  (n=sqlite3ExprVe
d2c0: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 29 29  ctorSize(pExpr))
d2d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
d2e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d2f0: 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69  "%d columns assi
d300: 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c  gned %d values",
d310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d320: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e       pColumns->n
d330: 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  Id, n);.    goto
d340: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
d350: 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  rror;.  }..  for
d360: 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73  (i=0; i<pColumns
d370: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
d380: 20 45 78 70 72 20 2a 70 53 75 62 45 78 70 72 20   Expr *pSubExpr 
d390: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72  = sqlite3ExprFor
d3a0: 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72  VectorField(pPar
d3b0: 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20  se, pExpr, i);. 
d3c0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
d3d0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
d3e0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
d3f0: 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69  pSubExpr);.    i
d400: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
d410: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
d420: 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69  >nExpr==iFirst+i
d430: 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73  +1 );.      pLis
d440: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
d450: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f  r-1].zName = pCo
d460: 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  lumns->a[i].zNam
d470: 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e  e;.      pColumn
d480: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  s->a[i].zName = 
d490: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
d4a0: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
d4b0: 61 69 6c 65 64 20 26 26 20 70 45 78 70 72 2d 3e  ailed && pExpr->
d4c0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
d4d0: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 21 3d 30   ALWAYS(pList!=0
d4e0: 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ) ){.    Expr *p
d4f0: 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61  First = pList->a
d500: 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a  [iFirst].pExpr;.
d510: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72      assert( pFir
d520: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
d530: 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d  ert( pFirst->op=
d540: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
d550: 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f  N );.     .    /
d560: 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45 4c 45  * Store the SELE
d570: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
d580: 70 52 69 67 68 74 20 73 6f 20 69 74 20 77 69 6c  pRight so it wil
d590: 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  l be deleted whe
d5a0: 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  n.    ** sqlite3
d5b0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 29  ExprListDelete()
d5c0: 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20   is called */.  
d5d0: 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67 68 74    pFirst->pRight
d5e0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70 45   = pExpr;.    pE
d5f0: 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  xpr = 0;..    /*
d600: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69   Remember the si
d610: 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ze of the LHS in
d620: 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20   iTable so that 
d630: 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61  we can check tha
d640: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53  t.    ** the RHS
d650: 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73 20 6d   and LHS sizes m
d660: 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f 64 65  atch during code
d670: 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a   generation. */.
d680: 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54 61 62      pFirst->iTab
d690: 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e  le = pColumns->n
d6a0: 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f  Id;.  }..vector_
d6b0: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20  append_error:.  
d6c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
d6d0: 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
d6e0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
d6f0: 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73  ete(db, pColumns
d700: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
d710: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
d720: 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66  the sort order f
d730: 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d  or the last elem
d740: 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ent on the given
d750: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f   ExprList..*/.vo
d760: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
d770: 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45  stSetSortOrder(E
d780: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
d790: 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69  iSortOrder){.  i
d7a0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
d7b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
d7c0: 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c  TE_SO_UNDEFINED<
d7d0: 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41  0 && SQLITE_SO_A
d7e0: 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  SC>=0 && SQLITE_
d7f0: 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61  SO_DESC>0 );.  a
d800: 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e  ssert( p->nExpr>
d810: 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74  0 );.  if( iSort
d820: 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61  Order<0 ){.    a
d830: 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e  ssert( p->a[p->n
d840: 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65  Expr-1].sortOrde
d850: 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  r==SQLITE_SO_ASC
d860: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
d870: 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45    }.  p->a[p->nE
d880: 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72  xpr-1].sortOrder
d890: 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65   = (u8)iSortOrde
d8a0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  r;.}../*.** Set 
d8b0: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
d8c0: 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f  .zName element o
d8d0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
d8e0: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
d8f0: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
d900: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
d910: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
d920: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
d930: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
d940: 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65   pName should ne
d950: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
d960: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
d970: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
d980: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
d990: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
d9a0: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
d9b0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
d9c0: 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61  istSetName(.  Pa
d9d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d9e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d9f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
da00: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
da10: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
da20: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
da30: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  e span. */.  Tok
da40: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
da50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20       /* Name to 
da60: 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e  be added */.  in
da70: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
da80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
da90: 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20   cause the name 
daa0: 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a  to be dequoted *
dab0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
dac0: 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  List!=0 || pPars
dad0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
dae0: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
daf0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
db00: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
db10: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73  m *pItem;.    as
db20: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
db30: 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65  pr>0 );.    pIte
db40: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
db50: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
db60: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
db70: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ->zName==0 );.  
db80: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
db90: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
dba0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  p(pParse->db, pN
dbb0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
dbc0: 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f  );.    if( dequo
dbd0: 74 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75  te ) sqlite3Dequ
dbe0: 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ote(pItem->zName
dbf0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
dc00: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
dc10: 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65  .a[].zSpan eleme
dc20: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
dc30: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
dc40: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
dc50: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
dc60: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
dc70: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
dc80: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
dc90: 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c   But pSpan shoul
dca0: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
dcb0: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
dcc0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
dcd0: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
dce0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
dcf0: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
dd00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
dd10: 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a  xprListSetSpan(.
dd20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
dd30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
dd40: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
dd50: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
dd60: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
dd70: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
dd80: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
dd90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
dda0: 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74 61 72  art,     /* Star
ddb0: 74 20 6f 66 20 74 68 65 20 73 70 61 6e 20 2a 2f  t of the span */
ddc0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
ddd0: 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  End        /* En
dde0: 64 20 6f 66 20 74 68 65 20 73 70 61 6e 20 2a 2f  d of the span */
ddf0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
de00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
de10: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
de20: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
de30: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
de40: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
de50: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
de60: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
de70: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
de80: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
de90: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
dea0: 72 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  r>0 );.    sqlit
deb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
dec0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
ded0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
dee0: 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75 70 28  qlite3DbSpanDup(
def0: 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64  db, zStart, zEnd
df00: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
df10: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
df20: 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f  n list pEList co
df30: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
df40: 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73   iLimit elements
df50: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
df60: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
df70: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
df80: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
df90: 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72  eckLength(.  Par
dfa0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
dfb0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a  prList *pEList,.
dfc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
dfd0: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d  bject.){.  int m
dfe0: 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  x = pParse->db->
dff0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
e000: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74  MIT_COLUMN];.  t
e010: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
e020: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
e030: 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61  ==mx );.  testca
e040: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
e050: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b  List->nExpr==mx+
e060: 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  1 );.  if( pELis
e070: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
e080: 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c  pr>mx ){.    sql
e090: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
e0a0: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
e0b0: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
e0c0: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
e0d0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
e0e0: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
e0f0: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  n list..*/.stati
e100: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
e110: 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73 74 44  E void exprListD
e120: 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20  eleteNN(sqlite3 
e130: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
e140: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 20 3d  List){.  int i =
e150: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
e160: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
e170: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 20  _item *pItem =  
e180: 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73 73 65  pList->a;.  asse
e190: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
e1a0: 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  >0 );.  do{.    
e1b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
e1c0: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78  e(db, pItem->pEx
e1d0: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
e1e0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
e1f0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
e200: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e210: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
e220: 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 7d 77     pItem++;.  }w
e230: 68 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b 0a 20  hile( --i>0 );. 
e240: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
e250: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76  (db, pList);.}.v
e260: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
e270: 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
e280: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
e290: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  *pList){.  if( p
e2a0: 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73 74 44  List ) exprListD
e2b0: 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73  eleteNN(db, pLis
e2c0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
e2d0: 75 72 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d  urn the bitwise-
e2e0: 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66  OR of all Expr.f
e2f0: 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74  lags fields in t
e300: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72  he given.** Expr
e310: 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  List..*/.u32 sql
e320: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
e330: 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74  s(const ExprList
e340: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
e350: 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a  i;.  u32 m = 0;.
e360: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
e370: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
e380: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
e390: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 45 78 70 72   i++){.     Expr
e3a0: 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   *pExpr = pList-
e3b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
e3c0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21    assert( pExpr!
e3d0: 3d 30 20 29 3b 0a 20 20 20 20 20 6d 20 7c 3d 20  =0 );.     m |= 
e3e0: 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20  pExpr->flags;.  
e3f0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a  }.  return m;.}.
e400: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
e410: 20 53 45 4c 45 43 54 2d 6e 6f 64 65 20 63 61 6c   SELECT-node cal
e420: 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 65 78  lback for the ex
e430: 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72 20  pression walker 
e440: 74 68 61 74 0a 2a 2a 20 61 6c 77 61 79 73 20 22  that.** always "
e450: 66 61 69 6c 73 22 2e 20 20 42 79 20 22 66 61 69  fails".  By "fai
e460: 6c 22 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c  l" in this case,
e470: 20 77 65 20 6d 65 61 6e 20 73 65 74 0a 2a 2a 20   we mean set.** 
e480: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74  pWalker->eCode t
e490: 6f 20 7a 65 72 6f 20 61 6e 64 20 61 62 6f 72 74  o zero and abort
e4a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
e4b0: 6c 62 61 63 6b 20 69 73 20 75 73 65 64 20 62 79  lback is used by
e4c0: 20 6d 75 6c 74 69 70 6c 65 20 65 78 70 72 65 73   multiple expres
e4d0: 73 69 6f 6e 20 77 61 6c 6b 65 72 73 2e 0a 2a 2f  sion walkers..*/
e4e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
e4f0: 63 74 57 61 6c 6b 46 61 69 6c 28 57 61 6c 6b 65  ctWalkFail(Walke
e500: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
e510: 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  ct *NotUsed){.  
e520: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
e530: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61  (NotUsed);.  pWa
e540: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
e550: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62  .  return WRC_Ab
e560: 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  ort;.}../*.** If
e570: 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65   the input expre
e580: 73 73 69 6f 6e 20 69 73 20 61 6e 20 49 44 20 77  ssion is an ID w
e590: 69 74 68 20 74 68 65 20 6e 61 6d 65 20 22 74 72  ith the name "tr
e5a0: 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22 0a 2a  ue" or "false".*
e5b0: 2a 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 69  * then convert i
e5c0: 74 20 69 6e 74 6f 20 61 6e 20 54 4b 5f 54 52 55  t into an TK_TRU
e5d0: 45 46 41 4c 53 45 20 74 65 72 6d 2e 20 20 52 65  EFALSE term.  Re
e5e0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
e5f0: 0a 2a 2a 20 74 68 65 20 63 6f 6e 76 65 72 73 69  .** the conversi
e600: 6f 6e 20 68 61 70 70 65 6e 65 64 2c 20 61 6e 64  on happened, and
e610: 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70   zero if the exp
e620: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 61 6c 74  ression is unalt
e630: 65 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ered..*/.int sql
e640: 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75 65  ite3ExprIdToTrue
e650: 46 61 6c 73 65 28 45 78 70 72 20 2a 70 45 78 70  False(Expr *pExp
e660: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45  r){.  assert( pE
e670: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c  xpr->op==TK_ID |
e680: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
e690: 53 54 52 49 4e 47 20 29 3b 0a 20 20 69 66 28 20  STRING );.  if( 
e6a0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
e6b0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
e6c0: 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 7c 7c  "true")==0.   ||
e6d0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e6e0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
e6f0: 20 22 66 61 6c 73 65 22 29 3d 3d 30 0a 20 20 29   "false")==0.  )
e700: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  {.    pExpr->op 
e710: 3d 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3b 0a  = TK_TRUEFALSE;.
e720: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
e730: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
e740: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
e750: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20 54 4b  ent must be a TK
e760: 5f 54 52 55 45 46 41 4c 53 45 20 45 78 70 72 20  _TRUEFALSE Expr 
e770: 6e 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 31 20  node.  Return 1 
e780: 69 66 20 69 74 20 69 73 20 54 52 55 45 0a 2a 2a  if it is TRUE.**
e790: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 73 20   and 0 if it is 
e7a0: 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  FALSE..*/.int sq
e7b0: 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
e7c0: 6c 75 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  lue(const Expr *
e7d0: 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74  pExpr){.  assert
e7e0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e7f0: 54 52 55 45 46 41 4c 53 45 20 29 3b 0a 20 20 61  TRUEFALSE );.  a
e800: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
e810: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
e820: 54 6f 6b 65 6e 2c 22 74 72 75 65 22 29 3d 3d 30  Token,"true")==0
e830: 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
e840: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
e850: 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 66 61 6c 73 65  >u.zToken,"false
e860: 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  ")==0 );.  retur
e870: 6e 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  n pExpr->u.zToke
e880: 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  n[4]==0;.}.../*.
e890: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
e8a0: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
e8b0: 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63  lbacks used to c
e8c0: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73  heck expressions
e8d0: 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68   to.** see if th
e8e0: 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74  ey are "constant
e8f0: 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e  " for some defin
e900: 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e  ition of constan
e910: 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65  t.  The.** Walke
e920: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65  r.eCode value de
e930: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70  termines the typ
e940: 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20  e of "constant" 
e950: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a  we are looking.*
e960: 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  * for..**.** The
e970: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
e980: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
e990: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
e9a0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
e9b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
e9c0: 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  sConstant()     
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
e9e0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a  lker->eCode==1.*
e9f0: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
ea00: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
ea10: 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70  in()           p
ea20: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
ea30: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
ea40: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
ea50: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
ea60: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
ea70: 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =3.**     sqlite
ea80: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
ea90: 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20  rFunction()     
eaa0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
eab0: 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20  e==4 or 5.**.** 
eac0: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68  In all cases, th
ead0: 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20  e callbacks set 
eae0: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61  Walker.eCode=0 a
eaf0: 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20  nd abort if the 
eb00: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
eb10: 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65   found to not be
eb20: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a   a constant..**.
eb30: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
eb40: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
eb50: 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64  nction() is used
eb60: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
eb70: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69  expressions.** i
eb80: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
eb90: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
eba0: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
ebb0: 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61  lue is 5 when pa
ebc0: 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73  rsing.** an exis
ebd0: 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20  ting schema and 
ebe0: 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  4 when processin
ebf0: 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  g a new statemen
ec00: 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70  t.  A bound.** p
ec10: 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20  arameter raises 
ec20: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77  an error for new
ec30: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74   statements, but
ec40: 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e   is silently con
ec50: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c  verted.** to NUL
ec60: 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73  L for existing s
ec70: 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c  chemas.  This al
ec80: 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74  lows sqlite_mast
ec90: 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a  er tables that .
eca0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75  ** contain a bou
ecb0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63  nd parameter bec
ecc0: 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67  ause they were g
ecd0: 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65  enerated by olde
ece0: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
ecf0: 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61   SQLite to be pa
ed00: 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  rsed by newer ve
ed10: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
ed20: 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67   without raising
ed30: 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20   a.** malformed 
ed40: 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f  schema error..*/
ed50: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
ed60: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
ed70: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
ed80: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
ed90: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
eda0: 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20  eCode is 2 then 
edb0: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
edc0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
edd0: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
ede0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
edf0: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66  clauses of a lef
ee00: 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  t join disqualif
ee10: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
ee20: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
ee30: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
ee40: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
ee50: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
ee60: 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =2 && ExprHasPro
ee70: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
ee80: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
ee90: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
eea0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
eeb0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
eec0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
eed0: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
eee0: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
eef0: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
ef00: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
ef10: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
ef20: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
ef30: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65  ither pWalker->e
ef40: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20  Code==4 or 5 or 
ef50: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  the function has
ef60: 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49   the.    ** SQLI
ef70: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c  TE_FUNC_CONST fl
ef80: 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ag. */.    case 
ef90: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
efa0: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
efb0: 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72  eCode>=4 || Expr
efc0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
efd0: 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20  r,EP_ConstFunc) 
efe0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
eff0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
f000: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f010: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f020: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
f030: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
f040: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
f050: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 20  ase TK_ID:.     
f060: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 74 72 75   /* Convert "tru
f070: 65 22 20 6f 72 20 22 66 61 6c 73 65 22 20 69 6e  e" or "false" in
f080: 20 61 20 44 45 46 41 55 4c 54 20 63 6c 61 75 73   a DEFAULT claus
f090: 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
f0a0: 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20   ** appropriate 
f0b0: 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 6f 70 65  TK_TRUEFALSE ope
f0c0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  rator */.      i
f0d0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 64  f( sqlite3ExprId
f0e0: 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45 78 70  ToTrueFalse(pExp
f0f0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
f100: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
f110: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
f120: 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   Fall thru */.  
f130: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
f140: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
f150: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
f160: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
f170: 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  MN:.      testca
f180: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
f190: 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65  K_ID );.      te
f1a0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
f1b0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
f1c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f1d0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
f1e0: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
f1f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
f200: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
f210: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
f220: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
f230: 64 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e  de==3 && pExpr->
f240: 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d  iTable==pWalker-
f250: 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20  >u.iCur ){.     
f260: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
f270: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
f280: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
f290: 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
f2a0: 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  e TK_IF_NULL_ROW
f2b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
f2c0: 47 49 53 54 45 52 3a 0a 20 20 20 20 20 20 74 65  GISTER:.      te
f2d0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
f2e0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
f2f0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f300: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f310: 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20  IF_NULL_ROW );. 
f320: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f330: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ode = 0;.      r
f340: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
f350: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
f360: 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28  IABLE:.      if(
f370: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f380: 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =5 ){.        /*
f390: 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72   Silently conver
f3a0: 74 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  t bound paramete
f3b0: 72 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  rs that appear i
f3c0: 6e 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a  nside of CREATE.
f3d0: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65          ** state
f3e0: 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c  ments into a NUL
f3f0: 4c 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74  L when parsing t
f400: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
f410: 65 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20  ent text out.   
f420: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73       ** of the s
f430: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f440: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45  le */.        pE
f450: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
f460: 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
f470: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
f480: 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  e==4 ){.        
f490: 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d  /* A bound param
f4a0: 65 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45  eter in a CREATE
f4b0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
f4c0: 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a  originates from.
f4d0: 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
f4e0: 65 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75  e3_prepare() cau
f4f0: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ses an error */.
f500: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
f510: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
f520: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
f530: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
f540: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
f550: 75 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75  ugh */.    defau
f560: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
f570: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
f580: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
f590: 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
f5a0: 46 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73  Fail() disallows
f5b0: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
f5c0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
f5d0: 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73  K_EXISTS ); /* s
f5e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
f5f0: 46 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73  Fail() disallows
f600: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
f610: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
f620: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20   }.}.static int 
f630: 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72  exprIsConst(Expr
f640: 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61   *p, int initFla
f650: 67 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20  g, int iCur){.  
f660: 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43  Walker w;.  w.eC
f670: 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  ode = initFlag;.
f680: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
f690: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
f6a0: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
f6b0: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
f6c0: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
f6d0: 61 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ail;.#ifdef SQLI
f6e0: 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65  TE_DEBUG.  w.xSe
f6f0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
f700: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
f710: 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66  kAssert2;.#endif
f720: 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 43  .  w.u.iCur = iC
f730: 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ur;.  sqlite3Wal
f740: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
f750: 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
f760: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
f770: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
f780: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
f790: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
f7a0: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
f7b0: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
f7c0: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
f7d0: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
f7e0: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
f7f0: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
f800: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
f810: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
f820: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
f830: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
f840: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
f850: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
f860: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
f870: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
f880: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
f890: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f8a0: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
f8b0: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
f8c0: 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a  st(p, 1, 0);.}..
f8d0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
f8e0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
f8f0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
f900: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
f910: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
f920: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72   that does no or
f930: 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65  iginate from the
f940: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
f950: 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a  uses of a join..
f960: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
f970: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
f980: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
f990: 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20   calls or terms 
f9a0: 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72  from.** an ON or
f9b0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
f9c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
f9d0: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
f9e0: 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  in(Expr *p){.  r
f9f0: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
fa00: 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f  t(p, 2, 0);.}../
fa10: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
fa20: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
fa30: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
fa40: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
fa50: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
fa60: 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65 20 72  for any single r
fa70: 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ow of the table 
fa80: 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72  with cursor iCur
fa90: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
faa0: 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  s, the.** expres
fab0: 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65  sion must not re
fac0: 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64  fer to any non-d
fad0: 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e  eterministic fun
fae0: 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a  ction nor any.**
faf0: 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61   table other tha
fb00: 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73  n iCur..*/.int s
fb10: 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
fb20: 65 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  eConstant(Expr *
fb30: 70 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20  p, int iCur){.  
fb40: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
fb50: 73 74 28 70 2c 20 33 2c 20 69 43 75 72 29 3b 0a  st(p, 3, iCur);.
fb60: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65  }.../*.** sqlite
fb70: 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c  3WalkExpr() call
fb80: 62 61 63 6b 20 75 73 65 64 20 62 79 20 73 71 6c  back used by sql
fb90: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
fba0: 6e 74 4f 72 47 72 6f 75 70 42 79 28 29 2e 0a 2a  ntOrGroupBy()..*
fbb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
fbc0: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f  rNodeIsConstantO
fbd0: 72 47 72 6f 75 70 42 79 28 57 61 6c 6b 65 72 20  rGroupBy(Walker 
fbe0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
fbf0: 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 4c 69  pExpr){.  ExprLi
fc00: 73 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20 70  st *pGroupBy = p
fc10: 57 61 6c 6b 65 72 2d 3e 75 2e 70 47 72 6f 75 70  Walker->u.pGroup
fc20: 42 79 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  By;.  int i;..  
fc30: 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78 70  /* Check if pExp
fc40: 72 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74  r is identical t
fc50: 6f 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74  o any GROUP BY t
fc60: 65 72 6d 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73  erm. If so, cons
fc70: 69 64 65 72 0a 20 20 2a 2a 20 69 74 20 63 6f 6e  ider.  ** it con
fc80: 73 74 61 6e 74 2e 20 20 2a 2f 0a 20 20 66 6f 72  stant.  */.  for
fc90: 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
fca0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
fcb0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 47 72     Expr *p = pGr
fcc0: 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  oupBy->a[i].pExp
fcd0: 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
fce0: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
fcf0: 20 70 45 78 70 72 2c 20 70 2c 20 2d 31 29 3c 32   pExpr, p, -1)<2
fd00: 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
fd10: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
fd20: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
fd30: 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c  pWalker->pParse,
fd40: 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73   p);.      if( s
fd50: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22  qlite3_stricmp("
fd60: 42 49 4e 41 52 59 22 2c 20 70 43 6f 6c 6c 2d 3e  BINARY", pColl->
fd70: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
fd80: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
fd90: 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20  Prune;.      }. 
fda0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
fdb0: 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73  heck if pExpr is
fdc0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49   a sub-select. I
fdd0: 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69  f so, consider i
fde0: 74 20 76 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20  t variable. */. 
fdf0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
fe00: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
fe10: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
fe20: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
fe30: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
fe40: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
fe50: 20 20 72 65 74 75 72 6e 20 65 78 70 72 4e 6f 64    return exprNod
fe60: 65 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c  eIsConstant(pWal
fe70: 6b 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  ker, pExpr);.}..
fe80: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65  /*.** Walk the e
fe90: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 70  xpression tree p
fea0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
feb0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74  st argument. Ret
fec0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20  urn non-zero.** 
fed0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
fee0: 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
fef0: 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73  ely of constants
ff00: 20 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 74 65   or copies of te
ff10: 72 6d 73 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75  rms .** in pGrou
ff20: 70 42 79 20 74 68 61 74 20 73 6f 72 74 20 77 69  pBy that sort wi
ff30: 74 68 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f  th the BINARY co
ff40: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
ff50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
ff60: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
ff70: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20 74  determine if a t
ff80: 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e  erm of the HAVIN
ff90: 47 20 63 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20  G clause can.** 
ffa0: 62 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f  be promoted into
ffb0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
ffc0: 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  e.  In order for
ffd0: 20 73 75 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f   such a promotio
ffe0: 6e 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68  n to work,.** th
fff0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 48  e value of the H
10000 41 56 49 4e 47 20 63 6c 61 75 73 65 20 74 65 72  AVING clause ter
10010 6d 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  m must be the sa
10020 6d 65 20 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65  me for all membe
10030 72 73 20 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75  rs of.** a "grou
10040 70 22 2e 20 20 54 68 65 20 72 65 71 75 69 72 65  p".  The require
10050 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 47 52  ment that the GR
10060 4f 55 50 20 42 59 20 74 65 72 6d 20 6d 75 73 74  OUP BY term must
10070 20 62 65 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73   be BINARY.** as
10080 73 75 6d 65 73 20 74 68 61 74 20 6e 6f 20 6f 74  sumes that no ot
10090 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  her collating se
100a0 71 75 65 6e 63 65 20 77 69 6c 6c 20 68 61 76 65  quence will have
100b0 20 61 20 66 69 6e 65 72 2d 67 72 61 69 6e 65 64   a finer-grained
100c0 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 20 74 68 61  .** grouping tha
100d0 6e 20 62 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74  n binary.  In ot
100e0 68 65 72 20 77 6f 72 64 73 20 28 41 3d 42 20 43  her words (A=B C
100f0 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 29 20 69  OLLATE binary) i
10100 6d 70 6c 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e  mplies.** A=B in
10110 20 65 76 65 72 79 20 6f 74 68 65 72 20 63 6f 6c   every other col
10120 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
10130 20 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e    The requiremen
10140 74 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 47 52  t that the.** GR
10150 4f 55 50 20 42 59 20 62 65 20 42 49 4e 41 52 59  OUP BY be BINARY
10160 20 69 73 20 73 74 72 69 63 74 65 72 20 74 68 61   is stricter tha
10170 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 20 49 74  n necessary.  It
10180 20 77 6f 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b   would also work
10190 0a 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48  .** to promote H
101a0 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 74 68  AVING clauses th
101b0 61 74 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  at use the same 
101c0 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c  alternative coll
101d0 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
101e0 65 20 61 73 20 74 68 65 20 47 52 4f 55 50 20 42  e as the GROUP B
101f0 59 20 74 65 72 6d 2c 20 62 75 74 20 74 68 61 74  Y term, but that
10200 20 69 73 20 6d 75 63 68 20 68 61 72 64 65 72 20   is much harder 
10210 74 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74  to check,.** alt
10220 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
10230 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 72 65  ng sequences are
10240 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74   uncommon, and t
10250 68 69 73 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a  his is only an.*
10260 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  * optimization, 
10270 73 6f 20 77 65 20 74 61 6b 65 20 74 68 65 20 65  so we take the e
10280 61 73 79 20 77 61 79 20 6f 75 74 20 61 6e 64 20  asy way out and 
10290 73 69 6d 70 6c 79 20 72 65 71 75 69 72 65 20 74  simply require t
102a0 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 74  he.** GROUP BY t
102b0 6f 20 75 73 65 20 74 68 65 20 42 49 4e 41 52 59  o use the BINARY
102c0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
102d0 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nce..*/.int sqli
102e0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
102f0 74 4f 72 47 72 6f 75 70 42 79 28 50 61 72 73 65  tOrGroupBy(Parse
10300 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
10310 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  p, ExprList *pGr
10320 6f 75 70 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72  oupBy){.  Walker
10330 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20   w;.  w.eCode = 
10340 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  1;.  w.xExprCall
10350 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49  back = exprNodeI
10360 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
10370 42 79 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  By;.  w.xSelectC
10380 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77  allback = 0;.  w
10390 2e 75 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  .u.pGroupBy = pG
103a0 72 6f 75 70 42 79 3b 0a 20 20 77 2e 70 50 61 72  roupBy;.  w.pPar
103b0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
103c0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
103d0 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
103e0 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  w.eCode;.}../*.*
103f0 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
10400 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
10410 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
10420 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
10430 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20   constant.** or 
10440 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  a function call 
10450 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72  with constant ar
10460 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
10470 20 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a   and 0 if there.
10480 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61  ** are any varia
10490 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  bles..**.** For 
104a0 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
104b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
104c0 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
104d0 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
104e0 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
104f0 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
10500 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
10510 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
10520 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
10530 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
10540 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
10550 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78  antOrFunction(Ex
10560 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74  pr *p, u8 isInit
10570 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49  ){.  assert( isI
10580 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74  nit==0 || isInit
10590 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
105a0 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34  exprIsConst(p, 4
105b0 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a  +isInit, 0);.}..
105c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
105d0 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
105e0 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  S./*.** Walk an 
105f0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
10600 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
10610 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  e expression con
10620 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75  tains a.** subqu
10630 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ery of some kind
10640 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
10650 68 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71  here are no subq
10660 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ueries..*/.int s
10670 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69  qlite3ExprContai
10680 6e 73 53 75 62 71 75 65 72 79 28 45 78 70 72 20  nsSubquery(Expr 
10690 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  *p){.  Walker w;
106a0 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a  .  w.eCode = 1;.
106b0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
106c0 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
106d0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65  alkNoop;.  w.xSe
106e0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
106f0 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
10700 46 61 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c  Fail;.#ifdef SQL
10710 49 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53  ITE_DEBUG.  w.xS
10720 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
10730 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
10740 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69  lkAssert2;.#endi
10750 66 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  f.  sqlite3WalkE
10760 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
10770 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b  turn w.eCode==0;
10780 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
10790 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
107a0 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e  on p codes a con
107b0 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68  stant integer th
107c0 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  at is small enou
107d0 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  gh.** to fit in 
107e0 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
107f0 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70  , return 1 and p
10800 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ut the value of 
10810 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69  the integer.** i
10820 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74  n *pValue.  If t
10830 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
10840 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
10850 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20  or if it is too 
10860 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  big.** to fit in
10870 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
10880 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
10890 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56   0 and leave *pV
108a0 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  alue unchanged..
108b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
108c0 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72  prIsInteger(Expr
108d0 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65   *p, int *pValue
108e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
108f0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
10900 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 20  turn 0;  /* Can 
10910 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c  only happen foll
10920 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a  owing on OOM */.
10930 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72  .  /* If an expr
10940 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74  ession is an int
10950 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61  eger literal tha
10960 74 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e  t fits in a sign
10970 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69  ed 32-bit.  ** i
10980 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65  nteger, then the
10990 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
109a0 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  g will have alre
109b0 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a  ady been set */.
109c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
109d0 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28  =TK_INTEGER || (
109e0 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
109f0 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20  tValue)!=0.     
10a00 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
10a10 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54  GetInt32(p->u.zT
10a20 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b  oken, &rc)==0 );
10a30 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ..  if( p->flags
10a40 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
10a50 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20  {.    *pValue = 
10a60 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  p->u.iValue;.   
10a70 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
10a80 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
10a90 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  {.    case TK_UP
10aa0 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  LUS: {.      rc 
10ab0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  = sqlite3ExprIsI
10ac0 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
10ad0 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   pValue);.      
10ae0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10af0 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
10b00 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
10b10 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10b20 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
10b30 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
10b40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10b50 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d  v!=(-2147483647-
10b60 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  1) );.        *p
10b70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20  Value = -v;.    
10b80 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
10b90 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10ba0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
10bb0 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  lt: break;.  }. 
10bc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10bd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  *.** Return FALS
10be0 45 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  E if there is no
10bf0 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
10c00 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
10c10 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  be NULL..**.** I
10c20 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10c30 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f   might be NULL o
10c40 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  r if the express
10c50 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c  ion is too compl
10c60 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65  ex.** to tell re
10c70 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a  turn TRUE.  .**.
10c80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10c90 69 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70  is used as an op
10ca0 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73  timization, to s
10cb0 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70  kip OP_IsNull op
10cc0 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65  codes.** when we
10cd0 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c   know that a val
10ce0 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  ue cannot be NUL
10cf0 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c  L.  Hence, a fal
10d00 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28  se positive.** (
10d10 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77  returning TRUE w
10d20 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20  hen in fact the 
10d30 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e  expression can n
10d40 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69  ever be NULL) mi
10d50 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c  ght.** be a smal
10d60 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  l performance hi
10d70 74 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  t but is otherwi
10d80 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e  se harmless.  On
10d90 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61   the other.** ha
10da0 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61  nd, a false nega
10db0 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20  tive (returning 
10dc0 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72  FALSE when the r
10dd0 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e  esult could be N
10de0 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b  ULL).** will lik
10df0 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ely result in an
10e00 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65   incorrect answe
10e10 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64  r.  So when in d
10e20 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  oubt, return.** 
10e30 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  TRUE..*/.int sql
10e40 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
10e50 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29  l(const Expr *p)
10e60 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69  {.  u8 op;.  whi
10e70 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
10e80 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LUS || p->op==TK
10e90 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70  _UMINUS ){ p = p
10ea0 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20  ->pLeft; }.  op 
10eb0 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  = p->op;.  if( o
10ec0 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
10ed0 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20   op = p->op2;.  
10ee0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
10ef0 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
10f00 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
10f10 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20  TRING:.    case 
10f20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61  TK_FLOAT:.    ca
10f30 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20  se TK_BLOB:.    
10f40 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
10f50 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a  case TK_COLUMN:.
10f60 20 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70        return Exp
10f70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
10f80 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c  EP_CanBeNull) ||
10f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  .             p-
10fa0 3e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20  >pTab==0 ||  /* 
10fb0 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f 6c  Reference to col
10fc0 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e 20  umn of index on 
10fd0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
10fe0 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69             (p->i
10ff0 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e  Column>=0 && p->
11000 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43  pTab->aCol[p->iC
11010 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
11020 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  0);.    default:
11030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
11040 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
11050 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
11060 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
11070 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  n is a constant 
11080 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a  which would be.*
11090 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f  * unchanged by O
110a0 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68 20  P_Affinity with 
110b0 74 68 65 20 61 66 66 69 6e 69 74 79 20 67 69 76  the affinity giv
110c0 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64  en in the second
110d0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
110e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
110f0 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
11100 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f  rmine if the OP_
11110 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69  Affinity operati
11120 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69  on.** can be omi
11130 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64  tted.  When in d
11140 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53  oubt return FALS
11150 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61  E.  A false nega
11160 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c  tive.** is harml
11170 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f  ess.  A false po
11180 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c  sitive, however,
11190 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74   can result in t
111a0 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77  he wrong.** answ
111b0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
111c0 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
111d0 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73  inityChange(cons
111e0 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20  t Expr *p, char 
111f0 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20  aff){.  u8 op;. 
11200 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45   if( aff==SQLITE
11210 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75  _AFF_BLOB ) retu
11220 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 1;.  while( p
11230 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
11240 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
11250 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65  US ){ p = p->pLe
11260 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ft; }.  op = p->
11270 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
11280 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
11290 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
112a0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
112b0 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
112c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
112d0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
112e0 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
112f0 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
11300 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11310 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
11320 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
11330 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c  LITE_AFF_REAL ||
11340 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
11350 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a  _NUMERIC;.    }.
11360 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
11370 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  NG: {.      retu
11380 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
11390 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20  FF_TEXT;.    }. 
113a0 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
113b0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
113c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
113d0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
113e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
113f0 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a  iTable>=0 );  /*
11400 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72   p cannot be par
11410 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e  t of a CHECK con
11420 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
11430 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75   return p->iColu
11440 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26  mn<0.          &
11450 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
11460 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
11470 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
11480 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  MERIC);.    }.  
11490 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
114a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
114b0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
114c0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
114d0 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
114e0 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75  is a row-id colu
114f0 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  mn name..*/.int 
11500 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63  sqlite3IsRowid(c
11510 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
11520 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
11530 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
11540 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
11550 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
11560 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  rICmp(z, "ROWID"
11570 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
11580 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
11590 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d  rICmp(z, "OID")=
115a0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
115b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
115c0 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20 52 48  .** pX is the RH
115d0 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  S of an IN opera
115e0 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73 20 61  tor.  If pX is a
115f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11600 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62  t .** that can b
11610 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20  e simplified to 
11620 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 61  a direct table a
11630 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75  ccess, then retu
11640 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
11650 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  to the SELECT st
11660 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20  atement.  If pX 
11670 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  is not a SELECT 
11680 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72  statement,.** or
11690 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   if the SELECT s
116a0 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74  tatement needs t
116b0 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20  o be manifested 
116c0 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74  into a transient
116d0 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  .** table, then 
116e0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
116f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11700 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61  MIT_SUBQUERY.sta
11710 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61  tic Select *isCa
11720 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
11730 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c  Expr *pX){.  Sel
11740 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73  ect *p;.  SrcLis
11750 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
11760 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
11770 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
11780 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72  t i;.  if( !Expr
11790 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
117a0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20  EP_xIsSelect) ) 
117b0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f  return 0;  /* No
117c0 74 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  t a subquery */.
117d0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
117e0 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72  perty(pX, EP_Var
117f0 53 65 6c 65 63 74 29 20 20 29 20 72 65 74 75 72  Select)  ) retur
11800 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61  n 0;  /* Correla
11810 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20  ted subq */.  p 
11820 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  = pX->x.pSelect;
11830 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
11840 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
11850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
11860 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
11870 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  CT */.  if( p->s
11880 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
11890 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
118a0 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74  ate) ){.    test
118b0 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
118c0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
118d0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
118e0 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
118f0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
11900 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
11910 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
11920 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
11930 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72  gregate );.    r
11940 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44  eturn 0; /* No D
11950 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
11960 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65  and no aggregate
11970 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
11980 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
11990 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20  GroupBy==0 );   
119a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
119b0 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
119c0 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
119d0 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
119e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
119f0 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54   /* Has no LIMIT
11a00 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
11a10 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
11a20 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
11a30 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48      /* Has no WH
11a40 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
11a50 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
11a60 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
11a70 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  0 );.  if( pSrc-
11a80 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
11a90 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
11aa0 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   Single term in 
11ab0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
11ac0 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
11ad0 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
11ae0 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20   0;     /* FROM 
11af0 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  is not a subquer
11b00 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70  y or view */.  p
11b10 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
11b20 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  .pTab;.  assert(
11b30 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
11b40 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c  sert( pTab->pSel
11b50 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ect==0 );       
11b60 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
11b70 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65  use is not a vie
11b80 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72  w */.  if( IsVir
11b90 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
11ba0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  urn 0;        /*
11bb0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74   FROM clause not
11bc0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
11bd0 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
11be0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65  ->pEList;.  asse
11bf0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
11c00 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54  .  /* All SELECT
11c10 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65   results must be
11c20 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66   columns. */.  f
11c30 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
11c40 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
11c50 20 20 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20     Expr *pRes = 
11c60 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
11c70 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73  pr;.    if( pRes
11c80 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
11c90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
11ca0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54  assert( pRes->iT
11cb0 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d  able==pSrc->a[0]
11cc0 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20  .iCursor );  /* 
11cd0 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64  Not a correlated
11ce0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d   subquery */.  }
11cf0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23  .  return p;.}.#
11d00 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11d10 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
11d20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11d30 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
11d40 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
11d50 64 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74  de that checks t
11d60 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  he left-most col
11d70 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62  umn of index tab
11d80 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69  le iCur to see i
11d90 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73  f.** it contains
11da0 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65   any NULL entrie
11db0 73 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65  s.  Cause the re
11dc0 67 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73  gister at regHas
11dd0 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a  Null to be set.*
11de0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * to a non-NULL 
11df0 76 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f  value if iCur co
11e00 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e  ntains no NULLs.
11e10 20 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72    Cause register
11e20 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74   regHasNull.** t
11e30 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  o be set to NULL
11e40 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
11e50 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
11e60 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  LL values..*/.st
11e70 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
11e80 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
11e90 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75  Vdbe *v, int iCu
11ea0 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c  r, int regHasNul
11eb0 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b  l){.  int addr1;
11ec0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11ed0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
11ee0 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  er, 0, regHasNul
11ef0 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  l);.  addr1 = sq
11f00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
11f10 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
11f20 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
11f30 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
11f40 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11f50 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c  Column, iCur, 0,
11f60 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
11f70 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
11f80 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
11f90 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65  PEOFARG);.  Vdbe
11fa0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72  Comment((v, "fir
11fb0 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22  st_entry_in(%d)"
11fc0 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69  , iCur));.  sqli
11fd0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
11fe0 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e  v, addr1);.}.#en
11ff0 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
12000 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
12010 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  RY./*.** The arg
12020 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f  ument is an IN o
12030 70 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c  perator with a l
12040 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75  ist (not a subqu
12050 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ery) on the .** 
12060 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e  right-hand side.
12070 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
12080 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f   that list is co
12090 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  nstant..*/.stati
120a0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52  c int sqlite3InR
120b0 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70  hsIsConstant(Exp
120c0 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20  r *pIn){.  Expr 
120d0 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73  *pLHS;.  int res
120e0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
120f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e  rHasProperty(pIn
12100 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
12110 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d  );.  pLHS = pIn-
12120 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70  >pLeft;.  pIn->p
12130 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20  Left = 0;.  res 
12140 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  = sqlite3ExprIsC
12150 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20  onstant(pIn);.  
12160 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48  pIn->pLeft = pLH
12170 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  S;.  return res;
12180 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
12190 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
121a0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d  s used by the im
121b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
121c0 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65  the IN (...) ope
121d0 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58  rator..** The pX
121e0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
121f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20  e expression on 
12200 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12210 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63  N operator, whic
12220 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69  h.** might be ei
12230 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65  ther a list of e
12240 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20  xpressions or a 
12250 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
12260 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
12270 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69  routine is to fi
12280 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
12290 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61  -tree object tha
122a0 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  t can.** be used
122b0 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20   either to test 
122c0 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69  for membership i
122d0 6e 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72  n the RHS set or
122e0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
122f0 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65  ugh.** all membe
12300 72 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65  rs of the RHS se
12310 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c  t, skipping dupl
12320 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  icates..**.** A 
12330 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
12340 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f   on the b-tree o
12350 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68  bject that is th
12360 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
12370 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20  operator.** and 
12380 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65  pX->iTable is se
12390 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
123a0 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a  f that cursor..*
123b0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
123c0 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  d value of this 
123d0 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74  function indicat
123e0 65 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79  es the b-tree ty
123f0 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  pe, as follows:.
12400 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  **.**   IN_INDEX
12410 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68  _ROWID      - Th
12420 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
12430 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
12440 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  e table..**   IN
12450 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
12460 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
12470 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  as opened on an 
12480 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  ascending index.
12490 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
124a0 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20  NDEX_DESC - The 
124b0 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
124c0 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  d on a descendin
124d0 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
124e0 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20  _INDEX_EPH      
124f0 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
12500 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73  as opened on a s
12510 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64  pecially created
12520 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12540 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65  populated ephere
12550 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  mal table..**   
12560 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20  IN_INDEX_NOOP   
12570 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20      - No cursor 
12580 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20  was allocated.  
12590 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  The IN operator 
125a0 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20  must be.**      
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125c0 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61     implemented a
125d0 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  s a sequence of 
125e0 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a  comparisons..**.
125f0 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62  ** An existing b
12600 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75  -tree might be u
12610 73 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65  sed if the RHS e
12620 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20  xpression pX is 
12630 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71  a simple.** subq
12640 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a  uery such as:.**
12650 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
12660 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d  column1>, <colum
12670 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62  n2>... FROM <tab
12680 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le>.**.** If the
12690 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
126a0 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
126b0 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70  t or a more comp
126c0 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20 74 68  lex subquery, th
126d0 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72  en.** an ephemer
126e0 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e  al table might n
126f0 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61  eed to be genera
12700 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53  ted from the RHS
12710 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d   and then.** pX-
12720 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20  >iTable made to 
12730 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68  point to the eph
12740 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73  emeral table ins
12750 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78  tead of an.** ex
12760 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a  isting table..**
12770 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20  .** The inFlags 
12780 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63  parameter must c
12790 6f 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e  ontain, at a min
127a0 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65  imum, one of the
127b0 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45   bits.** IN_INDE
127c0 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20  X_MEMBERSHIP or 
127d0 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75  IN_INDEX_LOOP bu
127e0 74 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49 66 20  t not both.  If 
127f0 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73  inFlags contains
12800 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
12810 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68  BERSHIP, then th
12820 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c  e generated tabl
12830 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  e will be used f
12840 6f 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d  or a fast.** mem
12850 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57  bership test.  W
12860 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58  hen the IN_INDEX
12870 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74  _LOOP bit is set
12880 2c 20 74 68 65 20 49 4e 20 69 6e 64 65 78 20 77  , the IN index w
12890 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  ill.** be used t
128a0 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  o loop over all 
128b0 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48  values of the RH
128c0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
128d0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ator..**.** When
128e0 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69   IN_INDEX_LOOP i
128f0 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
12900 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
12910 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a  sed to iterate.*
12920 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65  * through the se
12930 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20  t members) then 
12940 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20  the b-tree must 
12950 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c  not contain dupl
12960 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70  icates..** An ep
12970 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 77 69  heremal table wi
12980 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 75 6e  ll be created un
12990 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65  less the selecte
129a0 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75  d columns are gu
129b0 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
129c0 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65  e unique - eithe
129d0 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
129e0 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
129f0 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f  RY KEY or due to
12a00 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e  .** a UNIQUE con
12a10 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78  straint or index
12a20 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
12a30 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
12a40 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
12a50 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
12a60 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
12a70 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
12a80 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e  p tests) then an
12a90 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
12aa0 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
12ab0 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
12ac0 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49  s> is a single I
12ad0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
12ae0 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20  EY column or an 
12af0 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65  .** index can be
12b00 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20   found with the 
12b10 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d  specified <colum
12b20 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  ns> as its left-
12b30 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  most..**.** If t
12b40 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  he IN_INDEX_NOOP
12b50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58  _OK and IN_INDEX
12b60 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20  _MEMBERSHIP are 
12b70 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20  both set and.** 
12b80 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  if the RHS of th
12b90 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
12ba0 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73   a list (not a s
12bb0 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68  ubquery) then th
12bc0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69  is.** routine mi
12bd0 67 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20  ght decide that 
12be0 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65  creating an ephe
12bf0 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72  meral b-tree for
12c00 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74   membership.** t
12c10 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78  esting is too ex
12c20 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75  pensive and retu
12c30 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  rn IN_INDEX_NOOP
12c40 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
12c50 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   the.** calling 
12c60 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69  routine should i
12c70 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20  mplement the IN 
12c80 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61  operator using a
12c90 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20   sequence.** of 
12ca0 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69  Eq or Ne compari
12cb0 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  son operations..
12cc0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62  **.** When the b
12cd0 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75  -tree is being u
12ce0 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  sed for membersh
12cf0 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61  ip tests, the ca
12d00 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
12d10 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  * might need to 
12d20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
12d30 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65  not the RHS side
12d40 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
12d50 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  tor.** contains 
12d60 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68  a NULL.  If prRh
12d70 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20  sHasNull is not 
12d80 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61  a NULL pointer a
12d90 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  nd .** if there 
12da0 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68  is any chance th
12db0 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67  at the (...) mig
12dc0 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c  ht contain a NUL
12dd0 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75  L value at.** ru
12de0 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65  ntime, then a re
12df0 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61  gister is alloca
12e00 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69  ted and the regi
12e10 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74  ster number writ
12e20 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73  ten.** to *prRhs
12e30 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72  HasNull. If ther
12e40 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
12e50 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f  hat the (...) co
12e60 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c  ntains a.** NULL
12e70 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72   value, then *pr
12e80 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65  RhsHasNull is le
12e90 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
12ea0 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
12eb0 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
12ec0 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20  nd its location 
12ed0 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73  stored in *prRhs
12ee0 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a  HasNull, then.**
12ef0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
12f00 61 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c  at register will
12f10 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   be NULL if the 
12f20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20  b-tree contains 
12f30 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e  one or more.** N
12f40 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20  ULL values, and 
12f50 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20  it will be some 
12f60 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
12f70 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
12f80 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c  tains no.** NULL
12f90 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   values..**.** I
12fa0 66 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61  f the aiMap para
12fb0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  meter is not NUL
12fc0 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74  L, it must point
12fd0 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e   to an array con
12fe0 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65  taining.** one e
12ff0 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20  lement for each 
13000 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20  column returned 
13010 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  by the SELECT st
13020 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52  atement on the R
13030 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28  HS.** of the IN(
13040 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54  ...) operator. T
13050 68 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66  he i'th entry of
13060 20 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f   the array is po
13070 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
13080 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68  .** offset of th
13090 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74  e index column t
130a0 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
130b0 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75  i'th column retu
130c0 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53  rned by the.** S
130d0 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70  ELECT. For examp
130e0 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  le, if the expre
130f0 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  ssion and select
13100 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a  ed index are:.**
13110 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e  .**   (?,?,?) IN
13120 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63   (SELECT a, b, c
13130 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43   FROM t1).**   C
13140 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
13150 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a  N t1(b, c, a);.*
13160 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b  *.** then aiMap[
13170 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  ] is populated w
13180 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a  ith {2, 0, 1}..*
13190 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
131a0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
131b0 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
131c0 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
131d0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
131e0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
131f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
13200 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20   *pX,           
13210 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
13220 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52  ght-hand side (R
13230 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  HS) of the IN op
13240 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20  erator */.  u32 
13250 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  inFlags,        
13260 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44         /* IN_IND
13270 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52  EX_LOOP, _MEMBER
13280 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f  SHIP, and/or _NO
13290 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a  OP_OK */.  int *
132a0 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20  prRhsHasNull,   
132b0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
132c0 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73  r holding NULL s
132d0 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65  tatus.  See note
132e0 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61  s */.  int *aiMa
132f0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
13300 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
13310 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74  m Index fields t
13320 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a  o RHS fields */.
13330 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20  ){.  Select *p; 
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
13360 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68  LECT to the righ
13370 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  t of IN operator
13380 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
13390 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
133a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
133b0 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65  ype of RHS table
133c0 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a  . IN_INDEX_* */.
133d0 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
133e0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
133f0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
13400 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62  r of the RHS tab
13410 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
13420 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20  BeUnique;       
13430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13440 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73   True if RHS mus
13450 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  t be unique */. 
13460 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
13470 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
13480 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  );     /* Virtua
13490 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
134a0 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  coded */..  asse
134b0 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
134c0 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69  N );.  mustBeUni
134d0 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26  que = (inFlags &
134e0 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21   IN_INDEX_LOOP)!
134f0 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  =0;..  /* If the
13500 20 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28   RHS of this IN(
13510 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73  ...) operator is
13520 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69   a SELECT, and i
13530 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20  f it matters .  
13540 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
13550 74 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73  t the SELECT res
13560 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  ult contains NUL
13570 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20  L values, check 
13580 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20  whether.  ** or 
13590 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75  not NULL is actu
135a0 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69  ally possible (i
135b0 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f  t may not be, fo
135c0 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a  r example, due .
135d0 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c    ** to NOT NULL
135e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
135f0 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20  the schema). If 
13600 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  no NULL values a
13610 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a  re possible,.  *
13620 2a 20 73 65 74 20 70 72 52 68 73 48 61 73 4e 75  * set prRhsHasNu
13630 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63  ll to 0 before c
13640 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20  ontinuing.  */. 
13650 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
13660 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20  l && (pX->flags 
13670 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
13680 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
13690 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
136a0 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65  st = pX->x.pSele
136b0 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
136c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
136d0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
136e0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
136f0 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
13700 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
13710 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  r) ) break;.    
13720 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c  }.    if( i==pEL
13730 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
13740 20 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c      prRhsHasNull
13750 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
13760 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
13770 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ee if an existin
13780 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
13790 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a   can be used to.
137a0 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65    ** satisfy the
137b0 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73   query.  This is
137c0 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67   preferable to g
137d0 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20  enerating a new 
137e0 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20  .  ** ephemeral 
137f0 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
13800 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
13810 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69   && (p = isCandi
13820 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29  dateForInOpt(pX)
13830 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
13840 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
13850 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
13860 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
13870 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
13880 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138a0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
138b0 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
138c0 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20   i16 iDb;       
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138e0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
138f0 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62  ase idx for pTab
13900 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
13910 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45   *pEList = p->pE
13920 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45  List;.    int nE
13930 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
13940 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  xpr;..    assert
13950 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
13960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13970 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
13980 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
13990 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
139a0 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ( p->pEList->a[0
139b0 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a  ].pExpr!=0 ); /*
139c0 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
139d0 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
139e0 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
139f0 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20  ( p->pSrc!=0 ); 
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a10 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
13a20 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
13a30 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d  p) */.    pTab =
13a40 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
13a50 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64  Tab;..    /* Cod
13a60 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74  e an OP_Transact
13a70 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65  ion and OP_Table
13a80 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e  Lock for <table>
13a90 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  . */.    iDb = s
13aa0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
13ab0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
13ac0 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69  chema);.    sqli
13ad0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
13ae0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
13af0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62  ;.    sqlite3Tab
13b00 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
13b10 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
13b20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
13b30 0a 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b  ..    assert(v);
13b40 20 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74 56    /* sqlite3GetV
13b50 64 62 65 28 29 20 68 61 73 20 61 6c 77 61 79 73  dbe() has always
13b60 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
13b70 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 69   called */.    i
13b80 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  f( nExpr==1 && p
13b90 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
13ba0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
13bb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 20        /* The "x 
13bc0 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69 64  IN (SELECT rowid
13bd0 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 20 63 61   FROM table)" ca
13be0 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
13bf0 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  iAddr = sqlite3V
13c00 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
13c10 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 56 64 62  Once);.      Vdb
13c20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
13c30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
13c40 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
13c50 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
13c60 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
13c70 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
13c80 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20  DEX_ROWID;..    
13c90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
13ca0 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
13cb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13cc0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ce0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
13cf0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
13d00 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74       int affinit
13d10 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  y_ok = 1;.      
13d20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a  int i;..      /*
13d30 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
13d40 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69  affinity that wi
13d50 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65  ll be used to pe
13d60 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20 20  rform each .    
13d70 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
13d80 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
13d90 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 65  he affinity of e
13da0 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  ach column in ta
13db0 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ble.      ** on 
13dc0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
13dd0 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  N operator.  If 
13de0 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f  it not, it is no
13df0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20 20  t possible to.  
13e00 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20 69      ** use any i
13e10 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48 53 20  ndex of the RHS 
13e20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20  table.  */.     
13e30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
13e40 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b  r && affinity_ok
13e50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13e60 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c  Expr *pLhs = sql
13e70 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
13e80 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74  ubexpr(pX->pLeft
13e90 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  , i);.        in
13ea0 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  t iCol = pEList-
13eb0 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[i].pExpr->iCo
13ec0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63 68  lumn;.        ch
13ed0 61 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c 69  ar idxaff = sqli
13ee0 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66  te3TableColumnAf
13ef0 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f 6c  finity(pTab,iCol
13f00 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65 20  ); /* RHS table 
13f10 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
13f20 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65 33  cmpaff = sqlite3
13f30 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
13f40 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a 20  pLhs, idxaff);. 
13f50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
13f60 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f   cmpaff==SQLITE_
13f70 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  AFF_BLOB );.    
13f80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d      testcase( cm
13f90 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  paff==SQLITE_AFF
13fa0 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20  _TEXT );.       
13fb0 20 73 77 69 74 63 68 28 20 63 6d 70 61 66 66 20   switch( cmpaff 
13fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ){.          cas
13fd0 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  e SQLITE_AFF_BLO
13fe0 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  B:.            b
13ff0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14000 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
14010 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20  TEXT:.          
14020 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d 70    /* sqlite3Comp
14030 61 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f 6e  areAffinity() on
14040 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58 54 20  ly returns TEXT 
14050 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  if one side or t
14060 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
14070 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20 61  * other has no a
14080 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65 20  ffinity and the 
14090 6f 74 68 65 72 20 73 69 64 65 20 69 73 20 54 45  other side is TE
140a0 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20 20  XT.  Hence,.    
140b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f          ** the o
140c0 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70 61  nly way for cmpa
140d0 66 66 20 74 6f 20 62 65 20 54 45 58 54 20 69 73  ff to be TEXT is
140e0 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20 62   for idxaff to b
140f0 65 20 54 45 58 54 0a 20 20 20 20 20 20 20 20 20  e TEXT.         
14100 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74 68     ** and for th
14110 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c 48  e term on the LH
14120 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20 68  S of the IN to h
14130 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e  ave no affinity.
14140 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
14150 61 73 73 65 72 74 28 20 69 64 78 61 66 66 3d 3d  assert( idxaff==
14160 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
14170 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
14180 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14190 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
141a0 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b       affinity_ok
141b0 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65   = sqlite3IsNume
141c0 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 61  ricAffinity(idxa
141d0 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ff);.        }. 
141e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
141f0 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 7b  ( affinity_ok ){
14200 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72  .        /* Sear
14210 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
14220 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 69  ng index that wi
14230 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69 73  ll work for this
14240 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
14250 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
14260 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
14270 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 3b  Idx && eType==0;
14280 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
14290 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42 69  t){.          Bi
142a0 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20 20  tmask colUsed;  
142b0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f      /* Columns o
142c0 66 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64  f the index used
142d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42 69   */.          Bi
142e0 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20 20  tmask mCol;     
142f0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20      /* Mask for 
14300 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
14310 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  mn */.          
14320 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  if( pIdx->nColum
14330 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69 6e  n<nExpr ) contin
14340 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ue;.          /*
14350 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e   Maximum nColumn
14360 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42   is BMS-2, not B
14370 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20 77 65  MS-1, so that we
14380 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20   can compute.   
14390 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d 41 53         ** BITMAS
143a0 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f 75 74  K(nExpr) without
143b0 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a   overflowing */.
143c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
143d0 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  se( pIdx->nColum
143e0 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  n==BMS-2 );.    
143f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14400 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42  pIdx->nColumn==B
14410 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  MS-1 );.        
14420 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
14430 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e  umn>=BMS-1 ) con
14440 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
14450 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75   if( mustBeUniqu
14460 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
14470 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43   if( pIdx->nKeyC
14480 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20  ol>nExpr.       
14490 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e        ||(pIdx->n
144a0 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20  Column>nExpr && 
144b0 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
144c0 49 64 78 29 29 0a 20 20 20 20 20 20 20 20 20 20  Idx)).          
144d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
144e0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
144f0 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e   This index is n
14500 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72 20 74  ot unique over t
14510 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e  he IN RHS column
14520 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
14530 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
14540 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55   .          colU
14550 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  sed = 0;   /* Co
14560 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 20 75  lumns of index u
14570 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  sed so far */.  
14580 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
14590 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
145a0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
145b0 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33   *pLhs = sqlite3
145c0 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
145d0 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29  pr(pX->pLeft, i)
145e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  ;.            Ex
145f0 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73  pr *pRhs = pELis
14600 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
14610 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53             CollS
14620 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74  eq *pReq = sqlit
14630 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
14640 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
14650 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20  Lhs, pRhs);.    
14660 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
14670 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73   .            as
14680 73 65 72 74 28 20 70 52 65 71 21 3d 30 20 7c 7c  sert( pReq!=0 ||
14690 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   pRhs->iColumn==
146a0 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 61 72  XN_ROWID || pPar
146b0 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20  se->nErr );.    
146c0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
146d0 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a   j<nExpr; j++){.
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
146f0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
14700 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75  [j]!=pRhs->iColu
14710 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
14730 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ert( pIdx->azCol
14740 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  l[j] );.        
14750 20 20 20 20 20 20 69 66 28 20 70 52 65 71 21 3d        if( pReq!=
14760 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
14770 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c  Cmp(pReq->zName,
14780 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
14790 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
147a0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
147b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
147c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
147d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
147e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
147f0 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20   if( j==nExpr ) 
14800 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
14810 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49     mCol = MASKBI
14820 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  T(j);.          
14830 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c    if( mCol & col
14840 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a  Used ) break; /*
14850 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65   Each column use
14860 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20  d only once */. 
14870 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73             colUs
14880 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20  ed |= mCol;.    
14890 20 20 20 20 20 20 20 20 69 66 28 20 61 69 4d 61          if( aiMa
148a0 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a  p ) aiMap[i] = j
148b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
148c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
148d0 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63  t( i==nExpr || c
148e0 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42 49 54  olUsed!=(MASKBIT
148f0 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a 20 20  (nExpr)-1) );.  
14900 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 55          if( colU
14910 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45  sed==(MASKBIT(nE
14920 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20 20 20  xpr)-1) ){.     
14930 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
14940 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
14950 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
14960 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20 75   index pIdx is u
14970 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  sable */.       
14980 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
14990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
149a0 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
149b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
149c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
149d0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
149e0 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20  Parse, 0,.      
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 20 20 20 20 20 20 20 20 22 55 53 49 4e 47 20 49          "USING I
14a10 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f  NDEX %s FOR IN-O
14a20 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a  PERATOR",pIdx->z
14a30 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
14a40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14a50 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
14a60 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78  Read, iTab, pIdx
14a70 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
14a80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14a90 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
14aa0 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
14ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
14ac0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
14ad0 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
14ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
14af0 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49  sert( IN_INDEX_I
14b00 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f  NDEX_DESC == IN_
14b10 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b  INDEX_INDEX_ASC+
14b20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
14b30 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
14b40 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49  X_INDEX_ASC + pI
14b50 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  dx->aSortOrder[0
14b60 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  ];.  .          
14b70 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75    if( prRhsHasNu
14b80 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ll ){.#ifdef SQL
14b90 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
14ba0 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20  N_USED_MASK.    
14bb0 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61            i64 ma
14bc0 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d  sk = (1<<nExpr)-
14bd0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
14be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14bf0 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
14c00 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20  umnsUsed, .     
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
14c20 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d  b, 0, 0, (u8*)&m
14c30 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  ask, P4_INT64);.
14c40 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
14c50 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75       *prRhsHasNu
14c60 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
14c70 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
14c80 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20     if( nExpr==1 
14c90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
14ca0 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73     sqlite3SetHas
14cb0 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62  NullFlag(v, iTab
14cc0 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29  , *prRhsHasNull)
14cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14ce0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14d00 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14d10 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  v, iAddr);.     
14d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
14d30 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* End loop ove
14d40 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20  r indexes */.   
14d50 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20     } /* End if( 
14d60 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f  affinity_ok ) */
14d70 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66  .    } /* End if
14d80 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e   not an rowid in
14d90 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e  dex */.  } /* En
14da0 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74  d attempt to opt
14db0 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69  imize using an i
14dc0 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  ndex */..  /* If
14dd0 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20   no preexisting 
14de0 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62  index is availab
14df0 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c  le for the IN cl
14e00 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  ause.  ** and IN
14e10 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61  _INDEX_NOOP is a
14e20 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a  n allowed reply.
14e30 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53    ** and the RHS
14e40 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
14e50 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e  tor is a list, n
14e60 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20  ot a subquery.  
14e70 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69  ** and the RHS i
14e80 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f  s not constant o
14e90 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77  r has two or few
14ea0 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74  er terms,.  ** t
14eb0 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f  hen it is not wo
14ec0 72 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20  rth creating an 
14ed0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
14ee0 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a  to evaluate.  **
14ef0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
14f00 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e   so return IN_IN
14f10 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20  DEX_NOOP..  */. 
14f20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20   if( eType==0.  
14f30 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49   && (inFlags & I
14f40 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29  N_INDEX_NOOP_OK)
14f50 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50  .   && !ExprHasP
14f60 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
14f70 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20  IsSelect).   && 
14f80 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  (!sqlite3InRhsIs
14f90 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20  Constant(pX) || 
14fa0 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pX->x.pList->nEx
14fb0 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20  pr<=2).  ){.    
14fc0 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
14fd0 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
14fe0 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
14ff0 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66    /* Could not f
15000 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ind an existing 
15010 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
15020 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53  o use as the RHS
15030 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20   b-tree..    ** 
15040 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  We will have to 
15050 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65  generate an ephe
15060 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64  meral table to d
15070 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a  o the job..    *
15080 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e  /.    u32 savedN
15090 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
150a0 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
150b0 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65      int rMayHave
150c0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54  Null = 0;.    eT
150d0 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45  ype = IN_INDEX_E
150e0 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c  PH;.    if( inFl
150f0 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c  ags & IN_INDEX_L
15100 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OOP ){.      pPa
15110 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
15120 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
15130 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  X->pLeft->iColum
15140 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50  n<0 && !ExprHasP
15150 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
15160 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
15170 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
15180 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20  INDEX_ROWID;.   
15190 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
151a0 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
151b0 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48  ){.      *prRhsH
151c0 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76  asNull = rMayHav
151d0 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  eNull = ++pParse
151e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  ->nMem;.    }.  
151f0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
15200 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
15210 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  X, rMayHaveNull,
15220 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
15230 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61  _ROWID);.    pPa
15240 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
15250 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  = savedNQueryLoo
15260 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  p;.  }else{.    
15270 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pX->iTable = iTa
15280 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69  b;.  }..  if( ai
15290 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e  Map && eType!=IN
152a0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
152b0 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e   && eType!=IN_IN
152c0 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29  DEX_INDEX_DESC )
152d0 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  {.    int i, n;.
152e0 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45      n = sqlite3E
152f0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58  xprVectorSize(pX
15300 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f  ->pLeft);.    fo
15310 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
15320 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20   aiMap[i] = i;. 
15330 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70   }.  return eTyp
15340 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  e;.}.#endif..#if
15350 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15360 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
15370 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69  Argument pExpr i
15380 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49  s an (?, ?...) I
15390 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  N(...) expressio
153a0 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  n. This .** func
153b0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
153c0 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  nd returns a nul
153d0 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
153e0 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a  ng containing .*
153f0 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73  * the affinities
15400 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
15410 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  each column of t
15420 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a  he comparison..*
15430 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  *.** It is the r
15440 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
15450 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
15460 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72  nsure that the r
15470 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e  eturned.** strin
15480 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20  g is eventually 
15490 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69  freed using sqli
154a0 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a  te3DbFree()..*/.
154b0 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70  static char *exp
154c0 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73  rINAffinity(Pars
154d0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
154e0 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20  *pExpr){.  Expr 
154f0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
15500 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61  pLeft;.  int nVa
15510 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  l = sqlite3ExprV
15520 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29  ectorSize(pLeft)
15530 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  ;.  Select *pSel
15540 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c  ect = (pExpr->fl
15550 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
15560 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ct) ? pExpr->x.p
15570 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68  Select : 0;.  ch
15580 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73  ar *zRet;..  ass
15590 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
155a0 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20  TK_IN );.  zRet 
155b0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
155c0 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c  cRaw(pParse->db,
155d0 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20   nVal+1);.  if( 
155e0 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  zRet ){.    int 
155f0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
15600 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVal; i++){.  
15610 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73      Expr *pA = s
15620 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
15630 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
15640 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61  i);.      char a
15650 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
15660 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20  finity(pA);.    
15670 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
15680 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d  .        zRet[i]
15690 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
156a0 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63  eAffinity(pSelec
156b0 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
156c0 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20  pExpr, a);.     
156d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
156e0 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20  zRet[i] = a;.   
156f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
15700 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27  Ret[nVal] = '\0'
15710 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
15720 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Ret;.}.#endif..#
15730 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15740 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
15750 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65  * Load the Parse
15760 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
15770 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
15780 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72  ment with an err
15790 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f  or .** message o
157a0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
157b0 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20  *   "sub-select 
157c0 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e  returns N column
157d0 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a  s - expected M".
157e0 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74  */   .void sqlit
157f0 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
15800 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15810 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74  int nActual, int
15820 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e   nExpect){.  con
15830 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20  st char *zFmt = 
15840 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
15850 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d  rns %d columns -
15860 20 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20   expected %d";. 
15870 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15880 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e  (pParse, zFmt, n
15890 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29  Actual, nExpect)
158a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
158b0 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * Expression pEx
158c0 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 20 74  pr is a vector t
158d0 68 61 74 20 68 61 73 20 62 65 65 6e 20 75 73 65  hat has been use
158e0 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77  d in a context w
158f0 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  here.** it is no
15900 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20  t permitted. If 
15910 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73  pExpr is a sub-s
15920 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68  elect vector, th
15930 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c  is routine .** l
15940 6f 61 64 73 20 74 68 65 20 50 61 72 73 65 20 6f  oads the Parse o
15950 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65 73  bject with a mes
15960 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  sage of the form
15970 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73  :.**.**   "sub-s
15980 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20  elect returns N 
15990 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
159a0 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ed 1".**.** Or, 
159b0 69 66 20 69 74 20 69 73 20 61 20 72 65 67 75 6c  if it is a regul
159c0 61 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72  ar scalar vector
159d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76  :.**.**   "row v
159e0 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f  alue misused".*/
159f0 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33     .void sqlite3
15a00 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50  VectorErrorMsg(P
15a10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
15a20 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e  pr *pExpr){.#ifn
15a30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15a40 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70  SUBQUERY.  if( p
15a50 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
15a60 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20  _xIsSelect ){.  
15a70 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
15a80 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
15a90 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
15aa0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
15ab0 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e   1);.  }else.#en
15ac0 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
15ad0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15ae0 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
15af0 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a  isused");.  }.}.
15b00 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15b10 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
15b20 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
15b30 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78  as a subquery ex
15b40 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53  pression, EXISTS
15b50 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61  ,.** or IN opera
15b60 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a  tors.  Examples:
15b70 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45  .**.**     (SELE
15b80 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
15b90 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72        -- subquer
15ba0 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20  y.**     EXISTS 
15bb0 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
15bc0 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75  )   -- EXISTS su
15bd0 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20  bquery.**     x 
15be0 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
15bf0 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
15c00 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
15c10 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
15c20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
15c30 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
15c40 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
15c50 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
15c60 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
15c70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
15c80 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72   parameter descr
15c90 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ibes the express
15ca0 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
15cb0 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72  s the IN.** oper
15cc0 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79  ator or subquery
15cd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
15ce0 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20  eter isRowid is 
15cf0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65  non-zero, then e
15d00 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
15d10 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
15d20 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f   to be of the fo
15d30 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28  rm "<rowid> IN (
15d40 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65  ?, ?, ?)", where
15d50 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65   <rowid> is a re
15d60 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f  ference.** to so
15d70 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63  me integer key c
15d80 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
15d90 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73   B-Tree. In this
15da0 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a   case, use an.**
15db0 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74   intkey B-Tree t
15dc0 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
15dd0 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65  of IN(...) value
15de0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  s instead of the
15df0 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65   usual.** (slowe
15e00 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  r) variable leng
15e10 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a  th keys B-Tree..
15e20 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76  **.** If rMayHav
15e30 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72  eNull is non-zer
15e40 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
15e50 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  at the operation
15e60 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f   is an IN.** (no
15e70 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  t a SELECT or EX
15e80 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74  ISTS) and that t
15e90 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e  he RHS might con
15ea0 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20  tains NULLs..** 
15eb0 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
15ec0 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c   does is initial
15ed0 69 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72  ize the register
15ee0 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61   given by rMayHa
15ef0 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c  veNull.** to NUL
15f00 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74  L.  Calling rout
15f10 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63  ines will take c
15f20 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20  are of changing 
15f30 74 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a  this register.**
15f40 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55   value to non-NU
15f50 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73  LL if the RHS is
15f60 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a   NULL-free..**.*
15f70 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f  * For a SELECT o
15f80 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
15f90 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  r, return the re
15fa0 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
15fb0 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e  s the.** result.
15fc0 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f    For a multi-co
15fd0 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65  lumn SELECT, the
15fe0 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
15ff0 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75  d in a contiguou
16000 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65  s.** array of re
16010 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
16020 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
16030 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
16040 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
16050 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20   result column. 
16060 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e   Return 0 for IN
16070 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66   operators or if
16080 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
16090 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
160a0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
160b0 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  Y.int sqlite3Cod
160c0 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61  eSubselect(.  Pa
160d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
160e0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
160f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
16100 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
16110 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c        /* The IN,
16120 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53   SELECT, or EXIS
16130 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  TS operator */. 
16140 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61   int rHasNullFla
16150 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  g,       /* Regi
16160 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64  ster that record
16170 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20  s whether NULLs 
16180 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a  exist in RHS */.
16190 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20    int isRowid   
161a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
161b0 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20  true, LHS of IN 
161c0 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f  operator is a ro
161d0 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  wid */.){.  int 
161e0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
161f0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
16200 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
16210 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
16220 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d   */.  int rReg =
16230 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16250 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e   Register storin
16260 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20  g resulting */. 
16270 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
16280 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
16290 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
162a0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
162b0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
162c0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
162d0 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75  ..  /* The evalu
162e0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f  ation of the IN/
162f0 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75  EXISTS/SELECT mu
16300 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65  st be repeated e
16310 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a  very time it.  *
16320 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
16330 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
16340 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
16350 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
16360 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
16370 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
16380 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
16390 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
163a0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
163b0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
163c0 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
163d0 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
163e0 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
163f0 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
16400 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
16410 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
16420 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
16430 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
16440 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
16450 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
16460 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
16470 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
16480 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
16490 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
164a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
164b0 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
164c0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70  lect) ){.    jmp
164d0 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69  IfDynamic = sqli
164e0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
164f0 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
16500 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
16510 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
16520 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
16530 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
16540 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
16550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16560 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65  ddress of OP_Ope
16570 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
16580 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uction */.      
16590 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
165a0 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74  xpr->pLeft; /* t
165b0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
165c0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
165d0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
165e0 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f  Info = 0;      /
165f0 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f  * Key informatio
16600 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  n */.      int n
16610 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Val;            
16620 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
16630 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a  f vector pLeft *
16640 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e  /.      .      n
16650 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Val = sqlite3Exp
16660 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66  rVectorSize(pLef
16670 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
16680 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56  ( !isRowid || nV
16690 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20  al==1 );..      
166a0 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20  /* Whether this 
166b0 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45  is an 'x IN(SELE
166c0 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78  CT...)' or an 'x
166d0 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27   IN(<exprlist>)'
166e0 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
166f0 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c  sion it is handl
16700 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e  ed the same way.
16710 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74    An ephemeral t
16720 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a  able is .      *
16730 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e  * filled with in
16740 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
16750 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
16760 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
16770 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74    ** SELECT or t
16780 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20  he <exprlist>.. 
16790 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
167a0 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72   If the 'x' expr
167b0 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
167c0 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65  mn value, or the
167d0 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20   SELECT....     
167e0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
167f0 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76  turns a column v
16800 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61  alue, then the a
16810 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a  ffinity of that.
16820 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20        ** column 
16830 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
16840 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e   the index keys.
16850 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64   If both 'x' and
16860 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45   the.      ** SE
16870 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
16880 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
16890 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
168a0 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20  nity is used.   
168b0 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20     ** if either 
168c0 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52  column has NUMER
168d0 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66  IC or INTEGER af
168e0 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68  finity. If neith
168f0 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20  er.      ** 'x' 
16900 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  nor the SELECT..
16910 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
16920 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
16930 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20  meric affinity. 
16940 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e       ** is used.
16950 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16960 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
16970 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
16980 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
16990 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
169a0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
169b0 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  al, .          p
169c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69  Expr->iTable, (i
169d0 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b  sRowid?0:nVal));
169e0 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
169f0 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20  = isRowid ? 0 : 
16a00 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
16a10 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
16a20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20  nVal, 1);..     
16a30 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16a40 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
16a50 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
16a60 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20       /* Case 1: 
16a70 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
16a80 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20  ECT ...).       
16a90 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47   **.        ** G
16aa0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
16ab0 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  write the result
16ac0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  s of the select 
16ad0 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  into the tempora
16ae0 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ry.        ** ta
16af0 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  ble allocated an
16b00 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a  d opened above..
16b10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16b20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65     Select *pSele
16b30 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  ct = pExpr->x.pS
16b40 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 45  elect;.        E
16b50 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
16b60 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
16b70 74 3b 0a 0a 20 20 20 20 20 20 20 20 45 78 70 6c  t;..        Expl
16b80 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
16b90 61 72 73 65 2c 20 31 2c 20 22 25 73 4c 49 53 54  arse, 1, "%sLIST
16ba0 20 53 55 42 51 55 45 52 59 22 2c 0a 20 20 20 20   SUBQUERY",.    
16bb0 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e          jmpIfDyn
16bc0 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52  amic>=0?"":"CORR
16bd0 45 4c 41 54 45 44 20 22 0a 20 20 20 20 20 20 20  ELATED ".       
16be0 20 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ));.        ass
16bf0 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b  ert( !isRowid );
16c00 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
16c10 68 65 20 4c 48 53 20 61 6e 64 20 52 48 53 20 6f  he LHS and RHS o
16c20 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
16c30 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20  r do not match, 
16c40 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
16c50 65 72 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20  error will have 
16c60 62 65 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67  been caught long
16c70 20 62 65 66 6f 72 65 20 77 65 20 72 65 61 63 68   before we reach
16c80 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a   this point. */.
16c90 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41          if( ALWA
16ca0 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  YS(pEList->nExpr
16cb0 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  ==nVal) ){.     
16cc0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
16cd0 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dest;.          
16ce0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
16cf0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
16d00 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
16d10 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
16d20 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  able);.         
16d30 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d   dest.zAffSdst =
16d40 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28   exprINAffinity(
16d50 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
16d60 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 65 63            pSelec
16d70 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  t->iLimit = 0;. 
16d80 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
16d90 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  e( pSelect->selF
16da0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
16db0 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ct );.          
16dc0 74 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e  testcase( pKeyIn
16dd0 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73  fo==0 ); /* Caus
16de0 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c  ed by OOM in sql
16df0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
16e00 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  () */.          
16e10 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
16e20 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
16e30 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  t, &dest) ){.   
16e40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16e50 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
16e60 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74  b, dest.zAffSdst
16e70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
16e80 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
16e90 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ef(pKeyInfo);.  
16ea0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16eb0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
16ec0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16ed0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
16ee0 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73  db, dest.zAffSds
16ef0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
16f00 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d  sert( pKeyInfo!=
16f10 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c  0 ); /* OOM will
16f20 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74 65   cause exit afte
16f30 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  r sqlite3Select(
16f40 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  ) */.          a
16f50 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
16f60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
16f70 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45  sert( pEList->nE
16f80 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  xpr>0 );.       
16f90 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
16fa0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
16fb0 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
16fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
16fd0 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  i=0; i<nVal; i++
16fe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
16ff0 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
17000 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
17010 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  pr(pLeft, i);.  
17020 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
17030 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  fo->aColl[i] = s
17040 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
17050 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20  areCollSeq(.    
17060 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
17070 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61  se, p, pEList->a
17080 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20  [i].pExpr.      
17090 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
170a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
170b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
170c0 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
170d0 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
170e0 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
170f0 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
17100 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a  list).        **
17110 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  .        ** For 
17120 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c  each expression,
17130 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20   build an index 
17140 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61  key from the eva
17150 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  luation and.    
17160 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
17170 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
17180 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72   table. If <expr
17190 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  > is a column, t
171a0 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20  hen use.        
171b0 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
171c0 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
171d0 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
171e0 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
171f0 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
17200 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d   column, use num
17210 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20  eric affinity.. 
17220 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17230 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
17240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
17250 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c  ffinity of the L
17260 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a  HS of the IN */.
17270 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
17280 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
17290 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
172a0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  x.pList;.       
172b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
172c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
172d0 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
172e0 2c 20 72 33 3b 0a 20 20 20 20 20 20 20 20 61 66  , r3;.        af
172f0 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
17300 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
17310 66 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ft);.        if(
17320 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   !affinity ){.  
17330 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
17340 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
17350 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OB;.        }.  
17360 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
17370 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
17380 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
17390 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
173a0 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
173b0 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
173c0 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  o->aColl[0] = sq
173d0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
173e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
173f0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
17400 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  }..        /* Lo
17410 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
17420 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65  expression in <e
17430 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20  xprlist>. */.   
17440 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
17450 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
17460 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  se);.        r2 
17470 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
17480 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
17490 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
174a0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
174b0 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
174c0 20 30 2c 20 72 32 2c 20 30 2c 20 22 22 2c 20 50   0, r2, 0, "", P
174d0 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
174e0 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e     for(i=pList->
174f0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69  nExpr, pItem=pLi
17500 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  st->a; i>0; i--,
17510 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
17520 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
17530 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
17540 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61           int iVa
17550 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20  lToIns;..       
17560 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70     /* If the exp
17570 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63  ression is not c
17580 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20  onstant then we 
17590 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20  will need to.   
175a0 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c         ** disabl
175b0 65 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20  e the test that 
175c0 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62  was generated ab
175d0 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ove that makes s
175e0 75 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ure.          **
175f0 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20   this code only 
17600 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20  executes once.  
17610 42 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f  Because for a no
17620 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20  n-constant.     
17630 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
17640 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  on we need to re
17650 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61  run this code ea
17660 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  ch time..       
17670 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
17680 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  if( jmpIfDynamic
17690 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  >=0 && !sqlite3E
176a0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
176b0 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
176c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
176d0 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70  ngeToNoop(v, jmp
176e0 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20  IfDynamic);.    
176f0 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e          jmpIfDyn
17700 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20  amic = -1;.     
17710 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
17720 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
17730 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
17740 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
17750 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  the temp table *
17760 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
17770 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74  isRowid && sqlit
17780 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
17790 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29  pE2, &iValToIns)
177a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
177b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
177c0 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e  3(v, OP_InsertIn
177d0 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
177e0 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29  , r2, iValToIns)
177f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
17800 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
17810 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  3 = sqlite3ExprC
17820 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
17830 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20  , pE2, r1);.    
17840 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
17850 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
17860 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17870 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
17880 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20  tBeInt, r3,.    
17890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
178b0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
178c0 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20  dr(v)+2);.      
178d0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
178e0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
178f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17900 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
17910 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
17920 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20  able, r2, r3);. 
17930 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
17940 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
17950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17960 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
17970 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26  rd, r3, 1, r2, &
17980 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
17990 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
179a0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
179b0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
179c0 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20  e, r3, 1);.     
179d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
179e0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
179f0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
17a00 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
17a10 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r3, 1);.      
17a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17a30 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
17a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
17a50 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
17a60 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
17a70 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17a80 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17a90 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
17aa0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
17ab0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17ac0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
17ad0 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70   addr, (void *)p
17ae0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
17af0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
17b00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17b10 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
17b20 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
17b30 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65  K_SELECT:.    de
17b40 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
17b50 2a 20 43 61 73 65 20 33 3a 20 20 20 20 28 53 45  * Case 3:    (SE
17b60 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e  LECT ... FROM ..
17b70 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .).      **     
17b80 6f 72 3a 20 20 20 20 45 58 49 53 54 53 28 53 45  or:    EXISTS(SE
17b90 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e  LECT ... FROM ..
17ba0 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .).      **.    
17bb0 20 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43    ** For a SELEC
17bc0 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  T, generate code
17bd0 20 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75   to put the valu
17be0 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d  es for all colum
17bf0 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ns of.      ** t
17c00 68 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74  he first row int
17c10 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  o an array of re
17c20 67 69 73 74 65 72 73 20 61 6e 64 20 72 65 74 75  gisters and retu
17c30 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
17c40 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72        ** the fir
17c50 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20  st register..   
17c60 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
17c70 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49  f this is an EXI
17c80 53 54 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e  STS, write an in
17c90 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69  teger 0 (not exi
17ca0 73 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74  sts) or 1 (exist
17cb0 73 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  s).      ** into
17cc0 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20   a register and 
17cd0 72 65 74 75 72 6e 20 74 68 61 74 20 72 65 67 69  return that regi
17ce0 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20  ster number..   
17cf0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
17d00 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68  n both cases, th
17d10 65 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65  e query is augme
17d20 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54  nted with "LIMIT
17d30 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20   1".  Any .     
17d40 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20   ** preexisting 
17d50 6c 69 6d 69 74 20 69 73 20 64 69 73 63 61 72 64  limit is discard
17d60 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ed in place of t
17d70 68 65 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a  he new LIMIT 1..
17d80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53        */.      S
17d90 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
17da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17db0 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
17dc0 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f  tatement to enco
17dd0 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  de */.      Sele
17de0 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e00 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c    /* How to deal
17e10 20 77 69 74 68 20 53 45 4c 45 43 54 20 72 65 73   with SELECT res
17e20 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ult */.      int
17e30 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e50 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
17e60 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
17e70 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
17e80 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
17e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
17ea0 77 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69  w limit expressi
17eb0 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73  on */..      tes
17ec0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
17ed0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
17ee0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
17ef0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
17f00 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ECT );.      ass
17f10 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
17f20 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78  TK_EXISTS || pEx
17f30 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
17f40 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
17f50 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
17f60 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
17f70 53 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20 20  Select) );..    
17f80 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e    pSel = pExpr->
17f90 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
17fa0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
17fb0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25  n((pParse, 1, "%
17fc0 73 53 43 41 4c 41 52 20 53 55 42 51 55 45 52 59  sSCALAR SUBQUERY
17fd0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  ",.            j
17fe0 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22  mpIfDynamic>=0?"
17ff0 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 29  ":"CORRELATED ")
18000 29 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20  );.      nReg = 
18010 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
18020 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c  LECT ? pSel->pEL
18030 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a  ist->nExpr : 1;.
18040 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
18050 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
18060 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d  t, 0, pParse->nM
18070 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61  em+1);.      pPa
18080 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
18090 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  g;.      if( pEx
180a0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
180b0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73  T ){.        des
180c0 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65  t.eDest = SRT_Me
180d0 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  m;.        dest.
180e0 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44  iSdst = dest.iSD
180f0 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65  Parm;.        de
18100 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b  st.nSdst = nReg;
18110 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18120 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18130 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
18140 53 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44  SDParm, dest.iSD
18150 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20  Parm+nReg-1);.  
18160 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
18170 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71  t((v, "Init subq
18180 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
18190 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
181a0 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
181b0 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20  = SRT_Exists;.  
181c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
181d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
181e0 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69  teger, 0, dest.i
181f0 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  SDParm);.       
18200 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18210 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65   "Init EXISTS re
18220 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
18230 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
18240 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
18250 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
18260 49 4e 54 45 47 45 52 2c 26 73 71 6c 69 74 65 33  INTEGER,&sqlite3
18270 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29  IntTokens[1], 0)
18280 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  ;.      if( pSel
18290 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
182a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
182b0 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
182c0 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e  , pSel->pLimit->
182d0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
182e0 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c  pSel->pLimit->pL
182f0 65 66 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  eft = pLimit;.  
18300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18310 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
18320 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
18330 50 61 72 73 65 2c 20 54 4b 5f 4c 49 4d 49 54 2c  Parse, TK_LIMIT,
18340 20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20   pLimit, 0);.   
18350 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65 6c 2d     }.      pSel-
18360 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
18370 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
18380 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
18390 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  l, &dest) ){.   
183a0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
183b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65       }.      rRe
183c0 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  g = dest.iSDParm
183d0 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 56  ;.      ExprSetV
183e0 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
183f0 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
18400 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18410 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 48   }.  }..  if( rH
18420 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20  asNullFlag ){.  
18430 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e    sqlite3SetHasN
18440 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70 72  ullFlag(v, pExpr
18450 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e 75  ->iTable, rHasNu
18460 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20  llFlag);.  }..  
18470 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  if( jmpIfDynamic
18480 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
18490 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
184a0 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b  , jmpIfDynamic);
184b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
184c0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
184d0 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52  e);..  return rR
184e0 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  eg;.}.#endif /* 
184f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
18500 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
18510 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
18520 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72  QUERY./*.** Expr
18530 20 70 49 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e   pIn is an IN(..
18540 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54  .) expression. T
18550 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
18560 63 6b 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  cks that the .**
18570 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74   sub-select on t
18580 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
18590 28 29 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20  () operator has 
185a0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
185b0 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61  of .** columns a
185c0 73 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20  s the vector on 
185d0 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20  the LHS. Or, if 
185e0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
185f0 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  N() is not .** a
18600 20 73 75 62 2d 71 75 65 72 79 2c 20 74 68 61 74   sub-query, that
18610 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 76 65   the LHS is a ve
18620 63 74 6f 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a  ctor of size 1..
18630 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
18640 70 72 43 68 65 63 6b 49 4e 28 50 61 72 73 65 20  prCheckIN(Parse 
18650 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
18660 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74  In){.  int nVect
18670 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  or = sqlite3Expr
18680 56 65 63 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e  VectorSize(pIn->
18690 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 28 70  pLeft);.  if( (p
186a0 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  In->flags & EP_x
186b0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
186c0 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 70 49   if( nVector!=pI
186d0 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  n->x.pSelect->pE
186e0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
186f0 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73       sqlite3Subs
18700 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
18710 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63  e, pIn->x.pSelec
18720 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
18730 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
18740 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
18750 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  }.  }else if( nV
18760 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20  ector!=1 ){.    
18770 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72  sqlite3VectorErr
18780 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 49  orMsg(pParse, pI
18790 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 72  n->pLeft);.    r
187a0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
187b0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
187c0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
187d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
187e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
187f0 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78  ode for an IN ex
18800 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
18810 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
18820 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78  T ...).**      x
18830 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
18840 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  e, ...).**.** Th
18850 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
18860 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c   (LHS) is a scal
18870 61 72 20 6f 72 20 76 65 63 74 6f 72 20 65 78 70  ar or vector exp
18880 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 0a 2a  ression.  The .*
18890 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
188a0 65 20 28 52 48 53 29 20 69 73 20 61 6e 20 61 72  e (RHS) is an ar
188b0 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  ray of zero or m
188c0 6f 72 65 20 73 63 61 6c 61 72 20 76 61 6c 75 65  ore scalar value
188d0 73 2c 20 6f 72 20 61 0a 2a 2a 20 73 75 62 71 75  s, or a.** subqu
188e0 65 72 79 2e 20 20 49 66 20 74 68 65 20 52 48 53  ery.  If the RHS
188f0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20   is a subquery, 
18900 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
18910 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 75 73  sult columns mus
18920 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e  t.** match the n
18930 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
18940 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 20 6f   in the vector o
18950 6e 20 74 68 65 20 4c 48 53 2e 20 20 49 66 20 74  n the LHS.  If t
18960 68 65 20 52 48 53 20 69 73 0a 2a 2a 20 61 20 6c  he RHS is.** a l
18970 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2c 20 74  ist of values, t
18980 68 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20 61  he LHS must be a
18990 20 73 63 61 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20   scalar. .**.** 
189a0 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  The IN operator 
189b0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 4c  is true if the L
189c0 48 53 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 74  HS value is cont
189d0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
189e0 20 52 48 53 2e 0a 2a 2a 20 54 68 65 20 72 65 73   RHS..** The res
189f0 75 6c 74 20 69 73 20 66 61 6c 73 65 20 69 66 20  ult is false if 
18a00 74 68 65 20 4c 48 53 20 69 73 20 64 65 66 69 6e  the LHS is defin
18a10 69 74 65 6c 79 20 6e 6f 74 20 69 6e 20 74 68 65  itely not in the
18a20 20 52 48 53 2e 20 20 54 68 65 20 0a 2a 2a 20 72   RHS.  The .** r
18a30 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 20 69 66  esult is NULL if
18a40 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
18a50 20 74 68 65 20 4c 48 53 20 69 6e 20 74 68 65 20   the LHS in the 
18a60 52 48 53 20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a  RHS cannot be .*
18a70 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 64 75 65  * determined due
18a80 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a   to NULLs..**.**
18a90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
18aa0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
18ab0 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74 49  t jumps to destI
18ac0 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48  fFalse if the LH
18ad0 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e  S is not .** con
18ae0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
18af0 65 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74  e RHS.  If due t
18b00 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f  o NULLs we canno
18b10 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  t determine if t
18b20 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e  he LHS.** is con
18b30 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
18b40 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64  S then jump to d
18b50 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74  estIfNull.  If t
18b60 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69  he LHS is contai
18b70 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
18b80 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20  e RHS then fall 
18b90 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53  through..**.** S
18ba0 65 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ee the separate 
18bb0 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 64  in-operator.md d
18bc0 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c  ocumentation fil
18bd0 65 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63  e in the canonic
18be0 61 6c 0a 2a 2a 20 53 51 4c 69 74 65 20 73 6f 75  al.** SQLite sou
18bf0 72 63 65 20 74 72 65 65 20 66 6f 72 20 61 64 64  rce tree for add
18c00 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
18c10 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
18c20 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
18c30 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a  odeIN(.  Parse *
18c40 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
18c50 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
18c60 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
18c70 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
18c80 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
18c90 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65   /* The IN expre
18ca0 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
18cb0 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20  estIfFalse,     
18cc0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
18cd0 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
18ce0 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
18cf0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
18d00 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a  Null        /* J
18d10 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
18d20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e  results are unkn
18d30 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  own due to NULLs
18d40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68   */.){.  int rRh
18d50 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f  sHasNull = 0;  /
18d60 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
18d70 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63  is true if RHS c
18d80 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
18d90 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  ues */.  int eTy
18da0 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
18db0 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48  * Type of the RH
18dc0 53 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73 3b  S */.  int rLhs;
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18de0 52 65 67 69 73 74 65 72 28 73 29 20 68 6f 6c 64  Register(s) hold
18df0 69 6e 67 20 74 68 65 20 4c 48 53 20 76 61 6c 75  ing the LHS valu
18e00 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 4c 68 73  es */.  int rLhs
18e10 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  Orig;         /*
18e20 20 4c 48 53 20 76 61 6c 75 65 73 20 70 72 69 6f   LHS values prio
18e30 72 20 74 6f 20 72 65 6f 72 64 65 72 69 6e 67 20  r to reordering 
18e40 62 79 20 61 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20  by aiMap[] */.  
18e50 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
18e60 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65        /* Stateme
18e70 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
18e80 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a  ction */.  int *
18e90 61 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20  aiMap = 0;      
18ea0 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65 63   /* Map from vec
18eb0 74 6f 72 20 66 69 65 6c 64 20 74 6f 20 69 6e 64  tor field to ind
18ec0 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  ex column */.  c
18ed0 68 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20  har *zAff = 0;  
18ee0 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
18ef0 20 73 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70   string for comp
18f00 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  arisons */.  int
18f10 20 6e 56 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nVector;       
18f20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65     /* Size of ve
18f30 63 74 6f 72 73 20 66 6f 72 20 74 68 69 73 20 49  ctors for this I
18f40 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
18f50 69 6e 74 20 69 44 75 6d 6d 79 3b 20 20 20 20 20  int iDummy;     
18f60 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 70        /* Dummy p
18f70 61 72 61 6d 65 74 65 72 20 74 6f 20 65 78 70 72  arameter to expr
18f80 43 6f 64 65 56 65 63 74 6f 72 28 29 20 2a 2f 0a  CodeVector() */.
18f90 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20    Expr *pLeft;  
18fa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
18fb0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
18fc0 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
18fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18fe0 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* loop counter
18ff0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74   */.  int destSt
19000 65 70 32 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  ep2;        /* W
19010 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 77 68 65  here to jump whe
19020 6e 20 4e 55 4c 4c 73 20 73 65 65 6e 20 69 6e 20  n NULLs seen in 
19030 73 74 65 70 20 32 20 2a 2f 0a 20 20 69 6e 74 20  step 2 */.  int 
19040 64 65 73 74 53 74 65 70 36 20 3d 20 30 3b 20 20  destStep6 = 0;  
19050 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f    /* Start of co
19060 64 65 20 66 6f 72 20 53 74 65 70 20 36 20 2a 2f  de for Step 6 */
19070 0a 20 20 69 6e 74 20 61 64 64 72 54 72 75 74 68  .  int addrTruth
19080 4f 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  Op;      /* Addr
19090 65 73 73 20 6f 66 20 6f 70 63 6f 64 65 20 74 68  ess of opcode th
190a0 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  at determines th
190b0 65 20 49 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a  e IN is true */.
190c0 20 20 69 6e 74 20 64 65 73 74 4e 6f 74 4e 75 6c    int destNotNul
190d0 6c 3b 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  l;      /* Jump 
190e0 68 65 72 65 20 69 66 20 61 20 63 6f 6d 70 61 72  here if a compar
190f0 69 73 6f 6e 20 69 73 20 6e 6f 74 20 74 72 75 65  ison is not true
19100 20 69 6e 20 73 74 65 70 20 36 20 2a 2f 0a 20 20   in step 6 */.  
19110 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
19120 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
19130 74 68 65 20 73 74 65 70 2d 36 20 6c 6f 6f 70 20  the step-6 loop 
19140 2a 2f 20 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70  */ ..  pLeft = p
19150 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
19160 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
19170 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45  eckIN(pParse, pE
19180 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  xpr) ) return;. 
19190 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66   zAff = exprINAf
191a0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
191b0 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72  Expr);.  nVector
191c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
191d0 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
191e0 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20  pLeft);.  aiMap 
191f0 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44  = (int*)sqlite3D
19200 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  bMallocZero(.   
19210 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e     pParse->db, n
19220 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69  Vector*(sizeof(i
19230 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  nt) + sizeof(cha
19240 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69  r)) + 1.  );.  i
19250 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
19260 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
19270 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  to sqlite3ExprCo
19280 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a  deIN_oom_error;.
19290 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
192a0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   compute the RHS
192b0 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65  . After this ste
192c0 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f  p, if anything o
192d0 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49  ther than.  ** I
192e0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
192f0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61  returned, the ta
19300 62 6c 65 20 6f 70 65 6e 65 64 20 69 74 68 20 63  ble opened ith c
19310 75 72 73 6f 72 20 70 45 78 70 72 2d 3e 69 54 61  ursor pExpr->iTa
19320 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ble .  ** contai
19330 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
19340 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52  at make up the R
19350 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f  HS. If IN_INDEX_
19360 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64  NOOP is returned
19370 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48 53 20 68  ,.  ** the RHS h
19380 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
19390 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d  coded.  */.  v =
193a0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
193b0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
193c0 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64  ;       /* OOM d
193d0 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f  etected prior to
193e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
193f0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
19400 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e  nt((v, "begin IN
19410 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70   expr"));.  eTyp
19420 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
19430 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
19440 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42     IN_INDEX_MEMB
19470 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45  ERSHIP | IN_INDE
19480 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20  X_NOOP_OK,.     
19490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194a0 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46 61          destIfFa
194b0 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
194c0 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75  ? 0 : &rRhsHasNu
194d0 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a 20 20 61  ll, aiMap);..  a
194e0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
194f0 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d  Err || nVector==
19500 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  1 || eType==IN_I
19510 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20 20  NDEX_EPH.       
19520 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  || eType==IN_IND
19530 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20  EX_INDEX_ASC || 
19540 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
19550 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29 3b  INDEX_DESC .  );
19560 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
19570 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72  EBUG.  /* Confir
19580 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20 63  m that aiMap[] c
19590 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72 20  ontains nVector 
195a0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 62  integer values b
195b0 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a  etween 0 and.  *
195c0 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a  * nVector-1. */.
195d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
195e0 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
195f0 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20  int j, cnt;.    
19600 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e  for(cnt=j=0; j<n
19610 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28  Vector; j++) if(
19620 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63   aiMap[j]==i ) c
19630 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  nt++;.    assert
19640 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a  ( cnt==1 );.  }.
19650 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64  #endif..  /* Cod
19660 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c  e the LHS, the <
19670 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
19680 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66  r> IN (...)". If
19690 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20   the LHS is a . 
196a0 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e   ** vector, then
196b0 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e   it is stored in
196c0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65   an array of nVe
196d0 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 73  ctor registers s
196e0 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74  tarting .  ** at
196f0 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73   r1..  **.  ** s
19700 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
19710 78 28 29 20 6d 69 67 68 74 20 68 61 76 65 20 72  x() might have r
19720 65 6f 72 64 65 72 65 64 20 74 68 65 20 66 69 65  eordered the fie
19730 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20 76  lds of the LHS v
19740 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68  ector.  ** so th
19750 61 74 20 74 68 65 20 66 69 65 6c 64 73 20 61 72  at the fields ar
19760 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72  e in the same or
19770 64 65 72 20 61 73 20 61 6e 20 65 78 69 73 74 69  der as an existi
19780 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65 0a  ng index.   The.
19790 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72    ** aiMap[] arr
197a0 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  ay contains a ma
197b0 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f  pping from the o
197c0 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c  riginal LHS fiel
197d0 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  d order to.  ** 
197e0 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72 20  the field order 
197f0 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
19800 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f   RHS index..  */
19810 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
19820 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
19830 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65 78  .  rLhsOrig = ex
19840 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
19850 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75  rse, pLeft, &iDu
19860 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  mmy);.  for(i=0;
19870 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61 69   i<nVector && ai
19880 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b  Map[i]==i; i++){
19890 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69 65  } /* Are LHS fie
198a0 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20 2a  lds reordered? *
198b0 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63 74  /.  if( i==nVect
198c0 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53  or ){.    /* LHS
198d0 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20   fields are not 
198e0 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  reordered */.   
198f0 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69 67   rLhs = rLhsOrig
19900 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
19910 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64 65  * Need to reorde
19920 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64 73  r the LHS fields
19930 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 69   according to ai
19940 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20  Map */.    rLhs 
19950 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
19960 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56  Range(pParse, nV
19970 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28  ector);.    for(
19980 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
19990 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
199a0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
199b0 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72   OP_Copy, rLhsOr
199c0 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70  ig+i, rLhs+aiMap
199d0 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  [i], 0);.    }. 
199e0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69   }..  /* If sqli
199f0 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29  te3FindInIndex()
19a00 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72   did not find or
19a10 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
19a20 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75   that is.  ** su
19a30 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75  itable for evalu
19a40 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65  ating the IN ope
19a50 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c  rator, then eval
19a60 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a  uate using a.  *
19a70 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f  * sequence of co
19a80 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a  mparisons..  **.
19a90 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74 65    ** This is ste
19aa0 70 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e 2d  p (1) in the in-
19ab0 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69  operator.md opti
19ac0 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e  mized algorithm.
19ad0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
19ae0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  e==IN_INDEX_NOOP
19af0 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
19b00 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
19b10 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f  >x.pList;.    Co
19b20 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
19b30 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
19b40 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
19b50 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74  >pLeft);.    int
19b60 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74   labelOk = sqlit
19b70 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19b80 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20  v);.    int r2, 
19b90 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69  regToFree;.    i
19ba0 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30  nt regCkNull = 0
19bb0 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
19bc0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
19bd0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
19be0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
19bf0 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49  );.    if( destI
19c00 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c  fNull!=destIfFal
19c10 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43  se ){.      regC
19c20 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  kNull = sqlite3G
19c30 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19c40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19c50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19c60 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20 72  _BitAnd, rLhs, r
19c70 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b  Lhs, regCkNull);
19c80 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
19c90 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  i=0; ii<pList->n
19ca0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
19cb0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
19cc0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
19cd0 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  se, pList->a[ii]
19ce0 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72  .pExpr, &regToFr
19cf0 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ee);.      if( r
19d00 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69  egCkNull && sqli
19d10 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
19d20 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45  (pList->a[ii].pE
19d30 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
19d40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19d50 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
19d60 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72  regCkNull, r2, r
19d70 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  egCkNull);.     
19d80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c   }.      if( ii<
19d90 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c  pList->nExpr-1 |
19da0 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  | destIfNull!=de
19db0 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
19dc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19dd0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c  AddOp4(v, OP_Eq,
19de0 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20   rLhs, labelOk, 
19df0 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
19e10 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
19e20 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
19e30 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
19e40 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  v, ii<pList->nEx
19e50 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56  pr-1);.        V
19e60 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
19e70 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70   ii==pList->nExp
19e80 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r-1);.        sq
19e90 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
19ea0 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20  5(v, zAff[0]);. 
19eb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19ec0 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74      assert( dest
19ed0 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
19ee0 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  lse );.        s
19ef0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19f00 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c  (v, OP_Ne, rLhs,
19f10 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32   destIfFalse, r2
19f20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19f30 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
19f40 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
19f50 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72  LSEQ); VdbeCover
19f60 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
19f70 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
19f80 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c  eP5(v, zAff[0] |
19f90 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
19fa0 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
19fb0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19fc0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19fd0 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20   regToFree);.   
19fe0 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b   }.    if( regCk
19ff0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Null ){.      sq
1a000 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a010 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
1a020 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e  gCkNull, destIfN
1a030 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ull); VdbeCovera
1a040 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
1a050 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1a060 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1a070 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1a080 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a090 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20  v, labelOk);.   
1a0a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1a0b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1a0c0 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 67  egCkNull);.    g
1a0d0 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  oto sqlite3ExprC
1a0e0 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a  odeIN_finished;.
1a0f0 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 32    }..  /* Step 2
1a100 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  : Check to see i
1a110 66 20 74 68 65 20 4c 48 53 20 63 6f 6e 74 61 69  f the LHS contai
1a120 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75  ns any NULL colu
1a130 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  mns.  If the.  *
1a140 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74 61  * LHS does conta
1a150 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74 68  in NULLs then th
1a160 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65  e result must be
1a170 20 65 69 74 68 65 72 20 46 41 4c 53 45 20 6f 72   either FALSE or
1a180 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20 77   NULL..  ** We w
1a190 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20 74 68  ill then skip th
1a1a0 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  e binary search 
1a1b0 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f  of the RHS..  */
1a1c0 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c  .  if( destIfNul
1a1d0 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l==destIfFalse )
1a1e0 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20  {.    destStep2 
1a1f0 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  = destIfFalse;. 
1a200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74   }else{.    dest
1a210 53 74 65 70 32 20 3d 20 64 65 73 74 53 74 65 70  Step2 = destStep
1a220 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  6 = sqlite3VdbeM
1a230 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d  akeLabel(v);.  }
1a240 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
1a250 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
1a260 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
1a270 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
1a280 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  expr(pExpr->pLef
1a290 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 73  t, i);.    if( s
1a2a0 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
1a2b0 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ull(p) ){.      
1a2c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a2d0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
1a2e0 72 4c 68 73 2b 69 2c 20 64 65 73 74 53 74 65 70  rLhs+i, destStep
1a2f0 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
1a300 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
1a310 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
1a320 33 2e 20 20 54 68 65 20 4c 48 53 20 69 73 20 6e  3.  The LHS is n
1a330 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e  ow known to be n
1a340 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74 68 65  on-NULL.  Do the
1a350 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 0a 20   binary search. 
1a360 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 20 75   ** of the RHS u
1a370 73 69 6e 67 20 74 68 65 20 4c 48 53 20 61 73 20  sing the LHS as 
1a380 61 20 70 72 6f 62 65 2e 20 20 49 66 20 66 6f 75  a probe.  If fou
1a390 6e 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  nd, the result i
1a3a0 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a 20 20 2a  s.  ** true..  *
1a3b0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49  /.  if( eType==I
1a3c0 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
1a3d0 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
1a3e0 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73  case, the RHS is
1a3f0 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61   the ROWID of ta
1a400 62 6c 65 20 62 2d 74 72 65 65 20 61 6e 64 20 73  ble b-tree and s
1a410 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  o we also.    **
1a420 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 52   know that the R
1a430 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  HS is non-NULL. 
1a440 20 48 65 6e 63 65 2c 20 77 65 20 63 6f 6d 62 69   Hence, we combi
1a450 6e 65 20 73 74 65 70 73 20 33 20 61 6e 64 20 34  ne steps 3 and 4
1a460 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 73  .    ** into a s
1a470 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  ingle opcode. */
1a480 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a490 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
1a4a0 6b 52 6f 77 69 64 2c 20 70 45 78 70 72 2d 3e 69  kRowid, pExpr->i
1a4b0 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
1a4c0 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20 56  se, rLhs);.    V
1a4d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a4e0 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20      addrTruthOp 
1a4f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a500 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
1a510 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75 65    /* Return True
1a520 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1a530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a540 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p4(v, OP_Affinit
1a550 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72  y, rLhs, nVector
1a560 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74  , 0, zAff, nVect
1a570 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73  or);.    if( des
1a580 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
1a590 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Null ){.      /*
1a5a0 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33 20   Combine Step 3 
1a5b0 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f 20  and Step 5 into 
1a5c0 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20  a single opcode 
1a5d0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1a5e0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1a5f0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45   OP_NotFound, pE
1a600 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
1a610 74 49 66 46 61 6c 73 65 2c 0a 20 20 20 20 20 20  tIfFalse,.      
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a630 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74       rLhs, nVect
1a640 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  or); VdbeCoverag
1a650 65 28 76 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  e(v);.      goto
1a660 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a670 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  IN_finished;.   
1a680 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64 69 6e 61   }.    /* Ordina
1a690 72 79 20 53 74 65 70 20 33 2c 20 66 6f 72 20 74  ry Step 3, for t
1a6a0 68 65 20 63 61 73 65 20 77 68 65 72 65 20 46 41  he case where FA
1a6b0 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20 61 72 65  LSE and NULL are
1a6c0 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 20   distinct */.   
1a6d0 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73   addrTruthOp = s
1a6e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1a6f0 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
1a700 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
1a710 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a730 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e           rLhs, n
1a740 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76  Vector); VdbeCov
1a750 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
1a760 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66 20   /* Step 4.  If 
1a770 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e  the RHS is known
1a780 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20   to be non-NULL 
1a790 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20 66  and we did not f
1a7a0 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63  ind.  ** an matc
1a7b0 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 20  h on the search 
1a7c0 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
1a7d0 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 46  result must be F
1a7e0 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALSE..  */.  if(
1a7f0 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20   rRhsHasNull && 
1a800 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20  nVector==1 ){.  
1a810 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a820 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op2(v, OP_NotNul
1a830 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  l, rRhsHasNull, 
1a840 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1a850 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1a860 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  );.  }..  /* Ste
1a870 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  p 5.  If we do n
1a880 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
1a890 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1a8a0 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20  ween NULL and.  
1a8b0 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a  ** FALSE, then j
1a8c0 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65  ust return false
1a8d0 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  . .  */.  if( de
1a8e0 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
1a8f0 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33 56  fNull ) sqlite3V
1a900 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
1a910 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53  fFalse);..  /* S
1a920 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f  tep 6: Loop thro
1a930 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65 20  ugh rows of the 
1a940 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65 61  RHS.  Compare ea
1a950 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c 48  ch row to the LH
1a960 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 63  S..  ** If any c
1a970 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c  omparison is NUL
1a980 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  L, then the resu
1a990 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20  lt is NULL.  If 
1a9a0 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69  all.  ** compari
1a9b0 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20 74  sons are FALSE t
1a9c0 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72 65  hen the final re
1a9d0 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a 20  sult is FALSE.. 
1a9e0 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73   **.  ** For a s
1a9f0 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69 73  calar LHS, it is
1aa00 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 63   sufficient to c
1aa10 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66 69  heck just the fi
1aa20 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20  rst row.  ** of 
1aa30 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
1aa40 69 66 28 20 64 65 73 74 53 74 65 70 36 20 29 20  if( destStep6 ) 
1aa50 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1aa60 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 53  veLabel(v, destS
1aa70 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f 70  tep6);.  addrTop
1aa80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1aa90 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
1aaa0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
1aab0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
1aac0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1aad0 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72  );.  if( nVector
1aae0 3e 31 20 29 7b 0a 20 20 20 20 64 65 73 74 4e 6f  >1 ){.    destNo
1aaf0 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  tNull = sqlite3V
1ab00 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1ab10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1ab20 20 46 6f 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c   For nVector==1,
1ab30 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 36   combine steps 6
1ab40 20 61 6e 64 20 37 20 62 79 20 69 6d 6d 65 64 69   and 7 by immedi
1ab50 61 74 65 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a  ately returning.
1ab60 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20      ** FALSE if 
1ab70 74 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72  the first compar
1ab80 69 73 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ison is not NULL
1ab90 20 2a 2f 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e   */.    destNotN
1aba0 75 6c 6c 20 3d 20 64 65 73 74 49 66 46 61 6c 73  ull = destIfFals
1abb0 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  e;.  }.  for(i=0
1abc0 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
1abd0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
1abe0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
1abf0 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 33 20 3d  ll;.    int r3 =
1ac00 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1ac10 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1ac20 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  p = sqlite3Vecto
1ac30 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c  rFieldSubexpr(pL
1ac40 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f  eft, i);.    pCo
1ac50 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1ac60 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1ac70 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
1ac80 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1ac90 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69  Column, pExpr->i
1aca0 54 61 62 6c 65 2c 20 69 2c 20 72 33 29 3b 0a 20  Table, i, r3);. 
1acb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1acc0 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp4(v, OP_Ne, r
1acd0 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75  Lhs+i, destNotNu
1ace0 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20  ll, r3,.        
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1ad00 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
1ad10 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56 64 62  OLLSEQ);.    Vdb
1ad20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1ad30 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1ad40 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1ad50 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  r3);.  }.  sqlit
1ad60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ad70 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
1ad80 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e  IfNull);.  if( n
1ad90 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Vector>1 ){.    
1ada0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1adb0 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 4e  veLabel(v, destN
1adc0 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  otNull);.    sql
1add0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ade0 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 45 78 70 72  , OP_Next, pExpr
1adf0 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 54 6f  ->iTable, addrTo
1ae00 70 2b 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  p+1);.    VdbeCo
1ae10 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
1ae20 2f 2a 20 53 74 65 70 20 37 3a 20 20 49 66 20 77  /* Step 7:  If w
1ae30 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
1ae40 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nt, we know that
1ae50 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   the result must
1ae60 0a 20 20 20 20 2a 2a 20 62 65 20 66 61 6c 73 65  .    ** be false
1ae70 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
1ae80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ae90 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
1aea0 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  False);.  }..  /
1aeb0 2a 20 4a 75 6d 70 73 20 68 65 72 65 20 69 6e 20  * Jumps here in 
1aec0 6f 72 64 65 72 20 74 6f 20 72 65 74 75 72 6e 20  order to return 
1aed0 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  true. */.  sqlit
1aee0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1aef0 2c 20 61 64 64 72 54 72 75 74 68 4f 70 29 3b 0a  , addrTruthOp);.
1af00 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65  .sqlite3ExprCode
1af10 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69  IN_finished:.  i
1af20 66 28 20 72 4c 68 73 21 3d 72 4c 68 73 4f 72 69  f( rLhs!=rLhsOri
1af30 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61  g ) sqlite3Relea
1af40 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1af50 2c 20 72 4c 68 73 29 3b 0a 20 20 73 71 6c 69 74  , rLhs);.  sqlit
1af60 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1af70 50 61 72 73 65 29 3b 0a 20 20 56 64 62 65 43 6f  Parse);.  VdbeCo
1af80 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49  mment((v, "end I
1af90 4e 20 65 78 70 72 22 29 29 3b 0a 73 71 6c 69 74  N expr"));.sqlit
1afa0 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d  e3ExprCodeIN_oom
1afb0 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
1afc0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
1afd0 64 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20 73 71  db, aiMap);.  sq
1afe0 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1aff0 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 7d  se->db, zAff);.}
1b000 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1b010 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
1b020 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
1b030 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1b040 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e  _POINT./*.** Gen
1b050 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
1b060 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
1b070 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20  ut the floating 
1b080 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64  point.** value d
1b090 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e  escribed by z[0.
1b0a0 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
1b0b0 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
1b0c0 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77  The z[] string w
1b0d0 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74  ill probably not
1b0e0 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61   be zero-termina
1b0f0 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a  ted.  But the .*
1b100 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72  * z[n] character
1b110 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1b120 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74  o be something t
1b130 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f  hat does not loo
1b140 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f  k.** like the co
1b150 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68  ntinuation of th
1b160 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
1b170 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61  tic void codeRea
1b180 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  l(Vdbe *v, const
1b190 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65   char *z, int ne
1b1a0 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d  gateFlag, int iM
1b1b0 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  em){.  if( ALWAY
1b1c0 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64  S(z!=0) ){.    d
1b1d0 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20  ouble value;.   
1b1e0 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20   sqlite3AtoF(z, 
1b1f0 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53  &value, sqlite3S
1b200 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
1b210 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73  TE_UTF8);.    as
1b220 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73  sert( !sqlite3Is
1b230 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a  NaN(value) ); /*
1b240 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65   The new AtoF ne
1b250 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20  ver returns NaN 
1b260 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74  */.    if( negat
1b270 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20  eFlag ) value = 
1b280 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69  -value;.    sqli
1b290 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
1b2a0 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  8(v, OP_Real, 0,
1b2b0 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26   iMem, 0, (u8*)&
1b2c0 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b  value, P4_REAL);
1b2d0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
1b2e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
1b2f0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
1b300 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
1b310 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65  integer describe
1b320 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e   by.** text z[0.
1b330 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
1b340 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
1b350 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73  Expr.u.zToken is
1b360 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64   always UTF8 and
1b370 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
1b380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b390 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72   codeInteger(Par
1b3a0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1b3b0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67   *pExpr, int neg
1b3c0 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
1b3d0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1b3e0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
1b3f0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
1b400 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
1b410 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70      int i = pExp
1b420 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  r->u.iValue;.   
1b430 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b   assert( i>=0 );
1b440 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67  .    if( negFlag
1b450 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73   ) i = -i;.    s
1b460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b470 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1b480 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73  i, iMem);.  }els
1b490 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20  e{.    int c;.  
1b4a0 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20    i64 value;.   
1b4b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1b4c0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1b4d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21  ;.    assert( z!
1b4e0 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71  =0 );.    c = sq
1b4f0 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
1b500 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20  64(z, &value);. 
1b510 20 20 20 69 66 28 20 28 63 3d 3d 33 20 26 26 20     if( (c==3 && 
1b520 21 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28 63 3d  !negFlag) || (c=
1b530 3d 32 29 20 7c 7c 20 28 6e 65 67 46 6c 61 67 20  =2) || (negFlag 
1b540 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45  && value==SMALLE
1b550 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23 69 66 64  ST_INT64)){.#ifd
1b560 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1b570 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
1b580 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1b590 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65  Msg(pParse, "ove
1b5a0 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20  rsized integer: 
1b5b0 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f  %s%s", negFlag ?
1b5c0 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23   "-" : "", z);.#
1b5d0 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
1b5e0 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54  ITE_OMIT_HEX_INT
1b5f0 45 47 45 52 0a 20 20 20 20 20 20 69 66 28 20 73  EGER.      if( s
1b600 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
1b610 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a  z,"0x",2)==0 ){.
1b620 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b630 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b640 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f  "hex literal too
1b650 20 62 69 67 3a 20 25 73 25 73 22 2c 20 6e 65 67   big: %s%s", neg
1b660 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a  Flag?"-":"",z);.
1b670 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
1b680 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
1b690 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a     codeReal(v, z
1b6a0 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29  , negFlag, iMem)
1b6b0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1b6c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b6d0 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b    if( negFlag ){
1b6e0 20 76 61 6c 75 65 20 3d 20 63 3d 3d 33 20 3f 20   value = c==3 ? 
1b6f0 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a  SMALLEST_INT64 :
1b700 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20   -value; }.     
1b710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b720 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74  p4Dup8(v, OP_Int
1b730 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  64, 0, iMem, 0, 
1b740 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f  (u8*)&value, P4_
1b750 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 0a 20 20  INT64);.    }.  
1b760 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  }.}../*.** Erase
1b770 20 63 6f 6c 75 6d 6e 2d 63 61 63 68 65 20 65 6e   column-cache en
1b780 74 72 79 20 6e 75 6d 62 65 72 20 69 0a 2a 2f 0a  try number i.*/.
1b790 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 68  static void cach
1b7a0 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73  eEntryClear(Pars
1b7b0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1b7c0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
1b7d0 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65  >aColCache[i].te
1b7e0 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28  mpReg ){.    if(
1b7f0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
1b800 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
1b810 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
1b820 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
1b830 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
1b840 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50  nTempReg++] = pP
1b850 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1b860 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  i].iReg;.    }. 
1b870 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f   }.  pParse->nCo
1b880 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 69 66 28 20  lCache--;.  if( 
1b890 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1b8a0 63 68 65 20 29 7b 0a 20 20 20 20 70 50 61 72 73  che ){.    pPars
1b8b0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20  e->aColCache[i] 
1b8c0 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
1b8d0 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  che[pParse->nCol
1b8e0 43 61 63 68 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 0a  Cache];.  }.}...
1b8f0 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20  /*.** Record in 
1b900 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1b910 20 74 68 61 74 20 61 20 70 61 72 74 69 63 75 6c   that a particul
1b920 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61  ar column from a
1b930 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74  .** particular t
1b940 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69  able is stored i
1b950 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
1b960 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64  egister..*/.void
1b970 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1b980 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50  eStore(Parse *pP
1b990 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20  arse, int iTab, 
1b9a0 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52  int iCol, int iR
1b9b0 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
1b9c0 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e  int minLru;.  in
1b9d0 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75  t idxLru;.  stru
1b9e0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
1b9f0 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e  ..  /* Unless an
1ba00 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
1ba10 72 65 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75  red, register nu
1ba20 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73  mbers are always
1ba30 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20   positive. */.  
1ba40 61 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c  assert( iReg>0 |
1ba50 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
1ba60 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
1ba70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1ba80 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31  assert( iCol>=-1
1ba90 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29   && iCol<32768 )
1baa0 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c  ;  /* Finite col
1bab0 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a  umn numbers */..
1bac0 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    /* The SQLITE_
1bad0 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67  ColumnCache flag
1bae0 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f   disables the co
1baf0 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69  lumn cache.  Thi
1bb00 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66  s is used.  ** f
1bb10 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20  or testing only 
1bb20 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  - to verify that
1bb30 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67   SQLite always g
1bb40 65 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73  ets the same ans
1bb50 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e  wer.  ** with an
1bb60 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f  d without the co
1bb70 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f  lumn cache..  */
1bb80 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
1bb90 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72  ionDisabled(pPar
1bba0 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
1bbb0 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65  olumnCache) ) re
1bbc0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  turn;..  /* Firs
1bbd0 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78  t replace any ex
1bbe0 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20  isting entry..  
1bbf0 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
1bc00 2c 20 74 68 65 20 77 61 79 20 74 68 65 20 63 6f  , the way the co
1bc10 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75  lumn cache is cu
1bc20 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65  rrently used, we
1bc30 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a   are guaranteed.
1bc40 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62    ** that the ob
1bc50 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  ject will never 
1bc60 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63 61  already be in ca
1bc70 63 68 65 2e 20 20 56 65 72 69 66 79 20 74 68 69  che.  Verify thi
1bc80 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a  s guarantee..  *
1bc90 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1bca0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
1bcb0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
1bcc0 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
1bcd0 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ache; i++, p++){
1bce0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1bcf0 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20  iTable!=iTab || 
1bd00 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  p->iColumn!=iCol
1bd10 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
1bd20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1bd30 42 55 47 5f 43 4f 4c 55 4d 4e 43 41 43 48 45 0a  BUG_COLUMNCACHE.
1bd40 20 20 2f 2a 20 41 64 64 20 61 20 53 65 74 54 61    /* Add a SetTa
1bd50 62 43 6f 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20  bCol opcode for 
1bd60 72 75 6e 2d 74 69 6d 65 20 76 65 72 69 66 69 63  run-time verific
1bd70 61 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 63  ation that the c
1bd80 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 63 61 63 68 65  olumn.  ** cache
1bd90 20 69 73 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72   is working corr
1bda0 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  ectly..  */.  sq
1bdb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1bdc0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1bdd0 50 5f 53 65 74 54 61 62 43 6f 6c 2c 20 69 54 61  P_SetTabCol, iTa
1bde0 62 2c 20 69 43 6f 6c 2c 20 69 52 65 67 29 3b 0a  b, iCol, iReg);.
1bdf0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1be00 74 68 65 20 63 61 63 68 65 20 69 73 20 61 6c 72  the cache is alr
1be10 65 61 64 79 20 66 75 6c 6c 2c 20 64 65 6c 65 74  eady full, delet
1be20 65 20 74 68 65 20 6c 65 61 73 74 20 72 65 63 65  e the least rece
1be30 6e 74 6c 79 20 75 73 65 64 20 65 6e 74 72 79 20  ntly used entry 
1be40 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
1be50 3e 6e 43 6f 6c 43 61 63 68 65 3e 3d 53 51 4c 49  >nColCache>=SQLI
1be60 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 20 29 7b  TE_N_COLCACHE ){
1be70 0a 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78  .    minLru = 0x
1be80 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 69 64  7fffffff;.    id
1be90 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 20 20 66  xLru = -1;.    f
1bea0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1beb0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
1bec0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
1bed0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1bee0 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69     if( p->lru<mi
1bef0 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 20 20  nLru ){.        
1bf00 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20  idxLru = i;.    
1bf10 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e      minLru = p->
1bf20 6c 72 75 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lru;.      }.   
1bf30 20 7d 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72   }.    p = &pPar
1bf40 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64  se->aColCache[id
1bf50 78 4c 72 75 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xLru];.  }else{.
1bf60 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
1bf70 3e 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73  >aColCache[pPars
1bf80 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 5d 3b  e->nColCache++];
1bf90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74  .  }..  /* Add t
1bfa0 68 65 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20  he new entry to 
1bfb0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63  the end of the c
1bfc0 61 63 68 65 20 2a 2f 0a 20 20 70 2d 3e 69 4c 65  ache */.  p->iLe
1bfd0 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
1bfe0 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 70 2d 3e  acheLevel;.  p->
1bff0 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
1c000 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
1c010 6f 6c 3b 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20  ol;.  p->iReg = 
1c020 69 52 65 67 3b 0a 20 20 70 2d 3e 74 65 6d 70 52  iReg;.  p->tempR
1c030 65 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 6c 72 75  eg = 0;.  p->lru
1c040 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
1c050 65 43 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eCnt++;.}../*.**
1c060 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72   Indicate that r
1c070 65 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e  egisters between
1c080 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67   iReg..iReg+nReg
1c090 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65  -1 are being ove
1c0a0 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72  rwritten..** Pur
1c0b0 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  ge the range of 
1c0c0 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74  registers from t
1c0d0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
1c0e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c0f0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1c100 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1c110 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
1c120 67 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  g){.  int i = 0;
1c130 0a 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72  .  while( i<pPar
1c140 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b  se->nColCache ){
1c150 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c  .    struct yCol
1c160 43 61 63 68 65 20 2a 70 20 3d 20 26 70 50 61 72  Cache *p = &pPar
1c170 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
1c180 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  ;.    if( p->iRe
1c190 67 20 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e  g >= iReg && p->
1c1a0 69 52 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67  iReg < iReg+nReg
1c1b0 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
1c1c0 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
1c1d0 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , i);.    }else{
1c1e0 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
1c1f0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
1c200 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72  emember the curr
1c210 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  ent column cache
1c220 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e   context.  Any n
1c230 65 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64  ew entries added
1c240 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65  .** added to the
1c250 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66   column cache af
1c260 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72  ter this call ar
1c270 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74  e removed when t
1c280 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
1c290 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a  ing pop occurs..
1c2a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1c2b0 78 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72  xprCachePush(Par
1c2c0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
1c2d0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1c2e0 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c  el++;.#ifdef SQL
1c2f0 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1c300 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
1c310 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
1c320 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
1c330 20 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f   printf("PUSH to
1c340 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e   %d\n", pParse->
1c350 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20  iCacheLevel);.  
1c360 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
1c370 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68  * Remove from th
1c380 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61  e column cache a
1c390 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ny entries that 
1c3a0 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65  were added since
1c3b0 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76   the.** the prev
1c3c0 69 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72  ious sqlite3Expr
1c3d0 43 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74  CachePush operat
1c3e0 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
1c3f0 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a  ords, restore.**
1c400 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68   the cache to th
1c410 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
1c420 6e 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74  n prior the most
1c430 20 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f   recent Push..*/
1c440 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1c450 72 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20  rCachePop(Parse 
1c460 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
1c470 69 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  i = 0;.  assert(
1c480 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1c490 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61  evel>=1 );.  pPa
1c4a0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1c4b0 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  --;.#ifdef SQLIT
1c4c0 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
1c4d0 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
1c4e0 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
1c4f0 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70  opTrace ){.    p
1c500 72 69 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25  rintf("POP  to %
1c510 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43  d\n", pParse->iC
1c520 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a  acheLevel);.  }.
1c530 23 65 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 20  #endif.  while( 
1c540 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
1c550 63 68 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  che ){.    if( p
1c560 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1c570 5b 69 5d 2e 69 4c 65 76 65 6c 3e 70 50 61 72 73  [i].iLevel>pPars
1c580 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29  e->iCacheLevel )
1c590 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
1c5a0 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
1c5b0 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
1c5c0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a       i++;.    }.
1c5d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
1c5e0 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d  n a cached colum
1c5f0 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b  n is reused, mak
1c600 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20  e sure that its 
1c610 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e  register is.** n
1c620 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62  o longer availab
1c630 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67  le as a temp reg
1c640 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23  ister.  ticket #
1c650 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65  3879:  that same
1c660 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67  .** register mig
1c670 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ht be in the cac
1c680 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  he in multiple p
1c690 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72  laces, so be sur
1c6a0 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d  e to.** get them
1c6b0 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   all..*/.static 
1c6c0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1c6d0 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
1c6e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c6f0 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
1c700 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1c710 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
1c720 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1c730 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61  aColCache; i<pPa
1c740 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
1c750 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1c760 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
1c770 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d   ){.      p->tem
1c780 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
1c790 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61    }.}../* Genera
1c7a0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1c7b0 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69  l load into regi
1c7c0 73 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61  ster regOut a va
1c7d0 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  lue that is.** a
1c7e0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
1c7f0 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f  he iIdxCol-th co
1c800 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
1c810 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  dx..*/.void sqli
1c820 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49  te3ExprCodeLoadI
1c830 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  ndexColumn(.  Pa
1c840 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a  rse *pParse,  /*
1c850 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1c860 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
1c870 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65  *pIdx,    /* The
1c880 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c   index whose col
1c890 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61  umn is to be loa
1c8a0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ded */.  int iTa
1c8b0 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73  bCur,    /* Curs
1c8c0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  or pointing to a
1c8d0 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20   table row */.  
1c8e0 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20  int iIdxCol,    
1c8f0 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  /* The column of
1c900 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   the index to be
1c910 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74   loaded */.  int
1c920 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
1c930 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20  Store the index 
1c940 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1c950 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
1c960 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f  .){.  i16 iTabCo
1c970 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
1c980 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69  mn[iIdxCol];.  i
1c990 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45  f( iTabCol==XN_E
1c9a0 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  XPR ){.    asser
1c9b0 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  t( pIdx->aColExp
1c9c0 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
1c9d0 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1c9e0 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29  >nExpr>iIdxCol )
1c9f0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53  ;.    pParse->iS
1ca00 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72  elfTab = iTabCur
1ca10 20 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   + 1;.    sqlite
1ca20 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50  3ExprCodeCopy(pP
1ca30 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c  arse, pIdx->aCol
1ca40 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d  Expr->a[iIdxCol]
1ca50 2e 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b  .pExpr, regOut);
1ca60 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65  .    pParse->iSe
1ca70 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c  lfTab = 0;.  }el
1ca80 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1ca90 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1caa0 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  OfTable(pParse->
1cab0 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61  pVdbe, pIdx->pTa
1cac0 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20  ble, iTabCur,.  
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caf0 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75    iTabCol, regOu
1cb00 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1cb10 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1cb20 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61  o extract the va
1cb30 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d  lue of the iCol-
1cb40 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  th column of a t
1cb50 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
1cb60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1cb70 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20  ColumnOfTable(. 
1cb80 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
1cb90 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64   /* The VDBE und
1cba0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1cbb0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1cbc0 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
1cbd0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1cbe0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
1cbf0 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54  iTabCur,    /* T
1cc00 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e  he table cursor.
1cc10 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73    Or the PK curs
1cc20 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  or for WITHOUT R
1cc30 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43  OWID */.  int iC
1cc40 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ol,       /* Ind
1cc50 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
1cc60 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20   to extract */. 
1cc70 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20   int regOut     
1cc80 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
1cc90 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20  value into this 
1cca0 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1ccb0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
1ccc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ccd0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1cce0 6d 6e 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f  mn, iTabCur, iCo
1ccf0 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20  l, regOut);.    
1cd00 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
1cd10 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c  ( iCol<0 || iCol
1cd20 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
1cd30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1cd40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
1cd50 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67  id, iTabCur, reg
1cd60 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
1cd70 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69     int op = IsVi
1cd80 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
1cd90 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f  _VColumn : OP_Co
1cda0 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20  lumn;.    int x 
1cdb0 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20  = iCol;.    if( 
1cdc0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
1cdd0 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
1cde0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d  ab) ){.      x =
1cdf0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1ce00 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72 69  Index(sqlite3Pri
1ce10 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
1ce20 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d  b), iCol);.    }
1ce30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ce40 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54  AddOp3(v, op, iT
1ce50 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74  abCur, x, regOut
1ce60 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  );.  }.  if( iCo
1ce70 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  l>=0 ){.    sqli
1ce80 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
1ce90 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20  (v, pTab, iCol, 
1cea0 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  regOut);.  }.}..
1ceb0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1cec0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78  ode that will ex
1ced0 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d  tract the iColum
1cee0 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  n-th column from
1cef0 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61  .** table pTab a
1cf00 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  nd store the col
1cf10 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72  umn value in a r
1cf20 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20  egister. .**.** 
1cf30 41 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  An effort is mad
1cf40 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
1cf50 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
1cf60 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54  egister iReg.  T
1cf70 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61  his.** is not ga
1cf80 72 61 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74  ranteeed for Get
1cf90 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72  Column() - the r
1cfa0 65 73 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f  esult can be sto
1cfb0 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65  red in.** any re
1cfc0 67 69 73 74 65 72 2e 20 20 42 75 74 20 74 68 65  gister.  But the
1cfd0 20 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61   result is guara
1cfe0 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e  nteed to land in
1cff0 20 72 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a   register iReg.*
1d000 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54  * for GetColumnT
1d010 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  oReg()..**.** Th
1d020 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
1d030 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54  pen cursor to pT
1d040 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65  ab in iTable whe
1d050 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
1d060 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66  * is called.  If
1d070 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20   iColumn<0 then 
1d080 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
1d090 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20  d that extracts 
1d0a0 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  the rowid..*/.in
1d0b0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
1d0c0 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  eGetColumn(.  Pa
1d0d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
1d0e0 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1d0f0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1d100 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
1d110 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
1d120 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1d130 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
1d140 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
1d150 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
1d160 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1d170 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
1d180 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1d190 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1d1a0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
1d1b0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1d1c0 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f  t iReg,        /
1d1d0 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
1d1e0 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20  here */.  u8 p5 
1d1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35             /* P5
1d200 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f   value for OP_Co
1d210 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a  lumn + FLAGS */.
1d220 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1d230 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1d240 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1d250 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
1d260 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1d270 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1d280 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1d290 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  he; i++, p++){. 
1d2a0 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65     if( p->iTable
1d2b0 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69  ==iTable && p->i
1d2c0 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
1d2d0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  ){.      p->lru 
1d2e0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1d2f0 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Cnt++;.      sql
1d300 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
1d310 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
1d320 20 70 2d 3e 69 52 65 67 29 3b 0a 23 69 66 64 65   p->iReg);.#ifde
1d330 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 43  f SQLITE_DEBUG_C
1d340 4f 4c 55 4d 4e 43 41 43 48 45 0a 20 20 20 20 20  OLUMNCACHE.     
1d350 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d360 70 33 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 54  p3(v, OP_VerifyT
1d370 61 62 43 6f 6c 2c 20 69 54 61 62 6c 65 2c 20 69  abCol, iTable, i
1d380 43 6f 6c 75 6d 6e 2c 20 70 2d 3e 69 52 65 67 29  Column, p->iReg)
1d390 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
1d3a0 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20  eturn p->iReg;. 
1d3b0 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73     }.  }  .  ass
1d3c0 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
1d3d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1d3e0 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
1d3f0 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20  , pTab, iTable, 
1d400 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
1d410 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20    if( p5 ){.    
1d420 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1d430 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65  eP5(v, p5);.  }e
1d440 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69  lse{   .    sqli
1d450 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1d460 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65  e(pParse, iTable
1d470 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
1d480 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1d490 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  Reg;.}.void sqli
1d4a0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1d4b0 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61 72  lumnToReg(.  Par
1d4c0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
1d4d0 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1d4e0 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1d4f0 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1d500 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
1d510 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1d520 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
1d530 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
1d540 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
1d550 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1d560 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
1d570 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1d580 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1d590 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
1d5a0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1d5b0 20 69 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a   iReg         /*
1d5c0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
1d5d0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1d5e0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1d5f0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
1d600 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c  arse, pTab, iCol
1d610 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52 65  umn, iTable, iRe
1d620 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31 21  g, 0);.  if( r1!
1d630 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65 33 56  =iReg ) sqlite3V
1d640 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
1d650 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
1d660 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a  y, r1, iReg);.}.
1d670 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c  ../*.** Clear al
1d680 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65  l column cache e
1d690 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ntries..*/.void 
1d6a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1d6b0 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61  Clear(Parse *pPa
1d6c0 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  rse){.  int i;..
1d6d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1d6e0 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
1d6f0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1d700 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1d710 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
1d720 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20  f("CLEAR\n");.  
1d730 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  }.#endif.  for(i
1d740 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  =0; i<pParse->nC
1d750 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20  olCache; i++){. 
1d760 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
1d770 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d 70  ColCache[i].temp
1d780 52 65 67 0a 20 20 20 20 20 26 26 20 70 50 61 72  Reg.     && pPar
1d790 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
1d7a0 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
1d7b0 54 65 6d 70 52 65 67 29 0a 20 20 20 20 29 7b 0a  TempReg).    ){.
1d7c0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
1d7d0 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
1d7e0 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 50  nTempReg++] = pP
1d7f0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1d800 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  i].iReg;.    }. 
1d810 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f   }.  pParse->nCo
1d820 6c 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  lCache = 0;.}../
1d830 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20  *.** Record the 
1d840 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66 66  fact that an aff
1d850 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73  inity change has
1d860 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f   occurred on iCo
1d870 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  unt.** registers
1d880 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69   starting with i
1d890 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Start..*/.void s
1d8a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
1d8b0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61  ffinityChange(Pa
1d8c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1d8d0 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f   iStart, int iCo
1d8e0 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45  unt){.  sqlite3E
1d8f0 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1d900 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69  Parse, iStart, i
1d910 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Count);.}../*.**
1d920 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1d930 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66  o move content f
1d940 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46  rom registers iF
1d950 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67  rom...iFrom+nReg
1d960 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54  -1.** over to iT
1d970 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b  o..iTo+nReg-1. K
1d980 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  eep the column c
1d990 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e  ache up-to-date.
1d9a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d9b0 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72  ExprCodeMove(Par
1d9c0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1d9d0 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20  iFrom, int iTo, 
1d9e0 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73  int nReg){.  ass
1d9f0 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b  ert( iFrom>=iTo+
1da00 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52  nReg || iFrom+nR
1da10 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c  eg<=iTo );.  sql
1da20 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1da30 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1da40 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54  _Move, iFrom, iT
1da50 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69  o, nReg);.  sqli
1da60 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
1da70 76 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f 6d  ve(pParse, iFrom
1da80 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20  , nReg);.}..#if 
1da90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1daa0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1dab0 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45  (SQLITE_COVERAGE
1dac0 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
1dad0 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
1dae0 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
1daf0 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f  range iFrom..iTo
1db00 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20   (inclusive).** 
1db10 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
1db20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  of the column ca
1db30 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
1db40 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1db50 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1db60 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d  and testcase() m
1db70 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e  acros only.** an
1db80 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  d does not appea
1db90 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75  r in a normal bu
1dba0 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ild..*/.static i
1dbb0 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  nt usedAsColumnC
1dbc0 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
1dbd0 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
1dbe0 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69  nt iTo){.  int i
1dbf0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
1dc00 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
1dc10 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1dc20 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
1dc30 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
1dc40 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
1dc50 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   r = p->iReg;.  
1dc60 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26    if( r>=iFrom &
1dc70 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72  & r<=iTo ) retur
1dc80 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53  n 1;    /*NO_TES
1dc90 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  T*/.  }.  return
1dca0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1dcb0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20  SQLITE_DEBUG || 
1dcc0 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
1dcd0 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  TEST */.../*.** 
1dce0 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61 72  Convert a scalar
1dcf0 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
1dd00 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45   to a TK_REGISTE
1dd10 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a  R referencing.**
1dd20 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20   register iReg. 
1dd30 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
1dd40 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 52 65   ensure that iRe
1dd50 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  g already contai
1dd60 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ns.** the correc
1dd70 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
1dd80 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73  expression..*/.s
1dd90 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 54  tatic void exprT
1dda0 6f 52 65 67 69 73 74 65 72 28 45 78 70 72 20 2a  oRegister(Expr *
1ddb0 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  p, int iReg){.  
1ddc0 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a  p->op2 = p->op;.
1ddd0 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47    p->op = TK_REG
1dde0 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62  ISTER;.  p->iTab
1ddf0 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70  le = iReg;.  Exp
1de00 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70  rClearProperty(p
1de10 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f  , EP_Skip);.}../
1de20 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61 6e  *.** Evaluate an
1de30 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69 74   expression (eit
1de40 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72 20  her a vector or 
1de50 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
1de60 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a  ion) and store.*
1de70 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  * the result in 
1de80 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d 70  continguous temp
1de90 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 2e  orary registers.
1dea0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
1deb0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72  ex of.** the fir
1dec0 73 74 20 72 65 67 69 73 74 65 72 20 75 73 65 64  st register used
1ded0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
1dee0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sult..**.** If t
1def0 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75  he returned resu
1df00 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 61  lt register is a
1df10 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c 61   temporary scala
1df20 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69  r, then also wri
1df30 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69 73  te.** that regis
1df40 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  ter number into 
1df50 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49 66  *piFreeable.  If
1df60 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65   the returned re
1df70 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a 2a  sult register.**
1df80 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
1df90 61 72 79 20 6f 72 20 69 66 20 74 68 65 20 65 78  ary or if the ex
1dfa0 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 65  pression is a ve
1dfb0 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65 65  ctor set *piFree
1dfc0 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f  able.** to 0..*/
1dfd0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
1dfe0 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73 65  CodeVector(Parse
1dff0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1e000 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61 62  p, int *piFreeab
1e010 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73 75  le){.  int iResu
1e020 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c  lt;.  int nResul
1e030 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  t = sqlite3ExprV
1e040 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20  ectorSize(p);.  
1e050 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29  if( nResult==1 )
1e060 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20  {.    iResult = 
1e070 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e080 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  emp(pParse, p, p
1e090 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65  iFreeable);.  }e
1e0a0 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65 65  lse{.    *piFree
1e0b0 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  able = 0;.    if
1e0c0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ( p->op==TK_SELE
1e0d0 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  CT ){.#if SQLITE
1e0e0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1e0f0 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 30       iResult = 0
1e100 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 52  ;.#else.      iR
1e110 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 43  esult = sqlite3C
1e120 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
1e130 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a 23  rse, p, 0, 0);.#
1e140 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
1e150 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1e160 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70 50      iResult = pP
1e170 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
1e180 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1e190 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20 20   += nResult;.   
1e1a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
1e1b0 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  esult; i++){.   
1e1c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e1d0 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70  CodeFactorable(p
1e1e0 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69 73  Parse, p->x.pLis
1e1f0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
1e200 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  +iResult);.     
1e210 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1e220 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a 7d  eturn iResult;.}
1e230 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1e240 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
1e250 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
1e260 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
1e270 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
1e280 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  .  Attempt to st
1e290 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1e2a0 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72  in register "tar
1e2b0 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  get"..** Return 
1e2c0 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  the register whe
1e2d0 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  re results are s
1e2e0 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  tored..**.** Wit
1e2f0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  h this routine, 
1e300 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72  there is no guar
1e310 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c  antee that resul
1e320 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74  ts will.** be st
1e330 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20  ored in target. 
1e340 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68   The result migh
1e350 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73  t be stored in s
1e360 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67  ome other.** reg
1e370 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63  ister if it is c
1e380 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20  onvenient to do 
1e390 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  so.  The calling
1e3a0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
1e3b0 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
1e3c0 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65  rn code and move
1e3d0 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
1e3e0 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72  the desired.** r
1e3f0 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
1e400 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e410 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61  arget(Parse *pPa
1e420 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1e430 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1e440 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1e450 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68  e->pVdbe;  /* Th
1e460 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e VM under const
1e470 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
1e480 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1e490 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
1e4a0 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
1e4b0 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20   */.  int inReg 
1e4c0 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20  = target;       
1e4d0 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65  /* Results store
1e4e0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e  d in register in
1e4f0 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  Reg */.  int reg
1e500 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20  Free1 = 0;      
1e510 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
1e520 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
1e530 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
1e540 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  /.  int regFree2
1e550 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1e560 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
1e570 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
1e580 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
1e590 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20 20  nt r1, r2;      
1e5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69           /* Vari
1e5b0 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ous register num
1e5c0 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 74  bers */.  Expr t
1e5d0 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  empX;           
1e5e0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
1e5f0 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
1e600 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20 30   */.  int p5 = 0
1e610 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
1e620 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
1e630 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
1e640 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
1e650 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1e660 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1e670 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
1e680 6e 20 30 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f 63  n 0;.  }..expr_c
1e690 6f 64 65 5f 64 6f 6f 76 65 72 3a 0a 20 20 69 66  ode_doover:.  if
1e6a0 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
1e6b0 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a    op = TK_NULL;.
1e6c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
1e6d0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d  = pExpr->op;.  }
1e6e0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1e6f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
1e700 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
1e710 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
1e720 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
1e730 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
1e740 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
1e750 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
1e760 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41  ->aCol[pExpr->iA
1e770 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gg];.      if( !
1e780 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
1e790 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
1e7a0 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d  assert( pCol->iM
1e7b0 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  em>0 );.        
1e7c0 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65  return pCol->iMe
1e7d0 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  m;.      }else i
1e7e0 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65  f( pAggInfo->use
1e7f0 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20  SortingIdx ){.  
1e800 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e810 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
1e820 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  lumn, pAggInfo->
1e830 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a  sortingIdxPTab,.
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 43                pC
1e860 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1e870 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
1e880 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e890 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1e8a0 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66   /* Otherwise, f
1e8b0 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
1e8c0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65  e TK_COLUMN case
1e8d0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
1e8e0 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
1e8f0 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d        int iTab =
1e900 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
1e910 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30        if( iTab<0
1e920 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1e930 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1e940 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
1e950 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48  /* Generating CH
1e960 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
1e970 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74  or inserting int
1e980 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  o partial index 
1e990 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
1e9a0 75 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  urn pExpr->iColu
1e9b0 6d 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65  mn - pParse->iSe
1e9c0 6c 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d  lfTab;.        }
1e9d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e9e0 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70  /* Coding an exp
1e9f0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
1ea00 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  part of an index
1ea10 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61   where column na
1ea20 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mes.          **
1ea30 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65   in the index re
1ea40 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65  fer to the table
1ea50 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e   to which the in
1ea60 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  dex belongs */. 
1ea70 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20           iTab = 
1ea80 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1ea90 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   - 1;.        }.
1eaa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1eab0 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
1eac0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
1ead0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61  arse, pExpr->pTa
1eae0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb00 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
1eb10 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a  , iTab, target,.
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1eb40 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20  Expr->op2);.    
1eb50 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
1eb60 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63  TEGER: {.      c
1eb70 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
1eb80 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72  e, pExpr, 0, tar
1eb90 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  get);.      retu
1eba0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1ebb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55  .    case TK_TRU
1ebc0 45 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20 20  EFALSE: {.      
1ebd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ebe0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1ebf0 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74   sqlite3ExprTrut
1ec00 68 56 61 6c 75 65 28 70 45 78 70 72 29 2c 20 74  hValue(pExpr), t
1ec10 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1ec20 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1ec30 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1ec40 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1ec50 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54  POINT.    case T
1ec60 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
1ec70 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1ec80 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1ec90 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1eca0 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
1ecb0 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  v, pExpr->u.zTok
1ecc0 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  en, 0, target);.
1ecd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1ece0 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  get;.    }.#endi
1ecf0 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  f.    case TK_ST
1ed00 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
1ed10 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1ed20 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ed30 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1ed40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
1ed50 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72  oadString(v, tar
1ed60 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  get, pExpr->u.zT
1ed70 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72 65 74  oken);.      ret
1ed80 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1ed90 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
1eda0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
1edb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1edc0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
1edd0 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  get);.      retu
1ede0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1edf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ee00 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
1ee10 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
1ee20 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
1ee30 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
1ee40 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68  har *z;.      ch
1ee50 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20  ar *zBlob;.     
1ee60 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1ee70 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1ee80 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1ee90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1eea0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1eeb0 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d  ]=='x' || pExpr-
1eec0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58  >u.zToken[0]=='X
1eed0 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ' );.      asser
1eee0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1eef0 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  en[1]=='\'' );. 
1ef00 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d       z = &pExpr-
1ef10 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20  >u.zToken[2];.  
1ef20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
1ef30 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a  trlen30(z) - 1;.
1ef40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b        assert( z[
1ef50 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  n]=='\'' );.    
1ef60 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    zBlob = sqlite
1ef70 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74  3HexToBlob(sqlit
1ef80 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20  e3VdbeDb(v), z, 
1ef90 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
1efa0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1efb0 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72  P_Blob, n/2, tar
1efc0 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50  get, 0, zBlob, P
1efd0 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
1efe0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1eff0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1f000 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
1f010 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LE: {.      asse
1f020 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1f030 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1f040 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1f050 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1f060 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a  >u.zToken!=0 );.
1f070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1f080 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
1f090 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
1f0a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f0b0 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70  , OP_Variable, p
1f0c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74  Expr->iColumn, t
1f0d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
1f0e0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1f0f0 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  n[1]!=0 ){.     
1f100 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1f110 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e   = sqlite3VListN
1f120 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d  umToName(pParse-
1f130 3e 70 56 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e  >pVList, pExpr->
1f140 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1f150 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1f160 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f  >u.zToken[0]=='?
1f170 27 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70  ' || strcmp(pExp
1f180 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d  r->u.zToken, z)=
1f190 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
1f1a0 61 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20  arse->pVList[0] 
1f1b0 3d 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65  = 0; /* Indicate
1f1c0 20 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f   VList may no lo
1f1d0 6e 67 65 72 20 62 65 20 65 6e 6c 61 72 67 65 64  nger be enlarged
1f1e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
1f1f0 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
1f200 76 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f  v, (char*)z, P4_
1f210 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
1f220 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1f230 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rget;.    }.    
1f240 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
1f250 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
1f260 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
1f270 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1f280 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
1f290 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
1f2a0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
1f2b0 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
1f2c0 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
1f2d0 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
1f2e0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
1f2f0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1f300 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
1f310 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
1f320 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
1f330 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20  g!=target ){.   
1f340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f350 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
1f360 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
1f370 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  t);.        inRe
1f380 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
1f390 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1f3a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f3b0 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a  P_Cast, target,.
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
1f3e0 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
1f3f0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29  r->u.zToken, 0))
1f400 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f410 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  ( usedAsColumnCa
1f420 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  che(pParse, inRe
1f430 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20  g, inReg) );.   
1f440 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f450 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1f460 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
1f470 20 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   1);.      retur
1f480 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23  n inReg;.    }.#
1f490 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1f4a0 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
1f4b0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1f4c0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
1f4d0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
1f4e0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
1f4f0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35   TK_NE;.      p5
1f500 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
1f510 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d  ;.      /* fall-
1f520 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63  through */.    c
1f530 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
1f540 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
1f550 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
1f560 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
1f570 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
1f580 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
1f590 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
1f5a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1f5b0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1f5c0 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65  ExprIsVector(pLe
1f5d0 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ft) ){.        c
1f5e0 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65  odeVectorCompare
1f5f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1f600 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b  target, op, p5);
1f610 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f620 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f630 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f640 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72  Parse, pLeft, &r
1f650 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1f660 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1f670 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f680 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1f690 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1f6a0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1f6b0 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
1f6c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1f6d0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1f6e0 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
1f6f0 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20  QLITE_STOREP2 | 
1f700 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  p5);.        ass
1f710 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
1f720 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f730 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
1f740 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f750 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Lt);.        ass
1f760 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
1f770 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f780 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
1f790 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f7a0 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Le);.        ass
1f7b0 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
1f7c0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f7d0 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
1f7e0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f7f0 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Gt);.        ass
1f800 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
1f810 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f820 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
1f830 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f840 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Ge);.        ass
1f850 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
1f860 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f870 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65  OP_Eq); VdbeCove
1f880 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f890 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Eq);.        ass
1f8a0 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
1f8b0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f8c0 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ne); VdbeCove
1f8d0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f8e0 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  Ne);.        tes
1f8f0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f900 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
1f910 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1f920 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
1f930 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f940 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  }.    case TK_AN
1f950 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  D:.    case TK_O
1f960 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  R:.    case TK_P
1f970 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LUS:.    case TK
1f980 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20  _STAR:.    case 
1f990 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61  TK_MINUS:.    ca
1f9a0 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63  se TK_REM:.    c
1f9b0 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20  ase TK_BITAND:. 
1f9c0 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
1f9d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  :.    case TK_SL
1f9e0 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ASH:.    case TK
1f9f0 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73  _LSHIFT:.    cas
1fa00 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20  e TK_RSHIFT: .  
1fa10 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
1fa20 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1fa30 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64  ( TK_AND==OP_And
1fa40 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74   );            t
1fa50 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fa60 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
1fa70 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f  ert( TK_OR==OP_O
1fa80 72 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  r );            
1fa90 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1faa0 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  TK_OR );.      a
1fab0 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
1fac0 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20  OP_Add );       
1fad0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1fae0 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20  ==TK_PLUS );.   
1faf0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49     assert( TK_MI
1fb00 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74  NUS==OP_Subtract
1fb10 20 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65   );     testcase
1fb20 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29  ( op==TK_MINUS )
1fb30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fb40 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69  TK_REM==OP_Remai
1fb50 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73  nder );      tes
1fb60 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45  tcase( op==TK_RE
1fb70 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
1fb80 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50  t( TK_BITAND==OP
1fb90 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20  _BitAnd );      
1fba0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1fbb0 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20  _BITAND );.     
1fbc0 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f   assert( TK_BITO
1fbd0 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20  R==OP_BitOr );  
1fbe0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fbf0 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a  op==TK_BITOR );.
1fc00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1fc10 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
1fc20 65 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63  e );       testc
1fc30 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53  ase( op==TK_SLAS
1fc40 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  H );.      asser
1fc50 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
1fc60 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20  _ShiftLeft );   
1fc70 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1fc80 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _LSHIFT );.     
1fc90 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49   assert( TK_RSHI
1fca0 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  FT==OP_ShiftRigh
1fcb0 74 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  t );  testcase( 
1fcc0 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b  op==TK_RSHIFT );
1fcd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1fce0 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e  K_CONCAT==OP_Con
1fcf0 63 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74  cat );      test
1fd00 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e  case( op==TK_CON
1fd10 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  CAT );.      r1 
1fd20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fd30 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1fd40 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1fd50 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1fd60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fd70 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1fd80 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1fd90 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1fda0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fdb0 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c  3(v, op, r2, r1,
1fdc0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1fdd0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1fde0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1fdf0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fe00 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1fe10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1fe20 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
1fe30 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
1fe40 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
1fe50 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1fe60 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20   pLeft );.      
1fe70 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
1fe80 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
1fe90 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
1fea0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1feb0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1fec0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1fed0 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  t;.#ifndef SQLIT
1fee0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1fef0 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73  POINT.      }els
1ff00 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d  e if( pLeft->op=
1ff10 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
1ff20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1ff30 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ff40 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1ff50 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) );.        cod
1ff60 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e  eReal(v, pLeft->
1ff70 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72  u.zToken, 1, tar
1ff80 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  get);.        re
1ff90 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e  turn target;.#en
1ffa0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
1ffb0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f  .        tempX.o
1ffc0 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a  p = TK_INTEGER;.
1ffd0 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c          tempX.fl
1ffe0 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75  ags = EP_IntValu
1fff0 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  e|EP_TokenOnly;.
20000 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e          tempX.u.
20010 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  iValue = 0;.    
20020 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
20030 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
20040 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
20050 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
20060 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
20070 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
20080 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
20090 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
200a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
200b0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
200c0 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61  ract, r2, r1, ta
200d0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74  rget);.        t
200e0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
200f0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
20100 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20110 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
20120 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
20130 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
20140 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
20150 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20  T==OP_BitNot ); 
20160 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
20170 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20  TK_BITNOT );.   
20180 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
20190 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20  T==OP_Not );    
201a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
201b0 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
201c0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
201d0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
201e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
201f0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
20200 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
20210 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
20220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20230 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
20240 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
20250 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20260 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a  ase TK_TRUTH: {.
20270 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65        int isTrue
20280 3b 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20  ;    /* IS TRUE 
20290 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  or IS NOT TRUE *
202a0 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 72  /.      int bNor
202b0 6d 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54 52 55  mal;   /* IS TRU
202c0 45 20 6f 72 20 49 53 20 46 41 4c 53 45 20 2a 2f  E or IS FALSE */
202d0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
202e0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
202f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20300 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
20310 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20320 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
20330 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20  .      isTrue = 
20340 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
20350 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69  Value(pExpr->pRi
20360 67 68 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72  ght);.      bNor
20370 6d 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32  mal = pExpr->op2
20380 3d 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74  ==TK_IS;.      t
20390 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20  estcase( isTrue 
203a0 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20  && bNormal);.   
203b0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
203c0 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29  True && bNormal)
203d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
203e0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
203f0 4f 50 5f 49 73 54 72 75 65 2c 20 72 31 2c 20 69  OP_IsTrue, r1, i
20400 6e 52 65 67 2c 20 21 69 73 54 72 75 65 2c 20 69  nReg, !isTrue, i
20410 73 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29  sTrue ^ bNormal)
20420 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20430 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
20440 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
20450 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
20460 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
20470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
20480 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
20490 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ll );   testcase
204a0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
204b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
204c0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
204d0 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63  NotNull ); testc
204e0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
204f0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
20500 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20510 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
20520 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20530 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
20540 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
20550 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
20560 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
20570 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
20580 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
20590 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
205a0 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
205b0 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
205c0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
205d0 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
205e0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
205f0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
20600 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
20610 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20620 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
20630 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
20640 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
20650 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
20660 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20670 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
20680 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
20690 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f    AggInfo *pInfo
206a0 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
206b0 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
206c0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
206d0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
206e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
206f0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
20700 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20710 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20720 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
20730 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70  regate: %s()", p
20740 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
20750 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20760 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e        return pIn
20770 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
20780 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20  >iAgg].iMem;.   
20790 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
207a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
207b0 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
207c0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
207d0 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20  pFarg;       /* 
207e0 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e  List of function
207f0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
20800 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20      int nFarg;  
20810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20820 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e  mber of function
20830 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
20840 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
20850 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  f;         /* Th
20860 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  e function defin
20870 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ition object */.
20880 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
20890 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
208a0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
208b0 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63  e */.      u32 c
208c0 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
208d0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
208e0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
208f0 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
20900 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
20910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20920 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20930 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  r */.      sqlit
20940 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
20950 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  >db;  /* The dat
20960 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
20970 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63   */.      u8 enc
20980 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20   = ENC(db);     
20990 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63   /* The text enc
209a0 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  oding used by th
209b0 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
209c0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
209d0 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41  oll = 0;    /* A
209e0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
209f0 6e 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  nce */..#ifndef 
20a00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
20a10 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28  OWFUNC.      if(
20a20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
20a30 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
20a40 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
20a50 29 20 26 26 20 70 45 78 70 72 2d 3e 70 57 69 6e  ) && pExpr->pWin
20a60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
20a70 72 6e 20 70 45 78 70 72 2d 3e 70 57 69 6e 2d 3e  rn pExpr->pWin->
20a80 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 20  regResult;.     
20a90 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
20aa0 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
20ab0 4f 6b 28 70 50 61 72 73 65 29 20 26 26 20 73 71  Ok(pParse) && sq
20ac0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
20ad0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
20ae0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
20af0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  SQL functions ca
20b00 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20  n be expensive. 
20b10 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63  So try to move c
20b20 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e  onstant function
20b30 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  s.        ** out
20b40 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
20b50 6f 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  op, even if that
20b60 20 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20   means an extra 
20b70 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20  OP_Copy. */.    
20b80 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
20b90 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
20ba0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
20bb0 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
20bc0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
20bd0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
20be0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
20bf0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
20c00 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
20c10 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
20c20 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
20c30 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
20c40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
20c50 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
20c60 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
20c70 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72      nFarg = pFar
20c80 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72  g ? pFarg->nExpr
20c90 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   : 0;.      asse
20ca0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
20cb0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
20cc0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
20cd0 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75    zId = pExpr->u
20ce0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70  .zToken;.      p
20cf0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
20d00 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
20d10 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  d, nFarg, enc, 0
20d20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
20d30 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f  _ENABLE_UNKNOWN_
20d40 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20  SQL_FUNCTION.   
20d50 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26     if( pDef==0 &
20d60 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  & pParse->explai
20d70 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  n ){.        pDe
20d80 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
20d90 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b  unction(db, "unk
20da0 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e  nown", nFarg, en
20db0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  c, 0);.      }.#
20dc0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
20dd0 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d  pDef==0 || pDef-
20de0 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
20df0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20e00 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20e10 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69   "unknown functi
20e20 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b  on: %s()", zId);
20e30 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
20e40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
20e50 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65  * Attempt a dire
20e60 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ct implementatio
20e70 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  n of the built-i
20e80 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64  n COALESCE() and
20e90 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c  .      ** IFNULL
20ea0 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  () functions.  T
20eb0 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63  his avoids unnec
20ec0 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f  essary evaluatio
20ed0 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72  n of.      ** ar
20ee0 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65  guments past the
20ef0 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20   first non-NULL 
20f00 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
20f10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
20f20 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
20f30 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45  QLITE_FUNC_COALE
20f40 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  SCE ){.        i
20f50 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d  nt endCoalesce =
20f60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
20f70 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
20f80 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
20f90 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =2 );.        sq
20fa0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
20fb0 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
20fc0 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
20fd0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
20fe0 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  1; i<nFarg; i++)
20ff0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
21000 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21010 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72   OP_NotNull, tar
21020 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  get, endCoalesce
21030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
21040 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
21050 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21060 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
21070 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31  Parse, target, 1
21080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
21090 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
210a0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
210b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
210c0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
210d0 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  rg->a[i].pExpr, 
210e0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
210f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
21100 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
21110 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21120 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
21130 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
21140 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
21150 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
21160 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  }..      /* The 
21170 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74  UNLIKELY() funct
21180 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
21190 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
211a0 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
211b0 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61  * of the first a
211c0 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
211d0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
211e0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
211f0 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45  LITE_FUNC_UNLIKE
21200 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  LY ){.        as
21210 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29  sert( nFarg>=1 )
21220 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21230 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21240 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
21250 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
21260 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
21270 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
21280 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a  E_DEBUG.      /*
21290 20 54 68 65 20 41 46 46 49 4e 49 54 59 28 29 20   The AFFINITY() 
212a0 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74  function evaluat
212b0 65 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  es to a string t
212c0 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 20 20  hat describes.  
212d0 20 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20      ** the type 
212e0 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
212f0 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20  argument.  This 
21300 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
21310 69 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ing of.      ** 
21320 74 68 65 20 53 51 4c 69 74 65 20 74 79 70 65 20  the SQLite type 
21330 6c 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  logic..      */.
21340 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
21350 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
21360 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59  TE_FUNC_AFFINITY
21370 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
21380 74 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20  t char *azAff[] 
21390 3d 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78  = { "blob", "tex
213a0 74 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22  t", "numeric", "
213b0 69 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22  integer", "real"
213c0 20 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   };.        char
213d0 20 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73   aff;.        as
213e0 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
213f0 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20  ;.        aff = 
21400 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
21410 69 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  ity(pFarg->a[0].
21420 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
21430 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
21440 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
21450 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21470 61 66 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d  aff ? azAff[aff-
21480 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d  SQLITE_AFF_BLOB]
21490 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20   : "none");.    
214a0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
214b0 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  t;.      }.#endi
214c0 66 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  f..      for(i=0
214d0 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
214e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33  .        if( i<3
214f0 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  2 && sqlite3Expr
21500 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67  IsConstant(pFarg
21510 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
21520 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
21530 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20  ase( i==31 );.  
21540 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
21550 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69  k |= MASKBIT32(i
21560 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
21570 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
21580 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
21590 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
215a0 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29  )!=0 && !pColl )
215b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
215c0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
215d0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
215e0 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
215f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
21600 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
21610 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
21620 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b  if( constMask ){
21630 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
21640 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
21650 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
21660 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b  ->nMem += nFarg;
21670 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
21680 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73            r1 = s
21690 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
216a0 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67  ge(pParse, nFarg
216b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
216c0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e        /* For len
216d0 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66  gth() and typeof
216e0 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74  () functions wit
216f0 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d  h a column argum
21700 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ent,.        ** 
21710 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d  set the P5 param
21720 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43  eter to the OP_C
21730 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20  olumn opcode to 
21740 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
21750 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f  .        ** or O
21760 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
21770 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f  respectively, to
21780 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
21790 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20  ry data.        
217a0 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20  ** loading..    
217b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
217c0 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
217d0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55  ags & (SQLITE_FU
217e0 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45  NC_LENGTH|SQLITE
217f0 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d  _FUNC_TYPEOF))!=
21800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
21810 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20  8 exprOp;.      
21820 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
21830 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
21840 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d    assert( pFarg-
21850 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
21860 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72  ;.          expr
21870 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  Op = pFarg->a[0]
21880 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20  .pExpr->op;.    
21890 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70        if( exprOp
218a0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65  ==TK_COLUMN || e
218b0 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  xprOp==TK_AGG_CO
218c0 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
218d0 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
218e0 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d  TE_FUNC_LENGTH==
218f0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
21900 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
21910 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
21920 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c  UNC_TYPEOF==OPFL
21930 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a  AG_TYPEOFARG );.
21940 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
21950 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63  case( pDef->func
21960 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c  Flags & OPFLAG_L
21970 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
21980 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61          pFarg->a
21990 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d  [0].pExpr->op2 =
219a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
219b0 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c      pDef->funcFl
219c0 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45  ags & (OPFLAG_LE
219d0 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54  NGTHARG|OPFLAG_T
219e0 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20  YPEOFARG);.     
219f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21a00 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
21a10 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
21a20 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54  Parse);     /* T
21a30 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
21a40 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  be */.        sq
21a50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
21a60 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
21a70 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20  arg, r1, 0,.    
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a90 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
21aa0 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
21ab0 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b  TE_ECEL_FACTOR);
21ac0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21ad0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
21ae0 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69  rse);      /* Ti
21af0 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
21b00 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  e */.      }else
21b10 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30  {.        r1 = 0
21b20 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
21b30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
21b40 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
21b50 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
21b60 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
21b70 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
21b80 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
21b90 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
21ba0 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
21bb0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
21bc0 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
21bd0 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
21be0 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
21bf0 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
21c00 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
21c10 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
21c20 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
21c30 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
21c40 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
21c50 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
21c60 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
21c70 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
21c80 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
21c90 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
21ca0 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
21cb0 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
21cc0 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
21cd0 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
21ce0 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
21cf0 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
21d00 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
21d10 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
21d20 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
21d30 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
21d40 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
21d50 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
21d60 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
21d70 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
21d80 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
21d90 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
21da0 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
21db0 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
21dc0 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
21dd0 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
21de0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
21df0 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70  Farg>=2 && (pExp
21e00 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
21e10 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
21e20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
21e30 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
21e40 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
21e50 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
21e60 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
21e70 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72    }else if( nFar
21e80 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
21e90 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
21ea0 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
21eb0 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
21ec0 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  g, pFarg->a[0].p
21ed0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
21ee0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
21ef0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
21f00 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
21f10 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
21f20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
21f30 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
21f40 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
21f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
21f60 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
21f70 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
21f80 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
21f90 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  EQ);.      }.#if
21fa0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
21fb0 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e  E_OFFSET_SQL_FUN
21fc0 43 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  C.      if( pDef
21fd0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
21fe0 4c 49 54 45 5f 46 55 4e 43 5f 4f 46 46 53 45 54  LITE_FUNC_OFFSET
21ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
22000 20 2a 70 41 72 67 20 3d 20 70 46 61 72 67 2d 3e   *pArg = pFarg->
22010 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
22020 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 6f 70      if( pArg->op
22030 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
22040 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22050 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
22060 5f 4f 66 66 73 65 74 2c 20 70 41 72 67 2d 3e 69  _Offset, pArg->i
22070 54 61 62 6c 65 2c 20 70 41 72 67 2d 3e 69 43 6f  Table, pArg->iCo
22080 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
22090 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
220a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
220b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
220c0 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
220d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
220e0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
220f0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73       {.        s
22100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
22110 28 76 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  (v, pParse->iSel
22120 66 54 61 62 20 3f 20 4f 50 5f 50 75 72 65 46 75  fTab ? OP_PureFu
22130 6e 63 30 20 3a 20 4f 50 5f 46 75 6e 63 74 69 6f  nc0 : OP_Functio
22140 6e 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n0,.            
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
22160 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72  nstMask, r1, tar
22170 67 65 74 2c 20 28 63 68 61 72 2a 29 70 44 65 66  get, (char*)pDef
22180 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
22190 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
221a0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
221b0 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  8)nFarg);.      
221c0 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  }.      if( nFar
221d0 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d  g && constMask==
221e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
221f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
22200 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
22210 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d   nFarg);.      }
22220 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
22230 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rget;.    }.#ifn
22240 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22250 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
22260 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
22270 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
22280 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f   {.      int nCo
22290 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  l;.      testcas
222a0 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  e( op==TK_EXISTS
222b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
222c0 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  se( op==TK_SELEC
222d0 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  T );.      if( o
222e0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p==TK_SELECT && 
222f0 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78  (nCol = pExpr->x
22300 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
22310 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20  ->nExpr)!=1 ){. 
22320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75         sqlite3Su
22330 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  bselectError(pPa
22340 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20  rse, nCol, 1);. 
22350 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22360 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
22370 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
22380 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
22390 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
223a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
223b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
223c0 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  ECT_COLUMN: {.  
223d0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
223e0 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
223f0 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  t->iTable==0 ){.
22400 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
22410 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73  Left->iTable = s
22420 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
22430 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
22440 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b  r->pLeft, 0, 0);
22450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
22460 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
22470 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
22480 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
22490 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
224a0 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
224b0 65 0a 20 20 20 20 20 20 20 26 26 20 70 45 78 70  e.       && pExp
224c0 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20  r->iTable!=(n = 
224d0 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
224e0 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65  rSize(pExpr->pLe
224f0 66 74 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  ft)) .      ){. 
22500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
22510 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
22520 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67  %d columns assig
22530 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a  ned %d values",.
22540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22560 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e  pExpr->iTable, n
22570 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22580 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
22590 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70  Left->iTable + p
225a0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
225b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
225c0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
225d0 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
225e0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
225f0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
22600 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
22610 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
22620 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
22630 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22640 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
22650 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
22660 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
22670 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
22680 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
22690 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
226a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
226b0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
226c0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
226d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
226e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
226f0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
22700 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22710 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
22720 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20   target, 0);.   
22730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
22740 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
22750 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
22760 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
22770 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
22780 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
22790 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
227a0 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
227b0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
227c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
227d0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
227e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
227f0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
22800 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
22810 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
22820 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
22830 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
22840 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
22850 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
22860 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
22870 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
22880 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
22890 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
228a0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65  TWEEN: {.      e
228b0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
228c0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
228d0 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rget, 0, 0);.   
228e0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
228f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
22900 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61   TK_SPAN:.    ca
22910 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a  se TK_COLLATE: .
22920 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
22930 53 3a 20 7b 0a 20 20 20 20 20 20 70 45 78 70 72  S: {.      pExpr
22940 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
22950 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 70 72  .      goto expr
22960 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3b 20 2f 2a  _code_doover; /*
22970 20 32 30 31 38 2d 30 34 2d 32 38 3a 20 50 72 65   2018-04-28: Pre
22980 76 65 6e 74 20 64 65 65 70 20 72 65 63 75 72 73  vent deep recurs
22990 69 6f 6e 2e 20 4f 53 53 46 75 7a 7a 2e 20 2a 2f  ion. OSSFuzz. */
229a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
229b0 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20   TK_TRIGGER: {. 
229c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
229d0 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47  pcode is TK_TRIG
229e0 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78  GER, then the ex
229f0 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65  pression is a re
22a00 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a  ference.      **
22a10 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   to a column in 
22a20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64  the new.* or old
22a30 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73  .* pseudo-tables
22a40 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20   available to.  
22a50 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70      ** trigger p
22a60 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73  rograms. In this
22a70 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c   case Expr.iTabl
22a80 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f  e is set to 1 fo
22a90 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  r the.      ** n
22aa0 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
22ab0 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20  e, or 0 for the 
22ac0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
22ad0 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  le. Expr.iColumn
22ae0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
22af0 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f   to the column o
22b00 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  f the pseudo-tab
22b10 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74  le to read, or t
22b20 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a  o -1 to.      **
22b30 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   read the rowid 
22b40 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  field..      **.
22b50 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70        ** The exp
22b60 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65  ression is imple
22b70 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20  mented using an 
22b80 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e  OP_Param opcode.
22b90 20 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a   The p1.      **
22ba0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65   parameter is se
22bb0 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c  t to 0 for an ol
22bc0 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  d.rowid referenc
22bd0 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20  e, or to (i+1). 
22be0 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72       ** to refer
22bf0 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c  ence another col
22c00 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a  umn of the old.*
22c10 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77   pseudo-table, w
22c20 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  here .      ** i
22c30 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
22c40 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72   the column. For
22c50 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66   a new.rowid ref
22c60 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20  erence, p1 is.  
22c70 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e      ** set to (n
22c80 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20  +1), where n is 
22c90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
22ca0 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73  lumns in each ps
22cb0 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20  eudo-table..    
22cc0 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72    ** For a refer
22cd0 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65  ence to any othe
22ce0 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
22cf0 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
22d00 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  le, p1.      ** 
22d10 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69  is set to (n+2+i
22d20 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69  ), where n and i
22d30 20 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20   are as defined 
22d40 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a  previously. For.
22d50 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65        ** example
22d60 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f  , if the table o
22d70 6e 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73  n which triggers
22d80 20 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64   are being fired
22d90 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63   is.      ** dec
22da0 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20  lared as:.      
22db0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52  **.      **   CR
22dc0 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
22dd0 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20   b);.      **.  
22de0 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69      ** Then p1 i
22df0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
22e00 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
22e10 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  **.      **   p1
22e20 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==0   ->    old.
22e30 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20  rowid     p1==3 
22e40 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69    ->    new.rowi
22e50 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  d.      **   p1=
22e60 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61  =1   ->    old.a
22e70 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20           p1==4  
22e80 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20   ->    new.a.   
22e90 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20     **   p1==2   
22ea0 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20  ->    old.b     
22eb0 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20      p1==5   ->  
22ec0 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20    new.b       . 
22ed0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
22ee0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70  ble *pTab = pExp
22ef0 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  r->pTab;.      i
22f00 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69  nt p1 = pExpr->i
22f10 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e  Table * (pTab->n
22f20 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78  Col+1) + 1 + pEx
22f30 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20  pr->iColumn;..  
22f40 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
22f50 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  r->iTable==0 || 
22f60 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31  pExpr->iTable==1
22f70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
22f80 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
22f90 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69  >=-1 && pExpr->i
22fa0 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f  Column<pTab->nCo
22fb0 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
22fc0 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  t( pTab->iPKey<0
22fd0 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   || pExpr->iColu
22fe0 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  mn!=pTab->iPKey 
22ff0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23000 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54   p1>=0 && p1<(pT
23010 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b  ab->nCol*2+2) );
23020 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
23030 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23040 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65  Param, p1, targe
23050 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
23060 6d 6d 65 6e 74 28 28 76 2c 20 22 72 5b 25 64 5d  mment((v, "r[%d]
23070 3d 25 73 2e 25 73 22 2c 20 74 61 72 67 65 74 2c  =%s.%s", target,
23080 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
23090 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20  >iTable ? "new" 
230a0 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20  : "old"),.      
230b0 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d    (pExpr->iColum
230c0 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n<0 ? "rowid" : 
230d0 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f  pExpr->pTab->aCo
230e0 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
230f0 5d 2e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 29  ].zName).      )
23100 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
23110 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
23120 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20  _POINT.      /* 
23130 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  If the column ha
23140 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c  s REAL affinity,
23150 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c   it may currentl
23160 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
23170 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  n.      ** integ
23180 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41  er. Use OP_RealA
23190 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  ffinity to make 
231a0 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c  sure it is reall
231b0 79 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a  y real..      **
231c0 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
231d0 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35  CE-OF: R-60985-5
231e0 37 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c  7662 SQLite will
231f0 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c   convert the val
23200 75 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20  ue back to.     
23210 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69   ** floating poi
23220 6e 74 20 77 68 65 6e 20 65 78 74 72 61 63 74 69  nt when extracti
23230 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72  ng it from the r
23240 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20  ecord.  */.     
23250 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
23260 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26  umn>=0 .       &
23270 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  & pTab->aCol[pEx
23280 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  pr->iColumn].aff
23290 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
232a0 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a  F_REAL.      ){.
232b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
232c0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
232d0 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61  RealAffinity, ta
232e0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  rget);.      }.#
232f0 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
23300 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
23310 73 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a  se TK_VECTOR: {.
23320 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
23330 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
23340 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
23350 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
23360 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
23370 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a   TK_IF_NULL_ROW:
23380 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
23390 72 49 4e 52 3b 0a 20 20 20 20 20 20 61 64 64 72  rINR;.      addr
233a0 49 4e 52 20 3d 20 73 71 6c 69 74 65 33 56 64 62  INR = sqlite3Vdb
233b0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
233c0 4e 75 6c 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e  NullRow, pExpr->
233d0 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73  iTable);.      s
233e0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
233f0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
23400 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
23410 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
23420 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
23430 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
23440 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23450 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
23460 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23470 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
23480 61 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20  addrINR);.      
23490 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
234a0 65 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20  eP3(v, addrINR, 
234b0 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
234c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
234d0 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
234e0 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
234f0 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
23500 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
23510 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
23520 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
23530 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
23540 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
23550 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
23560 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
23570 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
23580 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
23590 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
235a0 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
235b0 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
235c0 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
235d0 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
235e0 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
235f0 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
23600 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
23610 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
23620 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
23630 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
23640 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
23650 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
23660 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
23670 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
23680 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73   Y is in the las
23690 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78  t element of pEx
236a0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70  pr->x.pList if p
236b0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
236c0 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f  Expr is.    ** o
236d0 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  dd.  The Y is al
236e0 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
236f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
23700 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69  lements in x.pLi
23710 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65  st.    ** is eve
23720 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69  n, then Y is omi
23730 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74  tted and the "ot
23740 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20  herwise" result 
23750 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  is NULL..    ** 
23760 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  Ei is in pExpr->
23770 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e  pList->a[i*2] an
23780 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70  d Ri is pExpr->p
23790 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a  List->a[i*2+1]..
237a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
237b0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
237c0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
237d0 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72  e Ri for the fir
237e0 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a  st matching Ei,.
237f0 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65      ** or if the
23800 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e  re is no matchin
23810 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74  g Ei, the ELSE t
23820 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65  erm Y, or if the
23830 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20  re is.    ** no 
23840 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e  ELSE term, NULL.
23850 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
23860 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
23870 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20  =TK_CASE ); {.  
23880 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c      int endLabel
23890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
238a0 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
238b0 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43  bel for end of C
238c0 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20  ASE stmt */.    
238d0 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20    int nextCase; 
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238f0 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
23900 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20  l for next WHEN 
23910 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
23920 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20  int nExpr;      
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23940 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f    /* 2x number o
23950 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
23960 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23980 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
23990 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
239a0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
239b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
239c0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48     /* List of WH
239d0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
239e0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
239f0 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
23a00 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
23a10 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
23a20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61      Expr opCompa
23a30 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
23a40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d        /* The X==
23a50 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  Ei expression */
23a60 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23a90 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
23aa0 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
23ab0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
23ac0 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
23ad0 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
23ae0 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
23af0 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  .      VVA_ONLY(
23b00 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c   int iCacheLevel
23b10 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
23b20 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20  eLevel; )..     
23b30 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
23b40 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
23b50 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
23b60 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
23b70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
23b80 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
23b90 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
23ba0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
23bb0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
23bc0 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
23bd0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
23be0 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
23bf0 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
23c00 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
23c10 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
23c20 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
23c30 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
23c40 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70   ){.        temp
23c50 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  X = *pX;.       
23c60 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f   testcase( pX->o
23c70 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
23c80 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65          exprToRe
23c90 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65  gister(&tempX, e
23ca0 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
23cb0 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72  arse, &tempX, &r
23cc0 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20  egFree1));.     
23cd0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
23ce0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
23cf0 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f      memset(&opCo
23d00 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mpare, 0, sizeof
23d10 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20  (opCompare));.  
23d20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
23d30 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20  op = TK_EQ;.    
23d40 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c      opCompare.pL
23d50 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20  eft = &tempX;.  
23d60 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f        pTest = &o
23d70 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  pCompare;.      
23d80 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31    /* Ticket b351
23d90 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39  d95f9cd5ef17e9d9
23da0 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39  dbae18f5ca861119
23db0 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a  0001:.        **
23dc0 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   The value in re
23dd0 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74  gFree1 might get
23de0 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74   SCopy-ed into t
23df0 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a  he file result..
23e00 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61          ** So ma
23e10 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
23e20 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74   regFree1 regist
23e30 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64  er is not reused
23e40 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20   for other.     
23e50 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61     ** purposes a
23e60 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72  nd possibly over
23e70 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
23e80 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20       regFree1 = 
23e90 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
23ea0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
23eb0 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  r-1; i=i+2){.   
23ec0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23ed0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
23ee0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
23ef0 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  X ){.          a
23f00 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20  ssert( pTest!=0 
23f10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43  );.          opC
23f20 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20  ompare.pRight = 
23f30 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
23f40 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pr;.        }els
23f50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e{.          pTe
23f60 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  st = aListelem[i
23f70 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
23f80 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43   }.        nextC
23f90 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
23fa0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
23fb0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
23fc0 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pTest->op==TK_C
23fd0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
23fe0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
23ff0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73  lse(pParse, pTes
24000 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c  t, nextCase, SQL
24010 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
24020 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
24030 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e( aListelem[i+1
24040 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
24050 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
24060 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24070 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
24080 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20  lem[i+1].pExpr, 
24090 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
240a0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
240b0 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
240c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
240d0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
240e0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
240f0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
24100 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29  bel(v, nextCase)
24110 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24120 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30  if( (nExpr&1)!=0
24130 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24140 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
24150 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
24160 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24170 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
24180 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78  ->a[nExpr-1].pEx
24190 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
241a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
241b0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
241c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
241d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
241e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
241f0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
24200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
24210 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
24220 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24230 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
24240 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0 .           ||
24250 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
24260 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65  evel==iCacheLeve
24270 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
24280 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
24290 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  el(v, endLabel);
242a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
242b0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
242c0 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
242d0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53      case TK_RAIS
242e0 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
242f0 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  t( pExpr->affini
24300 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  ty==OE_Rollback 
24310 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
24320 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
24330 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20  OE_Abort.       
24340 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
24350 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a  finity==OE_Fail.
24360 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
24370 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
24380 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29  E_Ignore.      )
24390 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
243a0 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
243b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
243c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
243d0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
243e0 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
243f0 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
24400 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
24410 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
24420 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24430 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
24440 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
24450 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  nity==OE_Abort )
24460 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24470 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
24480 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24490 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
244a0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
244b0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
244c0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
244d0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
244e0 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
244f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24500 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  p4(.            
24510 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
24520 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65  TE_OK, OE_Ignore
24530 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
24540 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20  oken,0);.       
24550 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
24560 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
24570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
24580 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
24590 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rse, SQLITE_CONS
245a0 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a  TRAINT_TRIGGER,.
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
245d0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70  xpr->affinity, p
245e0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
245f0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  0, 0);.      }..
24600 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24610 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
24620 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
24630 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
24640 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
24650 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
24660 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
24670 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52  2);.  return inR
24680 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63  eg;.}../*.** Fac
24690 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65  tor out the code
246a0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
246b0 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74  pression to init
246c0 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
246d0 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73  .**.** If regDes
246e0 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65  t>=0 then the re
246f0 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73  sult is always s
24700 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20 72 65  tored in that re
24710 67 69 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a  gister and the.*
24720 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20  * result is not 
24730 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65  reusable.  If re
24740 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69  gDest<0 then thi
24750 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65  s routine is fre
24760 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74  e to .** store t
24770 68 65 20 76 61 6c 75 65 20 77 68 65 72 65 65 76  he value whereev
24780 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68  er it wants.  Th
24790 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
247a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
247b0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73  .** is stored is
247c0 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e   returned.  When
247d0 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20   regDest<0, two 
247e0 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73  identical expres
247f0 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f  sions will.** co
24800 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72  de to the same r
24810 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
24820 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
24830 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a  tInit(.  Parse *
24840 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
24850 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
24860 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
24870 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
24880 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77  ession to code w
24890 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69  hen the VDBE ini
248a0 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e  tializes */.  in
248b0 74 20 72 65 67 44 65 73 74 20 20 20 20 20 20 20  t regDest       
248c0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c  /* Store the val
248d0 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
248e0 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ter */.){.  Expr
248f0 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72  List *p;.  asser
24900 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  t( ConstFactorOk
24910 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20  (pParse) );.  p 
24920 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  = pParse->pConst
24930 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44  Expr;.  if( regD
24940 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20  est<0 && p ){.  
24950 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
24960 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
24970 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
24980 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d  r(pItem=p->a, i=
24990 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70  p->nExpr; i>0; p
249a0 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20  Item++, i--){.  
249b0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72      if( pItem->r
249c0 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74  eusable && sqlit
249d0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
249e0 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78  pItem->pExpr,pEx
249f0 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  pr,-1)==0 ){.   
24a00 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65       return pIte
24a10 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52  m->u.iConstExprR
24a20 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  eg;.      }.    
24a30 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20  }.  }.  pExpr = 
24a40 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
24a50 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
24a60 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  , 0);.  p = sqli
24a70 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
24a80 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78  d(pParse, p, pEx
24a90 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  pr);.  if( p ){.
24aa0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
24ab0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
24ac0 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70   = &p->a[p->nExp
24ad0 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d  r-1];.     pItem
24ae0 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67  ->reusable = reg
24af0 44 65 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28  Dest<0;.     if(
24b00 20 72 65 67 44 65 73 74 3c 30 20 29 20 72 65 67   regDest<0 ) reg
24b10 44 65 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Dest = ++pParse-
24b20 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65  >nMem;.     pIte
24b30 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52  m->u.iConstExprR
24b40 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20  eg = regDest;.  
24b50 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  }.  pParse->pCon
24b60 73 74 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65  stExpr = p;.  re
24b70 74 75 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a  turn regDest;.}.
24b80 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24b90 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
24ba0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   an expression a
24bb0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
24bc0 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  ults.** into a r
24bd0 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e  egister.  Return
24be0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
24bf0 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72  mber where the r
24c00 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74  esults.** are st
24c10 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
24c20 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61  he register is a
24c30 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
24c40 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20  ter that can be 
24c50 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20  deallocated,.** 
24c60 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e  then write its n
24c70 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67  umber into *pReg
24c80 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
24c90 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
24ca0 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c  .** a temporary,
24cb0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20   then set *pReg 
24cc0 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49  to zero..**.** I
24cd0 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e  f pExpr is a con
24ce0 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  stant, then this
24cf0 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67   routine might g
24d00 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20  enerate this.** 
24d10 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65  code to fill the
24d20 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
24d30 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
24d40 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  section of the.*
24d50 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20  * VDBE program, 
24d60 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74  in order to fact
24d70 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65  or it out of the
24d80 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70   evaluation loop
24d90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24da0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72  ExprCodeTemp(Par
24db0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24dc0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52   *pExpr, int *pR
24dd0 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20  eg){.  int r2;. 
24de0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
24df0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
24e00 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f  pExpr);.  if( Co
24e10 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
24e20 73 65 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d  se).   && pExpr-
24e30 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
24e40 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
24e50 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
24e60 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a  oin(pExpr).  ){.
24e70 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a      *pReg  = 0;.
24e80 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
24e90 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
24ea0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31  Parse, pExpr, -1
24eb0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24ec0 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
24ed0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
24ee0 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c  e);.    r2 = sql
24ef0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
24f00 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
24f10 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72  , r1);.    if( r
24f20 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a  2==r1 ){.      *
24f30 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d  pReg = r1;.    }
24f40 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
24f50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
24f60 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
24f70 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a       *pReg = 0;.
24f80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24f90 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn r2;.}../*.** 
24fa0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
24fb0 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
24fc0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
24fd0 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
24fe0 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
24ff0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
25000 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
25010 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70  guaranteed to ap
25020 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73  pear.** in regis
25030 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76  ter target..*/.v
25040 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
25050 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
25060 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
25070 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
25080 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73  nt inReg;..  ass
25090 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26  ert( target>0 &&
250a0 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d   target<=pParse-
250b0 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70  >nMem );.  if( p
250c0 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f  Expr && pExpr->o
250d0 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
250e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
250f0 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
25100 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20  pVdbe, OP_Copy, 
25110 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74  pExpr->iTable, t
25120 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  arget);.  }else{
25130 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c  .    inReg = sql
25140 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
25150 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
25160 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61  , target);.    a
25170 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
25180 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73  Vdbe!=0 || pPars
25190 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
251a0 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69  led );.    if( i
251b0 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20  nReg!=target && 
251c0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b  pParse->pVdbe ){
251d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
251e0 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
251f0 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
25200 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
25210 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
25220 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e  *.** Make a tran
25230 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78  sient copy of ex
25240 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
25250 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20  nd then code it 
25260 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
25270 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69  ExprCode().  Thi
25280 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
25290 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65  just like sqlite
252a0 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65  3ExprCode().** e
252b0 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 69  xcept that the i
252c0 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20  nput expression 
252d0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
252e0 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   be unchanged..*
252f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
25300 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65  prCodeCopy(Parse
25310 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
25320 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
25330 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t){.  sqlite3 *d
25340 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
25350 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
25360 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
25370 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64  pr, 0);.  if( !d
25380 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
25390 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ) sqlite3ExprCod
253a0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
253b0 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69   target);.  sqli
253c0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
253d0 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
253e0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
253f0 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
25400 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
25410 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
25420 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
25430 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
25440 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
25450 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
25460 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
25470 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
25480 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
25490 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74  n is constant, t
254a0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
254b0 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65  .** might choose
254c0 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70   to code the exp
254d0 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69  ression at initi
254e0 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a  alization time..
254f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
25500 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c  xprCodeFactorabl
25510 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
25520 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
25530 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28  t target){.  if(
25540 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74   pParse->okConst
25550 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65  Factor && sqlite
25560 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
25570 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71  pExpr) ){.    sq
25580 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
25590 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
255a0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65  r, target);.  }e
255b0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
255c0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
255d0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
255e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
255f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
25600 20 65 76 61 6c 75 61 74 65 73 20 74 68 65 20 67   evaluates the g
25610 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
25620 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73  and puts the res
25630 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ult.** in regist
25640 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  er target..**.**
25650 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70   Also make a cop
25660 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
25670 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ion results into
25680 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22   another "cache"
25690 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
256a0 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72   modify the expr
256b0 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  ession so that t
256c0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20  he next time it 
256d0 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a  is evaluated,.**
256e0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
256f0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63   copy of the cac
25700 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  he register..**.
25710 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25720 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72  is used for expr
25730 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
25740 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a   used multiple .
25750 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20  ** times.  They 
25760 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  are evaluated on
25770 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  ce and the resul
25780 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ts of the expres
25790 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73  sion.** are reus
257a0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
257b0 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61  te3ExprCodeAndCa
257c0 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
257d0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
257e0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
257f0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
25800 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d  >pVdbe;.  int iM
25810 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  em;..  assert( t
25820 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
25830 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
25840 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
25850 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25860 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
25870 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20  target);.  iMem 
25880 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
25890 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
258a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
258b0 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b  , target, iMem);
258c0 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  .  exprToRegiste
258d0 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a  r(pExpr, iMem);.
258e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
258f0 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
25900 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
25910 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
25920 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
25930 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e  pression list in
25940 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  to a sequence of
25950 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
25960 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a  ning at target..
25970 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
25980 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
25990 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20  nts evaluated.  
259a0 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
259b0 6e 65 64 20 77 69 6c 6c 0a 2a 2a 20 75 73 75 61  ned will.** usua
259c0 6c 6c 79 20 62 65 20 70 4c 69 73 74 2d 3e 6e 45  lly be pList->nE
259d0 78 70 72 20 62 75 74 20 6d 69 67 68 74 20 62 65  xpr but might be
259e0 20 72 65 64 75 63 65 64 20 69 66 20 53 51 4c 49   reduced if SQLI
259f0 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 0a  TE_ECEL_OMITREF.
25a00 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  ** is defined..*
25a10 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
25a20 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72  ECEL_DUP flag pr
25a30 65 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d  events the argum
25a40 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a  ents from being.
25a50 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20  ** filled using 
25a60 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f  OP_SCopy.  OP_Co
25a70 70 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  py must be used 
25a80 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  instead..**.** T
25a90 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  he SQLITE_ECEL_F
25aa0 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61  ACTOR argument a
25ab0 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61  llows constant a
25ac0 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a  rguments to be.*
25ad0 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69  * factored out i
25ae0 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  nto initializati
25af0 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  on code..**.** T
25b00 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  he SQLITE_ECEL_R
25b10 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68  EF flag means th
25b20 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  at expressions i
25b30 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a  n the list with.
25b40 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  ** ExprList.a[].
25b50 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
25b60 30 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  0 have already b
25b70 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e  een evaluated an
25b80 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72  d stored.** in r
25b90 65 67 69 73 74 65 72 73 20 61 74 20 73 72 63 52  egisters at srcR
25ba0 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76  eg, and so the v
25bb0 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69  alue can be copi
25bc0 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a  ed from there..*
25bd0 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 43 45 4c  * If SQLITE_ECEL
25be0 5f 4f 4d 49 54 52 45 46 20 69 73 20 61 6c 73 6f  _OMITREF is also
25bf0 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 76   set, then the v
25c00 61 6c 75 65 73 20 77 69 74 68 20 75 2e 78 2e 69  alues with u.x.i
25c10 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 2a 2a 20  OrderByCol>0.** 
25c20 61 72 65 20 73 69 6d 70 6c 79 20 6f 6d 69 74 74  are simply omitt
25c30 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 62  ed rather than b
25c40 65 69 6e 67 20 63 6f 70 69 65 64 20 66 72 6f 6d  eing copied from
25c50 20 73 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e 74 20   srcReg..*/.int 
25c60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
25c70 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
25c80 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
25c90 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
25ca0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
25cb0 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20  pList,   /* The 
25cc0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
25cd0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
25ce0 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20   int target,    
25cf0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
25d00 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f  write results */
25d10 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20  .  int srcReg,  
25d20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
25d30 72 65 67 69 73 74 65 72 73 20 69 66 20 53 51 4c  registers if SQL
25d40 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a  ITE_ECEL_REF */.
25d50 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20 20    u8 flags      
25d60 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45       /* SQLITE_E
25d70 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29  CEL_* flags */.)
25d80 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
25d90 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
25da0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a  .  int i, j, n;.
25db0 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66    u8 copyOp = (f
25dc0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
25dd0 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70  EL_DUP) ? OP_Cop
25de0 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20  y : OP_SCopy;.  
25df0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
25e00 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
25e10 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
25e20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
25e30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
25e40 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20  Parse->pVdbe!=0 
25e50 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74  );  /* Never get
25e60 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65 72  s this far other
25e70 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c  wise */.  n = pL
25e80 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  ist->nExpr;.  if
25e90 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  ( !ConstFactorOk
25ea0 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67 73  (pParse) ) flags
25eb0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c   &= ~SQLITE_ECEL
25ec0 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70  _FACTOR;.  for(p
25ed0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
25ee0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49  =0; i<n; i++, pI
25ef0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
25f00 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d   *pExpr = pItem-
25f10 3e 70 45 78 70 72 3b 0a 23 69 66 64 65 66 20 53  >pExpr;.#ifdef S
25f20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
25f30 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
25f40 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 62 53     if( pItem->bS
25f50 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20  orterRef ){.    
25f60 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 6e 2d 2d    i--;.      n--
25f70 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
25f80 69 66 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  if.    if( (flag
25f90 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
25fa0 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20  REF)!=0 && (j = 
25fb0 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
25fc0 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20  rByCol)>0 ){.   
25fd0 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53     if( flags & S
25fe0 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52  QLITE_ECEL_OMITR
25ff0 45 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2d  EF ){.        i-
26000 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a  -;.        n--;.
26010 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26020 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26030 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
26040 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74 61  , j+srcReg-1, ta
26050 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d  rget+i);.      }
26060 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
26070 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
26080 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26  CEL_FACTOR)!=0 &
26090 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
260a0 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29  onstant(pExpr) )
260b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
260c0 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
260d0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
260e0 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73  get+i);.    }els
260f0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52  e{.      int inR
26100 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
26110 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
26120 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
26130 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  +i);.      if( i
26140 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  nReg!=target+i )
26150 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
26160 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69   *pOp;.        i
26170 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f  f( copyOp==OP_Co
26180 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  py.         && (
26190 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47  pOp=sqlite3VdbeG
261a0 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70  etOp(v, -1))->op
261b0 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  code==OP_Copy.  
261c0 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
261d0 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52  1+pOp->p3+1==inR
261e0 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
261f0 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31  Op->p2+pOp->p3+1
26200 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20  ==target+i.     
26210 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26220 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20  pOp->p3++;.     
26230 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26240 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26250 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
26260 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69   inReg, target+i
26270 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
26280 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
26290 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
262a0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
262b0 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
262c0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
262d0 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
262e0 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
262f0 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
26300 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
26310 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
26320 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
26330 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
26340 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
26350 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
26360 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f  ** elimination o
26370 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78  f x..**.** The x
26380 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72  JumpIf parameter
26390 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61   determines deta
263a0 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55  ils:.**.**    NU
263b0 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
263c0 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20        Store the 
263d0 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69  boolean result i
263e0 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20  n reg[dest].**  
263f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
26400 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74  rue:      Jump t
26410 6f 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a  o dest if true.*
26420 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  *    sqlite3Expr
26430 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d  IfFalse:     Jum
26440 70 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c  p to dest if fal
26450 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d  se.**.** The jum
26460 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65  pIfNull paramete
26470 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  r is ignored if 
26480 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e  xJumpIf is NULL.
26490 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
264a0 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
264b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
264c0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
264d0 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
264e0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
264f0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
26500 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45     /* The BETWEE
26510 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
26520 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
26530 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
26540 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61  ination or stora
26550 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20  ge location */. 
26560 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50   void (*xJump)(P
26570 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c  arse*,Expr*,int,
26580 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20  int), /* Action 
26590 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74  to take */.  int
265a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
265b0 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * Take the jump 
265c0 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  if the BETWEEN i
265d0 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78  s NULL */.){. Ex
265e0 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20  pr exprAnd;     
265f0 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61  /* The AND opera
26600 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44  tor in  x>=y AND
26610 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72   x<=z  */.  Expr
26620 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a   compLeft;    /*
26630 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d   The  x>=y  term
26640 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52   */.  Expr compR
26650 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20  ight;   /* The  
26660 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x<=z  term */.  
26670 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20  Expr exprX;     
26680 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62    /* The  x  sub
26690 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
266a0 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
266b0 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75  ; /* Temporary u
266c0 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a  se register */..
266d0 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c  .  memset(&compL
266e0 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  eft, 0, sizeof(E
266f0 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  xpr));.  memset(
26700 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73  &compRight, 0, s
26710 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
26720 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c  memset(&exprAnd,
26730 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
26740 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45  );..  assert( !E
26750 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
26760 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
26770 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d  ct) );.  exprX =
26780 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a   *pExpr->pLeft;.
26790 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54    exprAnd.op = T
267a0 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64  K_AND;.  exprAnd
267b0 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65  .pLeft = &compLe
267c0 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52  ft;.  exprAnd.pR
267d0 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68  ight = &compRigh
267e0 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70  t;.  compLeft.op
267f0 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70   = TK_GE;.  comp
26800 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  Left.pLeft = &ex
26810 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  prX;.  compLeft.
26820 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
26830 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
26840 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  xpr;.  compRight
26850 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63  .op = TK_LE;.  c
26860 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d  ompRight.pLeft =
26870 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52   &exprX;.  compR
26880 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45  ight.pRight = pE
26890 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
268a0 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72  1].pExpr;.  expr
268b0 54 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72  ToRegister(&expr
268c0 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  X, exprCodeVecto
268d0 72 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  r(pParse, &exprX
268e0 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
268f0 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20   if( xJump ){.  
26900 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20    xJump(pParse, 
26910 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
26920 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
26930 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 72  else{.    /* Mar
26940 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  k the expression
26950 20 69 73 20 62 65 69 6e 67 20 66 72 6f 6d 20 74   is being from t
26960 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
26970 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a  lause of a join.
26980 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74      ** so that t
26990 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  he sqlite3ExprCo
269a0 64 65 54 61 72 67 65 74 28 29 20 72 6f 75 74 69  deTarget() routi
269b0 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  ne will not atte
269c0 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20  mpt to move.    
269d0 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20 50  ** it into the P
269e0 61 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72 20  arse.pConstExpr 
269f0 6c 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c 64  list.  We should
26a00 20 75 73 65 20 61 20 6e 65 77 20 62 69 74 20 66   use a new bit f
26a10 6f 72 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a 20  or this,.    ** 
26a20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20 62 75 74  for clarity, but
26a30 20 77 65 20 61 72 65 20 6f 75 74 20 6f 66 20 62   we are out of b
26a40 69 74 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e  its in the Expr.
26a50 66 6c 61 67 73 20 66 69 65 6c 64 20 73 6f 20 77  flags field so w
26a60 65 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f  e.    ** have to
26a70 20 72 65 75 73 65 20 74 68 65 20 45 50 5f 46 72   reuse the EP_Fr
26a80 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d  omJoin bit.  Bum
26a90 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70 72  mer. */.    expr
26aa0 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72  X.flags |= EP_Fr
26ab0 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69  omJoin;.    sqli
26ac0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
26ad0 74 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  t(pParse, &exprA
26ae0 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20  nd, dest);.  }. 
26af0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
26b00 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
26b10 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20  egFree1);..  /* 
26b20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20  Ensure adequate 
26b30 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f  test coverage */
26b40 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26b50 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26b60 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
26b70 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
26b80 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
26b90 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26ba0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
26bb0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
26bc0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
26bd0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
26be0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
26bf0 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
26c00 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
26c10 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
26c20 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26c30 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26c40 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21    && jumpIfNull!
26c50 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
26c60 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26c70 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26c80 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
26c90 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
26ca0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26cb0 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26cc0 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
26cd0 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
26ce0 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
26cf0 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
26d00 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
26d10 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
26d20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
26d30 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26d40 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26d50 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26d60 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
26d70 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
26d80 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
26d90 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b  ase( xJump==0 );
26da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
26db0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
26dc0 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
26dd0 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
26de0 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
26df0 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
26e00 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
26e10 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
26e20 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
26e30 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
26e40 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
26e50 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
26e60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
26e70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
26e80 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
26e90 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
26ea0 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
26eb0 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
26ec0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
26ed0 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
26ee0 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FNULL..**.** Thi
26ef0 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
26f00 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
26f10 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
26f20 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
26f30 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
26f40 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
26f50 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
26f60 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
26f70 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
26f80 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
26f90 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
26fa0 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
26fb0 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
26fc0 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
26fd0 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
26fe0 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
26ff0 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
27000 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
27010 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
27020 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
27030 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
27040 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
27050 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
27060 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
27070 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
27080 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
27090 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
270a0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
270b0 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
270c0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
270d0 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
270e0 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
270f0 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
27100 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
27110 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
27120 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
27130 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
27140 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65  R(v==0) )     re
27150 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65  turn;  /* Existe
27160 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
27170 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
27180 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
27190 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  pr==0) ) return;
271a0 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73    /* No way this
271b0 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20   can happen */. 
271c0 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
271d0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
271e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
271f0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
27200 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
27210 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
27220 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27230 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27240 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27250 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
27260 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a  xpr->pLeft, d2,j
27270 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
27280 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
27290 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
272a0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
272b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
272c0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
272d0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
272e0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
272f0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
27300 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
27310 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
27320 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
27330 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
27340 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27350 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
27360 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
27370 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
27380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27390 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
273a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
273b0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
273c0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
273d0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
273e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
273f0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
27400 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27410 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
27420 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27430 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
27440 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
27450 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27460 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
27470 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
27480 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27490 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
274a0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
274b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
274c0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
274d0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
274e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
274f0 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20  e TK_TRUTH: {.  
27500 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20      int isNot;  
27510 20 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52      /* IS NOT TR
27520 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c  UE or IS NOT FAL
27530 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  SE */.      int 
27540 69 73 54 72 75 65 3b 20 20 20 20 20 2f 2a 20 49  isTrue;     /* I
27550 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54  S TRUE or IS NOT
27560 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74   TRUE */.      t
27570 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27580 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27590 69 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f  isNot = pExpr->o
275a0 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20  p2==TK_ISNOT;.  
275b0 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c      isTrue = sql
275c0 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c  ite3ExprTruthVal
275d0 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ue(pExpr->pRight
275e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
275f0 65 28 20 69 73 54 72 75 65 20 26 26 20 69 73 4e  e( isTrue && isN
27600 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ot );.      test
27610 63 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26  case( !isTrue &&
27620 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
27630 69 66 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e  if( isTrue ^ isN
27640 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ot ){.        sq
27650 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
27660 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27670 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20  Left, dest,.    
27680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27690 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51        isNot ? SQ
276a0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
276b0 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  : 0);.      }els
276c0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
276d0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
276e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
276f0 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20  ft, dest,.      
27700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27710 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c       isNot ? SQL
27720 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a  ITE_JUMPIFNULL :
27730 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
27740 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27750 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
27760 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
27770 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  T:.      testcas
27780 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
27790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
277a0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
277b0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
277c0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
277d0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75   TK_NE;.      ju
277e0 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54  mpIfNull = SQLIT
277f0 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
27800 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
27810 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
27820 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
27830 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
27840 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
27850 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
27860 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
27870 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
27880 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
27890 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20  pExpr->pLeft) ) 
278a0 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70  goto default_exp
278b0 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  r;.      testcas
278c0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
278d0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
278e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
278f0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
27900 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
27910 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
27920 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27930 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27940 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
27950 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
27960 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
27970 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
27980 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
27990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
279a0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
279b0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
279c0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
279d0 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
279e0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
279f0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27a00 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
27a10 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
27a20 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
27a30 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
27a40 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
27a50 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
27a60 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
27a70 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
27a80 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
27a90 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
27aa0 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
27ab0 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
27ac0 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
27ad0 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
27ae0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
27af0 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
27b00 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
27b10 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
27b20 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64  OP_Eq);.      Vd
27b30 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27b40 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
27b50 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
27b60 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
27b70 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27b80 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
27b90 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
27ba0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
27bb0 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
27bc0 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
27bd0 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
27be0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27bf0 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
27c00 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
27c10 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
27c20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27c30 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
27c40 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
27c50 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
27c60 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
27c70 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
27c80 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27c90 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
27ca0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27cb0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
27cc0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
27cd0 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61  TNULL: {.      a
27ce0 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
27cf0 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20  ==OP_IsNull );  
27d00 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
27d10 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
27d20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
27d30 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
27d40 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70   ); testcase( op
27d50 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
27d60 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
27d70 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
27d80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27d90 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
27da0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27db0 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
27dc0 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
27dd0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27de0 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
27df0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27e00 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
27e10 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
27e20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27e30 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
27e40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27e50 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
27e60 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
27e70 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
27e80 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
27e90 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
27ea0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
27eb0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
27ec0 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ue, jumpIfNull);
27ed0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27ee0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
27ef0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
27f00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
27f10 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
27f20 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
27f30 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
27f40 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
27f50 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49  stIfNull = jumpI
27f60 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64  fNull ? dest : d
27f70 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20  estIfFalse;.    
27f80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
27f90 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
27fa0 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  r, destIfFalse, 
27fb0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
27fc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
27fd0 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
27fe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
27ff0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
28000 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
28010 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
28020 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
28030 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74  t: {.    default
28040 5f 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28  _expr:.      if(
28050 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   exprAlwaysTrue(
28060 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
28070 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
28080 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
28090 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
280a0 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70  AlwaysFalse(pExp
280b0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
280c0 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   No-op */.      
280d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
280e0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
280f0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
28100 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
28110 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28120 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
28130 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c  OP_If, r1, dest,
28140 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
28150 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
28160 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
28170 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
28180 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
28190 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
281a0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
281b0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
281c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
281d0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
281e0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
281f0 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
28200 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
28210 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
28220 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
28230 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
28240 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
28250 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
28260 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
28270 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
28280 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
28290 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
282a0 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
282b0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
282c0 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
282d0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
282e0 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
282f0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
28300 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
28310 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
28320 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
28330 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
28340 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
28350 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
28360 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
28370 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
28380 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
28390 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
283a0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
283b0 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
283c0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
283d0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
283e0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
283f0 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
28400 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
28410 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
28420 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
28430 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
28440 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
28450 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
28460 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
28470 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
28480 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74  return; /* Exist
28490 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
284a0 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
284b0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
284c0 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20   )    return;.. 
284d0 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
284e0 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
284f0 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
28500 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
28510 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
28520 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
28530 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
28540 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
28550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
28560 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
28570 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
28580 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
28590 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
285a0 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
285b0 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
285c0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
285d0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
285f0 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
28600 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
28610 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
28620 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
28630 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
28640 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
28650 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
28660 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
28670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
28680 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
28690 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
286a0 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
286b0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
286c0 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
286d0 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
286e0 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
286f0 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
28700 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
28710 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
28720 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
28730 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
28740 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
28750 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
28760 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
28770 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
28780 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
28790 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
287a0 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
287b0 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
287c0 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
287d0 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
287e0 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
287f0 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
28800 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
28810 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
28820 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
28830 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28840 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
28850 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
28860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
28870 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
28880 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
28890 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
288a0 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
288b0 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
288c0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
288d0 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
288e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
288f0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
28900 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
28910 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28920 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
28930 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
28940 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28950 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
28960 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
28970 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
28980 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
28990 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
289a0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
289b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
289c0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
289d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
289e0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
289f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28a00 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
28a10 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
28a20 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
28a30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28a40 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
28a50 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
28a60 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
28a70 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
28a80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28a90 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
28aa0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
28ab0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
28ac0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
28ad0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28ae0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
28af0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
28b00 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
28b10 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d  ->pLeft, d2, jum
28b20 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
28b30 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
28b40 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
28b50 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
28b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28b70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
28b80 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
28b90 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
28ba0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28bb0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
28bc0 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
28bd0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
28be0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
28bf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
28c00 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
28c10 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
28c20 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
28c30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28c40 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
28c50 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28c60 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
28c70 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
28c80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
28c90 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20  TK_TRUTH: {.    
28ca0 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20 2f    int isNot;   /
28cb0 2a 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72  * IS NOT TRUE or
28cc0 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f   IS NOT FALSE */
28cd0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75  .      int isTru
28ce0 65 3b 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f  e;  /* IS TRUE o
28cf0 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f  r IS NOT TRUE */
28d00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28d10 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
28d20 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20  ;.      isNot = 
28d30 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49  pExpr->op2==TK_I
28d40 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72  SNOT;.      isTr
28d50 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ue = sqlite3Expr
28d60 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70 72  TruthValue(pExpr
28d70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
28d80 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75   testcase( isTru
28d90 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
28da0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
28db0 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29  sTrue && isNot )
28dc0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72  ;.      if( isTr
28dd0 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20  ue ^ isNot ){.  
28de0 20 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45        /* IS TRUE
28df0 20 61 6e 64 20 49 53 20 4e 4f 54 20 46 41 4c 53   and IS NOT FALS
28e00 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  E */.        sql
28e10 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
28e20 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28e30 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20  Left, dest,.    
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e50 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30         isNot ? 0
28e60 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   : SQLITE_JUMPIF
28e70 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 7d 65  NULL);..      }e
28e80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
28e90 49 53 20 46 41 4c 53 45 20 61 6e 64 20 49 53 20  IS FALSE and IS 
28ea0 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20  NOT TRUE */.    
28eb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
28ec0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
28ed0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
28ee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
28f00 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a  t ? 0 : SQLITE_J
28f10 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
28f20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
28f30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
28f40 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
28f50 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20  TK_ISNOT:.      
28f60 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
28f70 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
28f80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
28f90 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
28fa0 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
28fb0 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
28fc0 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f  S) ? TK_NE : TK_
28fd0 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66  EQ;.      jumpIf
28fe0 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55  Null = SQLITE_NU
28ff0 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46  LLEQ;.      /* F
29000 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
29010 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
29020 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
29030 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
29040 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
29050 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
29060 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
29070 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
29080 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70  xprIsVector(pExp
29090 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f  r->pLeft) ) goto
290a0 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20   default_expr;. 
290b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
290c0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
290d0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
290e0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
290f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
29100 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
29110 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
29120 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
29130 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
29140 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
29150 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
29160 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
29170 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
29180 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291a0 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
291b0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
291c0 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
291d0 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
291e0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
291f0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
29200 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
29210 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
29220 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
29230 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
29240 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
29250 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
29260 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
29270 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
29280 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
29290 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
292a0 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
292b0 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
292c0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
292d0 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
292e0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
292f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29300 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
29310 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
29320 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  q);.      VdbeCo
29330 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
29340 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
29350 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
29360 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
29370 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
29380 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
29390 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
293a0 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LEQ);.      asse
293b0 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
293c0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
293d0 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Ne);.      Vdb
293e0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
293f0 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
29400 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
29410 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
29420 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
29430 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
29440 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
29450 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74  NULLEQ);.      t
29460 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
29470 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
29480 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
29490 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
294a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
294b0 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
294c0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
294d0 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  L: {.      r1 = 
294e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
294f0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
29500 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
29510 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
29520 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
29530 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
29540 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29550 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
29560 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
29570 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  f(v, op==TK_ISNU
29580 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
29590 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
295a0 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65  ULL );  VdbeCove
295b0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
295c0 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
295d0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
295e0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
295f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
29600 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
29610 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
29620 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
29630 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
29640 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
29650 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
29660 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
29670 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  se, jumpIfNull);
29680 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
29690 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
296a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
296b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
296c0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d   {.      if( jum
296d0 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  pIfNull ){.     
296e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
296f0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
29700 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b  pr, dest, dest);
29710 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29720 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
29730 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
29740 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
29750 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
29760 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
29770 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
29780 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
29790 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
297a0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
297b0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
297c0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
297d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
297e0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
297f0 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a   default_expr: .
29800 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
29810 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
29820 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29830 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
29840 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
29850 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
29860 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
29870 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20         /* no-op 
29880 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
29890 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
298a0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
298b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
298c0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
298d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
298e0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
298f0 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
29900 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
29910 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
29920 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
29930 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
29940 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
29950 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
29960 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
29970 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
29980 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
29990 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
299a0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
299b0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
299c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
299d0 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d  se, regFree2);.}
299e0 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c  ../*.** Like sql
299f0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
29a00 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20  ) except that a 
29a10 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
29a20 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20  pExpr before.** 
29a30 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c  code generation,
29a40 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69   and that copy i
29a50 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20  s deleted after 
29a60 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
29a70 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73   This.** ensures
29a80 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
29a90 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68  al pExpr is unch
29aa0 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anged..*/.void s
29ab0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
29ac0 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  eDup(Parse *pPar
29ad0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
29ae0 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75   int dest,int ju
29af0 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c  mpIfNull){.  sql
29b00 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
29b10 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
29b20 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78  Copy = sqlite3Ex
29b30 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
29b40 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
29b50 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
29b60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
29b70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
29b80 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75   pCopy, dest, ju
29b90 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  mpIfNull);.  }. 
29ba0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
29bb0 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d  te(db, pCopy);.}
29bc0 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
29bd0 6f 6e 20 70 56 61 72 20 69 73 20 67 75 61 72 61  on pVar is guara
29be0 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 53  nteed to be an S
29bf0 51 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45 78  QL variable. pEx
29c00 70 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a 2a  pr may be any.**
29c10 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73 73   type of express
29c20 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ion..**.** If pE
29c30 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20  xpr is a simple 
29c40 53 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20 69  SQL value - an i
29c50 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74  nteger, real, st
29c60 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72  ring, blob.** or
29c70 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74 68   NULL value - th
29c80 65 6e 20 74 68 65 20 56 44 42 45 20 63 75 72 72  en the VDBE curr
29c90 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65 70  ently being prep
29ca0 61 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75 72  ared is configur
29cb0 65 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65 70  ed.** to re-prep
29cc0 61 72 65 20 65 61 63 68 20 74 69 6d 65 20 61 20  are each time a 
29cd0 6e 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f 75  new value is bou
29ce0 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70  nd to variable p
29cf0 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74  Var..**.** Addit
29d00 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78 70  ionally, if pExp
29d10 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51  r is a simple SQ
29d20 4c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  L value and the 
29d30 76 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20  value is the.** 
29d40 73 61 6d 65 20 61 73 20 74 68 61 74 20 63 75 72  same as that cur
29d50 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f 20  rently bound to 
29d60 76 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20 6e  variable pVar, n
29d70 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
29d80 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
29d90 65 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 73  e, if the values
29da0 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d   are not the sam
29db0 65 20 6f 72 20 69 66 20 70 45 78 70 72 20 69 73  e or if pExpr is
29dc0 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a 2a   not a simple.**
29dd0 20 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72 6f   SQL value, zero
29de0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
29df0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
29e00 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28  CompareVariable(
29e10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
29e20 78 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72 20  xpr *pVar, Expr 
29e30 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
29e40 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  es = 0;.  int iV
29e50 61 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ar;.  sqlite3_va
29e60 6c 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20 30  lue *pL, *pR = 0
29e70 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56 61  ;.  .  sqlite3Va
29e80 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
29e90 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53  se->db, pExpr, S
29ea0 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
29eb0 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70 52  TE_AFF_BLOB, &pR
29ec0 29 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a 20  );.  if( pR ){. 
29ed0 20 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d 3e     iVar = pVar->
29ee0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c  iColumn;.    sql
29ef0 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
29f00 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
29f10 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c 20  , iVar);.    pL 
29f20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
29f30 42 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72 73  BoundValue(pPars
29f40 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69  e->pReprepare, i
29f50 56 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Var, SQLITE_AFF_
29f60 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70  BLOB);.    if( p
29f70 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  L ){.      if( s
29f80 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
29f90 65 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54 45  e(pL)==SQLITE_TE
29fa0 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  XT ){.        sq
29fb0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
29fc0 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75  (pL); /* Make su
29fd0 72 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  re the encoding 
29fe0 69 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20  is UTF-8 */.    
29ff0 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20    }.      res = 
2a000 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43 6f   0==sqlite3MemCo
2a010 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30 29  mpare(pL, pR, 0)
2a020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2a030 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 29  te3ValueFree(pR)
2a040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
2a050 75 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d 0a  ueFree(pL);.  }.
2a060 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
2a070 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
2a080 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
2a090 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
2a0a0 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
2a0b0 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
2a0c0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
2a0d0 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
2a0e0 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
2a0f0 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
2a100 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
2a110 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
2a120 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
2a130 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
2a140 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
2a150 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
2a160 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
2a170 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
2a180 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
2a190 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
2a1a0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
2a1b0 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
2a1c0 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
2a1d0 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
2a1e0 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
2a1f0 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
2a200 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
2a210 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
2a220 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
2a230 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
2a240 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
2a250 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
2a260 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
2a270 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
2a280 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
2a290 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
2a2a0 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
2a2b0 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
2a2c0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
2a2d0 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
2a2e0 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
2a2f0 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
2a300 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
2a310 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
2a320 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
2a330 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
2a340 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
2a350 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
2a360 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
2a370 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
2a380 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
2a390 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
2a3a0 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
2a3b0 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
2a3c0 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
2a3d0 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
2a3e0 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
2a3f0 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
2a400 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
2a410 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
2a420 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
2a430 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
2a440 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
2a450 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
2a460 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
2a470 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
2a480 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
2a490 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
2a4a0 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
2a4b0 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
2a4c0 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
2a4d0 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
2a4e0 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
2a4f0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
2a500 20 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e   pParse is not N
2a510 55 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52 49  ULL then TK_VARI
2a520 41 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70 41  ABLE terms in pA
2a530 20 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20 69   with bindings i
2a540 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52 65  n.** pParse->pRe
2a550 70 72 65 70 61 72 65 20 63 61 6e 20 62 65 20 6d  prepare can be m
2a560 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 6c  atched against l
2a570 69 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20 20  iterals in pB.  
2a580 54 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  The .** pParse->
2a590 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 62  pVdbe->expmask b
2a5a0 69 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74 65  itmask is update
2a5b0 64 20 66 6f 72 20 65 61 63 68 20 76 61 72 69 61  d for each varia
2a5c0 62 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e 0a  ble referenced..
2a5d0 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
2a5e0 4e 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61 6c  NULL (the normal
2a5f0 20 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79 20   case) then any 
2a600 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d  TK_VARIABLE term
2a610 20 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74   in .** Argument
2a620 20 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20 6e   pParse should n
2a630 6f 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e  ormally be NULL.
2a640 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
2a650 4c 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a 20  LL and pA or.** 
2a660 70 42 20 63 61 75 73 65 73 20 61 20 72 65 74 75  pB causes a retu
2a670 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a 2a  rn value of 2..*
2a680 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2a690 72 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a  rCompare(Parse *
2a6a0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 41  pParse, Expr *pA
2a6b0 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
2a6c0 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d  iTab){.  u32 com
2a6d0 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66  binedFlags;.  if
2a6e0 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
2a6f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2a700 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
2a710 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 20   }.  if( pParse 
2a720 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  && pA->op==TK_VA
2a730 52 49 41 42 4c 45 20 26 26 20 65 78 70 72 43 6f  RIABLE && exprCo
2a740 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 70 50  mpareVariable(pP
2a750 61 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29 7b  arse, pA, pB) ){
2a760 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2a770 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61   }.  combinedFla
2a780 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c  gs = pA->flags |
2a790 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66   pB->flags;.  if
2a7a0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
2a7b0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
2a7c0 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  .    if( (pA->fl
2a7d0 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50  ags&pB->flags&EP
2a7e0 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26  _IntValue)!=0 &&
2a7f0 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70   pA->u.iValue==p
2a800 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
2a810 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2a820 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2a830 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
2a840 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20  >op!=pB->op ){. 
2a850 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
2a860 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
2a870 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2a880 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66  pParse, pA->pLef
2a890 74 2c 70 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a  t,pB,iTab)<2 ){.
2a8a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2a8b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
2a8c0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
2a8d0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
2a8e0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2a8f0 41 2c 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62  A,pB->pLeft,iTab
2a900 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
2a910 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2a920 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
2a930 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
2a940 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70  COLUMN && pA->op
2a950 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
2a960 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  && pA->u.zToken 
2a970 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
2a980 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
2a990 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
2a9a0 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75  te3StrICmp(pA->u
2a9b0 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
2a9c0 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72  oken)!=0 ) retur
2a9d0 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 2;.    }else i
2a9e0 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
2a9f0 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  LLATE ){.      i
2aa00 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2aa10 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
2aa20 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
2aa30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
2aa40 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
2aa50 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
2aa60 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
2aa70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2aa80 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
2aa90 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
2aaa0 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
2aab0 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
2aac0 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
2aad0 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   2;.  if( ALWAYS
2aae0 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ((combinedFlags 
2aaf0 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d  & EP_TokenOnly)=
2ab00 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63  =0) ){.    if( c
2ab10 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
2ab20 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65  P_xIsSelect ) re
2ab30 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
2ab40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2ab50 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70  re(pParse, pA->p
2ab60 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  Left, pB->pLeft,
2ab70 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
2ab80 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
2ab90 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2aba0 61 72 73 65 2c 20 70 41 2d 3e 70 52 69 67 68 74  arse, pA->pRight
2abb0 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pB->pRight, iT
2abc0 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
2abd0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2abe0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
2abf0 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e  A->x.pList, pB->
2ac00 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29  x.pList, iTab) )
2ac10 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 61   return 2;.    a
2ac20 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64  ssert( (combined
2ac30 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63  Flags & EP_Reduc
2ac40 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ed)==0 );.    if
2ac50 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52  ( pA->op!=TK_STR
2ac60 49 4e 47 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54  ING && pA->op!=T
2ac70 4b 5f 54 52 55 45 46 41 4c 53 45 20 29 7b 0a 20  K_TRUEFALSE ){. 
2ac80 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f       if( pA->iCo
2ac90 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d  lumn!=pB->iColum
2aca0 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  n ) return 2;.  
2acb0 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62      if( pA->iTab
2acc0 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a  le!=pB->iTable .
2acd0 20 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69         && (pA->i
2ace0 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e  Table!=iTab || N
2acf0 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e  EVER(pB->iTable>
2ad00 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b  =0)) ) return 2;
2ad10 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
2ad20 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
2ad30 57 46 55 4e 43 0a 20 20 20 20 69 66 28 20 70 41  WFUNC.    if( pA
2ad40 2d 3e 70 57 69 6e 21 3d 30 20 29 7b 0a 20 20 20  ->pWin!=0 ){.   
2ad50 20 20 20 69 66 28 20 70 42 2d 3e 70 57 69 6e 3d     if( pB->pWin=
2ad60 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  =0 ) return 2;. 
2ad70 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2ad80 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 70 50  WindowCompare(pP
2ad90 61 72 73 65 2c 70 41 2d 3e 70 57 69 6e 2c 70 42  arse,pA->pWin,pB
2ada0 2d 3e 70 57 69 6e 29 21 3d 30 20 29 20 72 65 74  ->pWin)!=0 ) ret
2adb0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 2;.    }else
2adc0 20 69 66 28 20 70 42 2d 3e 70 57 69 6e 21 3d 30   if( pB->pWin!=0
2add0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2ade0 20 32 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   2;.    }.#endif
2adf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2ae00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
2ae10 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f  e two ExprList o
2ae20 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20  bjects.  Return 
2ae30 30 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  0 if they are id
2ae40 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20  entical and .** 
2ae50 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79  non-zero if they
2ae60 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
2ae70 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ay..**.** If any
2ae80 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
2ae90 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
2aea0 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
2aeb0 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
2aec0 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
2aed0 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
2aee0 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
2aef0 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
2af00 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  iTab..**.** This
2af10 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72   routine might r
2af20 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66  eturn non-zero f
2af30 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78  or equivalent Ex
2af40 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a  prLists.  The.**
2af50 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63   only consequenc
2af60 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c  e will be disabl
2af70 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ed optimizations
2af80 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74  .  But this rout
2af90 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65  ine.** must neve
2afa0 72 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68  r return 0 if th
2afb0 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f  e two ExprList o
2afc0 62 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65  bjects are diffe
2afd0 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61  rent, or.** a ma
2afe0 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72  lfunction will r
2aff0 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f  esult..**.** Two
2b000 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61   NULL pointers a
2b010 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
2b020 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42   be the same.  B
2b030 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ut a NULL pointe
2b040 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66  r.** always diff
2b050 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e  ers from a non-N
2b060 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
2b070 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c  int sqlite3ExprL
2b080 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c  istCompare(ExprL
2b090 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73  ist *pA, ExprLis
2b0a0 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  t *pB, int iTab)
2b0b0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
2b0c0 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20   pA==0 && pB==0 
2b0d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
2b0e0 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
2b0f0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
2b100 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42  f( pA->nExpr!=pB
2b110 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e  ->nExpr ) return
2b120 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   1;.  for(i=0; i
2b130 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  <pA->nExpr; i++)
2b140 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
2b150 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45  rA = pA->a[i].pE
2b160 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
2b170 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d  ExprB = pB->a[i]
2b180 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
2b190 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pA->a[i].sortOrd
2b1a0 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72  er!=pB->a[i].sor
2b1b0 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20  tOrder ) return 
2b1c0 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  1;.    if( sqlit
2b1d0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
2b1e0 20 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c   pExprA, pExprB,
2b1f0 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
2b200 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
2b210 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65  0;.}../*.** Like
2b220 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2b230 61 72 65 28 29 20 65 78 63 65 70 74 20 43 4f 4c  are() except COL
2b240 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61  LATE operators a
2b250 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 0a  t the top-level.
2b260 2a 2a 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  ** are ignored..
2b270 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2b280 70 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 45 78  prCompareSkip(Ex
2b290 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
2b2a0 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 72  , int iTab){.  r
2b2b0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
2b2c0 72 43 6f 6d 70 61 72 65 28 30 2c 0a 20 20 20 20  rCompare(0,.    
2b2d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2b2e0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2b2f0 70 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pA),.           
2b300 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69    sqlite3ExprSki
2b310 70 43 6f 6c 6c 61 74 65 28 70 42 29 2c 0a 20 20  pCollate(pB),.  
2b320 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62 29             iTab)
2b330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2b340 6e 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e  n true if we can
2b350 20 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77   prove the pE2 w
2b360 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72  ill always be tr
2b370 75 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20  ue if pE1 is.** 
2b380 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61  true.  Return fa
2b390 6c 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  lse if we cannot
2b3a0 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72   complete the pr
2b3b0 6f 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69  oof or if pE2 mi
2b3c0 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e  ght.** be false.
2b3d0 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
2b3e0 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20  *     pE1: x==5 
2b3f0 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20        pE2: x==5 
2b400 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
2b410 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
2b420 70 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20  pE1: x>0        
2b430 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
2b440 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61        Result: fa
2b450 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
2b460 78 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20  x=21       pE2: 
2b470 78 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20  x=21 OR y=43    
2b480 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
2b490 20 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33       pE1: x!=123
2b4a0 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e       pE2: x IS N
2b4b0 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
2b4c0 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
2b4d0 45 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70  E1: x!=?1      p
2b4e0 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
2b4f0 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
2b500 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
2b510 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20  IS NULL  pE2: x 
2b520 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2b530 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
2b540 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32      pE1: x IS ?2
2b550 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
2b560 54 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74  T NULL    Reuslt
2b570 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68  : false.**.** Wh
2b580 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f  en comparing TK_
2b590 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74  COLUMN nodes bet
2b5a0 77 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32  ween pE1 and pE2
2b5b0 2c 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20  , if pE2 has.** 
2b5c0 45 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68  Expr.iTable<0 th
2b5d0 65 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c  en assume a tabl
2b5e0 65 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62  e number given b
2b5f0 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66  y iTab..**.** If
2b600 20 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e   pParse is not N
2b610 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ULL, then the va
2b620 6c 75 65 73 20 6f 66 20 62 6f 75 6e 64 20 76 61  lues of bound va
2b630 72 69 61 62 6c 65 73 20 69 6e 20 70 45 31 20 61  riables in pE1 a
2b640 72 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 65 64 20  re .** compared 
2b650 61 67 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 20  against literal 
2b660 76 61 6c 75 65 73 20 69 6e 20 70 45 32 20 61 6e  values in pE2 an
2b670 64 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d  d pParse->pVdbe-
2b680 3e 65 78 70 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d  >expmask is.** m
2b690 6f 64 69 66 69 65 64 20 74 6f 20 72 65 63 6f 72  odified to recor
2b6a0 64 20 77 68 69 63 68 20 62 6f 75 6e 64 20 76 61  d which bound va
2b6b0 72 69 61 62 6c 65 73 20 61 72 65 20 72 65 66 65  riables are refe
2b6c0 72 65 6e 63 65 64 2e 20 20 49 66 20 70 50 61 72  renced.  If pPar
2b6d0 73 65 20 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20  se .** is NULL, 
2b6e0 74 68 65 6e 20 66 61 6c 73 65 20 77 69 6c 6c 20  then false will 
2b6f0 62 65 20 72 65 74 75 72 6e 65 64 20 69 66 20 70  be returned if p
2b700 45 31 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  E1 contains any 
2b710 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 2e  bound variables.
2b720 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64  .**.** When in d
2b730 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c  oubt, return fal
2b740 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74  se.  Returning t
2b750 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61  rue might give a
2b760 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
2b770 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65  improvement.  Re
2b780 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69  turning false mi
2b790 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66  ght cause a perf
2b7a0 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
2b7b0 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c  n, but.** it wil
2b7c0 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68  l always give th
2b7d0 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
2b7e0 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c   and is hence al
2b7f0 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e  ways safe..*/.in
2b800 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  t sqlite3ExprImp
2b810 6c 69 65 73 45 78 70 72 28 50 61 72 73 65 20 2a  liesExpr(Parse *
2b820 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
2b830 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e  1, Expr *pE2, in
2b840 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73  t iTab){.  if( s
2b850 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2b860 65 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70  e(pParse, pE1, p
2b870 45 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a  E2, iTab)==0 ){.
2b880 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2b890 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d  }.  if( pE2->op=
2b8a0 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71  =TK_OR.   && (sq
2b8b0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2b8c0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 31  Expr(pParse, pE1
2b8d0 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54  , pE2->pLeft, iT
2b8e0 61 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab).            
2b8f0 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
2b900 6d 70 6c 69 65 73 45 78 70 72 28 70 50 61 72 73  mpliesExpr(pPars
2b910 65 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70 52 69  e, pE1, pE2->pRi
2b920 67 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29  ght, iTab) ).  )
2b930 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
2b940 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f    }.  if( pE2->o
2b950 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26  p==TK_NOTNULL &&
2b960 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e   pE1->op!=TK_ISN
2b970 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d  ULL && pE1->op!=
2b980 54 4b 5f 49 53 20 29 7b 0a 20 20 20 20 45 78 70  TK_IS ){.    Exp
2b990 72 20 2a 70 58 20 3d 20 73 71 6c 69 74 65 33 45  r *pX = sqlite3E
2b9a0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2b9b0 45 31 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  E1->pLeft);.    
2b9c0 74 65 73 74 63 61 73 65 28 20 70 58 21 3d 70 45  testcase( pX!=pE
2b9d0 31 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  1->pLeft );.    
2b9e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2b9f0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2ba00 58 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  X, pE2->pLeft, i
2ba10 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Tab)==0 ) return
2ba20 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2ba30 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
2ba40 73 20 69 73 20 74 68 65 20 45 78 70 72 20 6e 6f  s is the Expr no
2ba50 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  de callback for 
2ba60 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2ba70 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 29 2e 0a  esNotNullRow()..
2ba80 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
2ba90 73 69 6f 6e 20 6e 6f 64 65 20 72 65 71 75 69 72  sion node requir
2baa0 65 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  es that the tabl
2bab0 65 20 61 74 20 70 57 61 6c 6b 65 72 2d 3e 69 43  e at pWalker->iC
2bac0 75 72 0a 2a 2a 20 68 61 76 65 20 61 20 6e 6f 6e  ur.** have a non
2bad0 2d 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68  -NULL column, th
2bae0 65 6e 20 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e  en set pWalker->
2baf0 65 43 6f 64 65 20 74 6f 20 31 20 61 6e 64 20 61  eCode to 1 and a
2bb00 62 6f 72 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bort..*/.static 
2bb10 69 6e 74 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75  int impliesNotNu
2bb20 6c 6c 52 6f 77 28 57 61 6c 6b 65 72 20 2a 70 57  llRow(Walker *pW
2bb30 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2bb40 70 72 29 7b 0a 20 20 2f 2a 20 54 68 69 73 20 72  pr){.  /* This r
2bb50 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
2bb60 61 6c 6c 65 64 20 66 6f 72 20 57 48 45 52 45 20  alled for WHERE 
2bb70 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
2bb80 6e 73 20 61 6e 64 20 73 6f 20 69 74 0a 20 20 2a  ns and so it.  *
2bb90 2a 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 61 6e  * cannot have an
2bba0 79 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  y TK_AGG_COLUMN 
2bbb0 65 6e 74 72 69 65 73 20 62 65 63 61 75 73 65 20  entries because 
2bbc0 74 68 6f 73 65 20 61 72 65 20 6f 6e 6c 79 20 66  those are only f
2bbd0 6f 75 6e 64 0a 20 20 2a 2a 20 69 6e 20 48 41 56  ound.  ** in HAV
2bbe0 49 4e 47 20 63 6c 61 75 73 65 73 2e 20 20 57 65  ING clauses.  We
2bbf0 20 63 61 6e 20 67 65 74 20 61 20 54 4b 5f 41 47   can get a TK_AG
2bc00 47 5f 46 55 4e 43 54 49 4f 4e 20 69 6e 20 61 20  G_FUNCTION in a 
2bc10 57 48 45 52 45 20 63 6c 61 75 73 65 2c 0a 20 20  WHERE clause,.  
2bc20 2a 2a 20 62 75 74 20 74 68 61 74 20 69 73 20 61  ** but that is a
2bc30 6e 20 69 6c 6c 65 67 61 6c 20 63 6f 6e 73 74 72  n illegal constr
2bc40 75 63 74 20 61 6e 64 20 74 68 65 20 71 75 65 72  uct and the quer
2bc50 79 20 77 69 6c 6c 20 62 65 20 72 65 6a 65 63 74  y will be reject
2bc60 65 64 20 61 74 0a 20 20 2a 2a 20 61 20 6c 61 74  ed at.  ** a lat
2bc70 65 72 20 73 74 61 67 65 20 6f 66 20 70 72 6f 63  er stage of proc
2bc80 65 73 73 69 6e 67 2c 20 73 6f 20 74 68 65 20 54  essing, so the T
2bc90 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 63  K_AGG_FUNCTION c
2bca0 61 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  ase does not.  *
2bcb0 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e  * need to be con
2bcc0 73 69 64 65 72 65 64 20 68 65 72 65 2e 20 2a 2f  sidered here. */
2bcd0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
2bce0 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
2bcf0 55 4d 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73  UMN );.  testcas
2bd00 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2bd10 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
2bd20 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ..  if( ExprHasP
2bd30 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2bd40 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
2bd50 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2bd60 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
2bd70 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
2bd80 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61  TK_ISNOT:.    ca
2bd90 73 65 20 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63  se TK_NOT:.    c
2bda0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
2bdb0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
2bdc0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
2bdd0 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a     case TK_CASE:
2bde0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
2bdf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
2be00 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 74 65 73  CTION:.      tes
2be10 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2be20 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
2be30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2be40 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  xpr->op==TK_NOT 
2be50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2be60 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2be70 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
2be80 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2be90 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
2bea0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2beb0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
2bec0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2bed0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2bee0 5f 43 41 53 45 20 29 3b 0a 20 20 20 20 20 20 74  _CASE );.      t
2bef0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2bf00 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op==TK_IN );.   
2bf10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2bf20 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pr->op==TK_FUNCT
2bf30 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 72 65 74  ION );.      ret
2bf40 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2bf50 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
2bf60 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  N:.      if( pWa
2bf70 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 3d 3d 70 45  lker->u.iCur==pE
2bf80 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20  xpr->iTable ){. 
2bf90 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
2bfa0 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  eCode = 1;.     
2bfb0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
2bfc0 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
2bfd0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2bfe0 75 6e 65 3b 0a 0a 20 20 20 20 2f 2a 20 56 69 72  une;..    /* Vir
2bff0 74 75 61 6c 20 74 61 62 6c 65 73 20 61 72 65 20  tual tables are 
2c000 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 63  allowed to use c
2c010 6f 6e 73 74 72 61 69 6e 74 73 20 6c 69 6b 65 20  onstraints like 
2c020 78 3d 4e 55 4c 4c 2e 20 20 53 6f 0a 20 20 20 20  x=NULL.  So.    
2c030 2a 2a 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  ** a term of the
2c040 20 66 6f 72 6d 20 78 3d 79 20 64 6f 65 73 20 6e   form x=y does n
2c050 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 79 20  ot prove that y 
2c060 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 69 66 20 78  is not null if x
2c070 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63  .    ** is the c
2c080 6f 6c 75 6d 6e 20 6f 66 20 61 20 76 69 72 74 75  olumn of a virtu
2c090 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  al table */.    
2c0a0 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20  case TK_EQ:.    
2c0b0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
2c0c0 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
2c0d0 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
2c0e0 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
2c0f0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
2c100 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2c110 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a  r->op==TK_EQ );.
2c120 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c130 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
2c140 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c150 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c160 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
2c170 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c180 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
2c190 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2c1a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  r->op==TK_GT );.
2c1b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c1c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45  pExpr->op==TK_GE
2c1d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
2c1e0 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  Expr->pLeft->op=
2c1f0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73  =TK_COLUMN && Is
2c200 56 69 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70  Virtual(pExpr->p
2c210 4c 65 66 74 2d 3e 70 54 61 62 29 29 0a 20 20 20  Left->pTab)).   
2c220 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70      || (pExpr->p
2c230 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
2c240 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61  LUMN && IsVirtua
2c250 6c 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d  l(pExpr->pRight-
2c260 3e 70 54 61 62 29 29 0a 20 20 20 20 20 20 29 7b  >pTab)).      ){
2c270 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  .       return W
2c280 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
2c290 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  }.    default:. 
2c2a0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2c2b0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
2c2c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2c2d0 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66  ue (non-zero) if
2c2e0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 61   expression p ca
2c2f0 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69  n only be true i
2c300 66 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e  f at least.** on
2c310 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
2c320 65 20 69 54 61 62 20 69 73 20 6e 6f 6e 2d 6e 75  e iTab is non-nu
2c330 6c 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ll.  In other wo
2c340 72 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75 65  rds, return true
2c350 0a 2a 2a 20 69 66 20 65 78 70 72 65 73 73 69 6f  .** if expressio
2c360 6e 20 70 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  n p will always 
2c370 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65  be NULL or false
2c380 20 69 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   if every column
2c390 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e   of iTab.** is N
2c3a0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65  ULL..**.** False
2c3b0 20 6e 65 67 61 74 69 76 65 73 20 61 72 65 20 61   negatives are a
2c3c0 63 63 65 70 74 61 62 6c 65 2e 20 20 49 6e 20 6f  cceptable.  In o
2c3d0 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 69  ther words, it i
2c3e0 73 20 6f 6b 20 74 6f 20 72 65 74 75 72 6e 0a 2a  s ok to return.*
2c3f0 2a 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 65  * zero even if e
2c400 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c  xpression p will
2c410 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 20 6f   never be true o
2c420 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f  f every column o
2c430 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c  f iTab.** is NUL
2c440 4c 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61  L.  A false nega
2c450 74 69 76 65 20 69 73 20 6d 65 72 65 6c 79 20 61  tive is merely a
2c460 20 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a 61   missed optimiza
2c470 74 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  tion opportunity
2c480 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 70 6f  ..**.** False po
2c490 73 69 74 69 76 65 73 20 61 72 65 20 6e 6f 74 20  sitives are not 
2c4a0 61 6c 6c 6f 77 65 64 2c 20 68 6f 77 65 76 65 72  allowed, however
2c4b0 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
2c4c0 69 76 65 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a  ive may result.*
2c4d0 2a 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63  * in an incorrec
2c4e0 74 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20  t answer..**.** 
2c4f0 54 65 72 6d 73 20 6f 66 20 70 20 74 68 61 74 20  Terms of p that 
2c500 61 72 65 20 6d 61 72 6b 65 64 20 77 69 74 68 20  are marked with 
2c510 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64  EP_FromJoin (and
2c520 20 68 65 6e 63 65 20 74 68 61 74 20 63 6f 6d 65   hence that come
2c530 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20   from.** the ON 
2c540 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
2c550 20 6f 66 20 4c 45 46 54 20 4a 4f 49 4e 53 29 20   of LEFT JOINS) 
2c560 61 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f  are excluded fro
2c570 6d 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a  m the analysis..
2c580 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2c590 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
2c5a0 65 63 6b 20 69 66 20 61 20 4c 45 46 54 20 4a 4f  eck if a LEFT JO
2c5b0 49 4e 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72  IN can be conver
2c5c0 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f  ted into.** an o
2c5d0 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 20 20 54  rdinary JOIN.  T
2c5e0 68 65 20 70 20 61 72 67 75 6d 65 6e 74 20 69 73  he p argument is
2c5f0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2c600 65 2e 20 20 49 66 20 74 68 65 20 57 48 45 52 45  e.  If the WHERE
2c610 0a 2a 2a 20 63 6c 61 75 73 65 20 72 65 71 75 69  .** clause requi
2c620 72 65 73 20 74 68 61 74 20 73 6f 6d 65 20 63 6f  res that some co
2c630 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 69 67 68  lumn of the righ
2c640 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 4c  t table of the L
2c650 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e  EFT JOIN.** be n
2c660 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
2c670 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20  e LEFT JOIN can 
2c680 62 65 20 73 61 66 65 6c 79 20 63 6f 6e 76 65 72  be safely conver
2c690 74 65 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f  ted into an.** o
2c6a0 72 64 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f  rdinary join..*/
2c6b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2c6c0 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f  ImpliesNonNullRo
2c6d0 77 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  w(Expr *p, int i
2c6e0 54 61 62 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  Tab){.  Walker w
2c6f0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2c700 61 63 6b 20 3d 20 69 6d 70 6c 69 65 73 4e 6f 74  ack = impliesNot
2c710 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e 78 53 65  NullRow;.  w.xSe
2c720 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30  lectCallback = 0
2c730 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2c740 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e  lback2 = 0;.  w.
2c750 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e 75  eCode = 0;.  w.u
2c760 2e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20  .iCur = iTab;.  
2c770 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2c780 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
2c790 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   w.eCode;.}../*.
2c7a0 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
2c7b0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2c7c0 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
2c7d0 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61  d by the tree wa
2c7e0 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72  lker.** to deter
2c7f0 6d 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72 65  mine if an expre
2c800 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 65 76 61  ssion can be eva
2c810 6c 75 61 74 65 64 20 62 79 20 72 65 66 65 72 65  luated by refere
2c820 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  nce to the.** in
2c830 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75  dex only, withou
2c840 74 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61  t having to do a
2c850 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
2c860 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
2c870 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 20 54   table entry.  T
2c880 68 65 20 49 64 78 43 6f 76 65 72 2e 70 49 64 78  he IdxCover.pIdx
2c890 20 66 69 65 6c 64 20 69 73 20 74 68 65 20 69 6e   field is the in
2c8a0 64 65 78 2e 20 20 49 64 78 43 6f 76 65 72 2e 69  dex.  IdxCover.i
2c8b0 43 75 72 0a 2a 2a 20 69 73 20 74 68 65 20 63 75  Cur.** is the cu
2c8c0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62  rsor for the tab
2c8d0 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64  le..*/.struct Id
2c8e0 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65 78  xCover {.  Index
2c8f0 20 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20 54   *pIdx;     /* T
2c900 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74  he index to be t
2c910 65 73 74 65 64 20 66 6f 72 20 63 6f 76 65 72 61  ested for covera
2c920 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ge */.  int iCur
2c930 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ;        /* Curs
2c940 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
2c950 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
2c960 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
2c970 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ex */.};../*.** 
2c980 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2c990 74 68 65 72 65 20 61 72 65 20 72 65 66 65 72 65  there are refere
2c9a0 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
2c9b0 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61  in table .** pWa
2c9c0 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2c9d0 72 2d 3e 69 43 75 72 20 63 61 6e 20 62 65 20 73  r->iCur can be s
2c9e0 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 74  atisfied using t
2c9f0 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c  he index.** pWal
2ca00 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2ca10 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  ->pIdx..*/.stati
2ca20 63 20 69 6e 74 20 65 78 70 72 49 64 78 43 6f 76  c int exprIdxCov
2ca30 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
2ca40 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
2ca50 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
2ca60 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
2ca70 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
2ca80 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  ==pWalker->u.pId
2ca90 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20 20  xCover->iCur.   
2caa0 26 26 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  && sqlite3Column
2cab0 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d  OfIndex(pWalker-
2cac0 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49  >u.pIdxCover->pI
2cad0 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  dx, pExpr->iColu
2cae0 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70  mn)<0.  ){.    p
2caf0 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
2cb00 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  1;.    return WR
2cb10 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72  C_Abort;.  }.  r
2cb20 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2cb30 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  ue;.}../*.** Det
2cb40 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e 64  ermine if an ind
2cb50 65 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c 65  ex pIdx on table
2cb60 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75   with cursor iCu
2cb70 72 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a  r contains will.
2cb80 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
2cb90 6e 20 70 45 78 70 72 2e 20 20 52 65 74 75 72 6e  n pExpr.  Return
2cba0 20 74 72 75 65 20 69 66 20 74 68 65 20 69 6e 64   true if the ind
2cbb0 65 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74 68  ex does cover th
2cbc0 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
2cbd0 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65  and false if the
2cbe0 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f   pExpr expressio
2cbf0 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 61 62  n references tab
2cc00 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68  le columns.** th
2cc10 61 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64  at are not found
2cc20 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49   in the index pI
2cc30 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64  dx..**.** An ind
2cc40 65 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20 65  ex covering an e
2cc50 78 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20  xpression means 
2cc60 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
2cc70 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76  ion can be.** ev
2cc80 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f 6e  aluated using on
2cc90 6c 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ly the index and
2cca0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
2ccb0 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a  to lookup the.**
2ccc0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2ccd0 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69  able entry..*/.i
2cce0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
2ccf0 76 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20 20  veredByIndex(.  
2cd00 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
2cd10 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2cd20 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a 2f   to be tested */
2cd30 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
2cd40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
2cd50 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
2cd60 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2cd70 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64  g table */.  Ind
2cd80 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
2cd90 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68   /* The index th
2cda0 61 74 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  at might be used
2cdb0 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f   for coverage */
2cdc0 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  .){.  Walker w;.
2cdd0 20 20 73 74 72 75 63 74 20 49 64 78 43 6f 76 65    struct IdxCove
2cde0 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74  r xcov;.  memset
2cdf0 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
2ce00 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72 20  ));.  xcov.iCur 
2ce10 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70  = iCur;.  xcov.p
2ce20 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e  Idx = pIdx;.  w.
2ce30 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2ce40 65 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20 20  exprIdxCover;.  
2ce50 77 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d 20  w.u.pIdxCover = 
2ce60 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33  &xcov;.  sqlite3
2ce70 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
2ce80 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77  pr);.  return !w
2ce90 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  .eCode;.}.../*.*
2cea0 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2ceb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2cec0 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
2ced0 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c   by the tree wal
2cee0 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20  ker.** to count 
2cef0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
2cf00 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ble columns in t
2cf10 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20  he arguments of 
2cf20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65  an .** aggregate
2cf30 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72   function, in or
2cf40 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  der to implement
2cf50 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46   the.** sqlite3F
2cf60 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29  unctionThisSrc()
2cf70 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72   routine..*/.str
2cf80 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20  uct SrcCount {. 
2cf90 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
2cfa0 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75    /* One particu
2cfb0 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  lar FROM clause 
2cfc0 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65 72  in a nested quer
2cfd0 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73  y */.  int nThis
2cfe0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2cff0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2d000 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53  to columns in pS
2d010 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  rcList */.  int 
2d020 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20  nOther;      /* 
2d030 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
2d040 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
2d050 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  in other FROM cl
2d060 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  auses */.};../*.
2d070 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
2d080 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2d090 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  s to columns..*/
2d0a0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
2d0b0 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20  SrcCount(Walker 
2d0c0 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
2d0d0 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65  pExpr){.  /* The
2d0e0 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20   NEVER() on the 
2d0f0 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62  second term is b
2d100 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 46 75  ecause sqlite3Fu
2d110 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
2d120 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61  c().  ** is alwa
2d130 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  ys called before
2d140 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2d150 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
2d160 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20  and so the.  ** 
2d170 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20  TK_COLUMNs have 
2d180 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e  not yet been con
2d190 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41  verted into TK_A
2d1a0 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20  GG_COLUMN.  If. 
2d1b0 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74   ** sqlite3Funct
2d1c0 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29  ionUsesThisSrc()
2d1d0 20 69 73 20 75 73 65 64 20 64 69 66 66 65 72 65   is used differe
2d1e0 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75  ntly in the futu
2d1f0 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56  re, the.  ** NEV
2d200 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74  ER() will need t
2d210 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f  o be removed. */
2d220 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2d230 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e  ==TK_COLUMN || N
2d240 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  EVER(pExpr->op==
2d250 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29  TK_AGG_COLUMN) )
2d260 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2d270 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74   struct SrcCount
2d280 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75   *p = pWalker->u
2d290 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20  .pSrcCount;.    
2d2a0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
2d2b0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74  p->pSrc;.    int
2d2c0 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70   nSrc = pSrc ? p
2d2d0 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20  Src->nSrc : 0;. 
2d2e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
2d2f0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
2d300 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
2d310 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43  e==pSrc->a[i].iC
2d320 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
2d330 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e     }.    if( i<n
2d340 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Src ){.      p->
2d350 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nThis++;.    }el
2d360 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74  se{.      p->nOt
2d370 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  her++;.    }.  }
2d380 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2d390 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
2d3a0 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
2d3b0 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  y of the argumen
2d3c0 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20  ts to the pExpr 
2d3d0 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e  Function referen
2d3e0 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20  ce.** pSrcList. 
2d3f0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2d400 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72  they do.  Also r
2d410 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2d420 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  e function.** ha
2d430 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f  s no arguments o
2d440 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74  r has only const
2d450 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
2d460 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
2d470 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e  pExpr.** referen
2d480 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20  ces columns but 
2d490 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  not columns of t
2d4a0 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70  ables found in p
2d4b0 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  SrcList..*/.int 
2d4c0 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
2d4d0 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20  sesThisSrc(Expr 
2d4e0 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20  *pExpr, SrcList 
2d4f0 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61  *pSrcList){.  Wa
2d500 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74  lker w;.  struct
2d510 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20   SrcCount cnt;. 
2d520 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
2d530 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
2d540 49 4f 4e 20 29 3b 0a 20 20 77 2e 78 45 78 70 72  ION );.  w.xExpr
2d550 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53  Callback = exprS
2d560 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 78 53 65  rcCount;.  w.xSe
2d570 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30  lectCallback = 0
2d580 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e  ;.  w.u.pSrcCoun
2d590 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e  t = &cnt;.  cnt.
2d5a0 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b  pSrc = pSrcList;
2d5b0 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30  .  cnt.nThis = 0
2d5c0 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d  ;.  cnt.nOther =
2d5d0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   0;.  sqlite3Wal
2d5e0 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45  kExprList(&w, pE
2d5f0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
2d600 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69   return cnt.nThi
2d610 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65  s>0 || cnt.nOthe
2d620 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  r==0;.}../*.** A
2d630 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
2d640 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
2d650 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20  ->aCol[] array. 
2d660 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2d670 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
2d680 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
2d690 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
2d6a0 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
2d6b0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2d6c0 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  t addAggInfoColu
2d6d0 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  mn(sqlite3 *db, 
2d6e0 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
2d6f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
2d700 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65  o->aCol = sqlite
2d710 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
2d720 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
2d730 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20    pInfo->aCol,. 
2d740 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
2d750 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20  fo->aCol[0]),.  
2d760 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f       &pInfo->nCo
2d770 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a  lumn,.       &i.
2d780 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
2d790 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64  .}    ../*.** Ad
2d7a0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
2d7b0 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
2d7c0 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20  >aFunc[] array. 
2d7d0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2d7e0 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
2d7f0 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
2d800 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
2d810 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
2d820 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2d830 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  t addAggInfoFunc
2d840 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
2d850 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
2d860 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
2d870 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >aFunc = sqlite3
2d880 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
2d890 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20        db, .     
2d8a0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a    pInfo->aFunc,.
2d8b0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
2d8c0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a  nfo->aFunc[0]),.
2d8d0 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
2d8e0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  Func,.       &i.
2d8f0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
2d900 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .}    ../*.** Th
2d910 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43  is is the xExprC
2d920 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72  allback for a tr
2d930 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69  ee walker.  It i
2d940 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70  s used to.** imp
2d950 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78  lement sqlite3Ex
2d960 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2d970 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69  tes().  See sqli
2d980 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2d990 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20  gregates.** for 
2d9a0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
2d9b0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
2d9c0 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
2d9d0 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70  regate(Walker *p
2d9e0 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2d9f0 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
2da00 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
2da10 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
2da20 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  NC;.  Parse *pPa
2da30 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
2da40 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e;.  SrcList *pS
2da50 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
2da60 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66  rcList;.  AggInf
2da70 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e  o *pAggInfo = pN
2da80 43 2d 3e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 3b  C->uNC.pAggInfo;
2da90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ..  assert( pNC-
2daa0 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 55 41  >ncFlags & NC_UA
2dab0 67 67 49 6e 66 6f 20 29 3b 0a 20 20 73 77 69 74  ggInfo );.  swit
2dac0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
2dad0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
2dae0 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
2daf0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
2db00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2db10 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
2db20 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
2db30 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2db40 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2db50 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  );.      /* Chec
2db60 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
2db70 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65  column is in one
2db80 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
2db90 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20  n the FROM.     
2dba0 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
2dbb0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
2dbc0 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  y */.      if( A
2dbd0 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d  LWAYS(pSrcList!=
2dbe0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  0) ){.        st
2dbf0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2dc00 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
2dc10 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
2dc20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
2dc30 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
2dc40 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2dc50 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
2dc60 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
2dc70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2dc80 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2dc90 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
2dca0 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2dcb0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2dcc0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
2dcd0 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
2dce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2dcf0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
2dd00 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
2dd10 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65  ns that pExpr re
2dd20 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a  fers to a table.
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
2dd40 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52  hat is in the FR
2dd50 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
2dd60 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
2dd70 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
2dd80 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
2dd90 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
2dda0 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
2ddb0 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
2ddc0 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  [] if there.    
2ddd0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
2dde0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65  t an entry there
2ddf0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20   already..      
2de00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2de10 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
2de20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
2de30 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
2de40 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
2de50 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; k<pAggInfo->
2de60 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43  nColumn; k++, pC
2de70 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
2de80 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
2de90 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
2dea0 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
2deb0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2dec0 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
2ded0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
2dee0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2def0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2df00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2df10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2df20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  (k>=pAggInfo->nC
2df30 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20  olumn).         
2df40 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41      && (k = addA
2df50 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61  ggInfoColumn(pPa
2df60 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
2df70 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  o))>=0 .        
2df80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2df90 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
2dfa0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a  gInfo->aCol[k];.
2dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2dfc0 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ol->pTab = pExpr
2dfd0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
2dfe0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62        pCol->iTab
2dff0 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  le = pExpr->iTab
2e000 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
2e010 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20    pCol->iColumn 
2e020 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
2e030 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e040 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  pCol->iMem = ++p
2e050 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2e060 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2e070 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
2e080 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
2e090 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d     pCol->pExpr =
2e0a0 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
2e0b0 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e        if( pAggIn
2e0c0 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  fo->pGroupBy ){.
2e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0e0 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20  int j, n;.      
2e0f0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
2e100 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e  st *pGB = pAggIn
2e110 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20  fo->pGroupBy;.  
2e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
2e130 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2e140 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d  em *pTerm = pGB-
2e150 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >a;.            
2e160 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78      n = pGB->nEx
2e170 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2e180 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
2e190 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
2e1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e1b0 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54     Expr *pE = pT
2e1c0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
2e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2e1e0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pE->op==TK_COL
2e1f0 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c  UMN && pE->iTabl
2e200 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
2e210 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
2e220 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43            pE->iC
2e230 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
2e240 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
2e250 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2e260 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2e270 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
2e280 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2e290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e2a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2e2b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e2c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e2d0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
2e2e0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29  SorterColumn<0 )
2e2f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e300 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
2e310 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f  olumn = pAggInfo
2e320 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  ->nSortingColumn
2e330 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2e340 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2e350 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
2e360 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e   There is now an
2e370 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72   entry for pExpr
2e380 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
2e390 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20  ol[] (either.   
2e3a0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61           ** beca
2e3b0 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65  use it was there
2e3c0 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75   before or becau
2e3d0 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74  se we just creat
2e3e0 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20  ed it)..        
2e3f0 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74      ** Convert t
2e400 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61  he pExpr to be a
2e410 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72   TK_AGG_COLUMN r
2e420 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74  eferring to that
2e430 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2e440 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
2e450 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20   entry..        
2e460 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2e470 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2e480 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2e490 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
2e4a0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
2e4b0 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
2e4c0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
2e4d0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
2e4e0 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
2e4f0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
2e500 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20  g = (i16)k;.    
2e510 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2e520 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
2e530 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  dif pExpr->iTabl
2e540 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
2e550 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f  r */.        } /
2e560 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * end loop over 
2e570 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20  pSrcList */.    
2e580 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
2e590 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
2e5a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
2e5b0 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
2e5c0 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63      if( (pNC->nc
2e5d0 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67  Flags & NC_InAgg
2e5e0 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20  Func)==0.       
2e5f0 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  && pWalker->walk
2e600 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e  erDepth==pExpr->
2e610 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  op2.      ){.   
2e620 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
2e630 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73   see if pExpr is
2e640 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
2e650 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74  another aggregat
2e660 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  e .        ** fu
2e670 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61  nction that is a
2e680 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41  lready in the pA
2e690 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
2e6a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2e6b0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
2e6c0 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d  fo_func *pItem =
2e6d0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2e6e0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2e6f0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
2e700 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Func; i++, pItem
2e710 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2e720 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2e730 6d 70 61 72 65 28 30 2c 20 70 49 74 65 6d 2d 3e  mpare(0, pItem->
2e740 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31  pExpr, pExpr, -1
2e750 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2e760 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2e770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e780 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
2e790 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
2e7a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2e7b0 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61  pExpr is origina
2e7c0 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65  l.  Make a new e
2e7d0 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f  ntry in pAggInfo
2e7e0 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20  ->aFunc[].      
2e7f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2e800 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50   u8 enc = ENC(pP
2e810 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  arse->db);.     
2e820 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49       i = addAggI
2e830 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e  nfoFunc(pParse->
2e840 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20  db, pAggInfo);. 
2e850 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d           if( i>=
2e860 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2e870 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2e880 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2e890 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2e8a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2e8b0 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  tem = &pAggInfo-
2e8c0 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20  >aFunc[i];.     
2e8d0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45         pItem->pE
2e8e0 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
2e8f0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2e900 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
2e910 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
2e920 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2e930 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2e940 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
2e950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2e960 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71  Item->pFunc = sq
2e970 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
2e980 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
2e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9a0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
2e9b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2e9c0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70        pExpr->x.p
2e9d0 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e  List ? pExpr->x.
2e9e0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
2e9f0 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
2ea00 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
2ea10 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
2ea20 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20  tinct ){.       
2ea30 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
2ea40 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
2ea50 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
2ea60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ea70 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2ea80 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
2ea90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2eaa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2eab0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
2eac0 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e   Make pExpr poin
2ead0 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  t to the appropr
2eae0 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61  iate pAggInfo->a
2eaf0 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20  Func[] entry.   
2eb00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2eb10 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2eb20 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2eb30 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2eb40 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2eb50 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
2eb60 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2eb70 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
2eb80 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
2eb90 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20  = (i16)i;.      
2eba0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
2ebb0 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
2ebc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2ebd0 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65  _Prune;.      }e
2ebe0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
2ebf0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2ec00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ec10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
2ec20 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61  _Continue;.}.sta
2ec30 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
2ec40 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
2ec50 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
2ec60 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
2ec70 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ct){.  UNUSED_PA
2ec80 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29  RAMETER(pSelect)
2ec90 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c  ;.  pWalker->wal
2eca0 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20 20 72 65  kerDepth++;.  re
2ecb0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2ecc0 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  e;.}.static void
2ecd0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2ece0 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 28 57 61  esInSelectEnd(Wa
2ecf0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
2ed00 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
2ed10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2ed20 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  TER(pSelect);.  
2ed30 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44  pWalker->walkerD
2ed40 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  epth--;.}../*.**
2ed50 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78   Analyze the pEx
2ed60 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  pr expression lo
2ed70 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
2ed80 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
2ed90 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
2eda0 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
2edb0 62 65 20 61 64 64 65 64 20 74 6f 20 41 67 67 49  be added to AggI
2edc0 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20  nfo object that 
2edd0 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a  pNC->pAggInfo.**
2ede0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64   points to.  Add
2edf0 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20  itional entries 
2ee00 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20  are made on the 
2ee10 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61  AggInfo object a
2ee20 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a  s.** necessary..
2ee30 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2ee40 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
2ee50 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  e called after t
2ee60 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
2ee70 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a  s been.** analyz
2ee80 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73  ed by sqlite3Res
2ee90 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e  olveExprNames().
2eea0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2eeb0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2eec0 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78  gates(NameContex
2eed0 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45  t *pNC, Expr *pE
2eee0 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  xpr){.  Walker w
2eef0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2ef00 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ack = analyzeAgg
2ef10 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c  regate;.  w.xSel
2ef20 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e  ectCallback = an
2ef30 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
2ef40 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 78 53 65  nSelect;.  w.xSe
2ef50 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
2ef60 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2ef70 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b 0a 20 20  sInSelectEnd;.  
2ef80 77 2e 77 61 6c 6b 65 72 44 65 70 74 68 20 3d 20  w.walkerDepth = 
2ef90 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70  0;.  w.u.pNC = p
2efa0 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  NC;.  assert( pN
2efb0 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29  C->pSrcList!=0 )
2efc0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2efd0 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
2efe0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71  }../*.** Call sq
2eff0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2f000 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72  Aggregates() for
2f010 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
2f020 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65  n in an.** expre
2f030 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74  ssion list.  Ret
2f040 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2f050 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  f errors..**.** 
2f060 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66  If an error is f
2f070 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73  ound, the analys
2f080 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e  is is cut short.
2f090 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2f0a0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2f0b0 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  st(NameContext *
2f0c0 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  pNC, ExprList *p
2f0d0 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20  List){.  struct 
2f0e0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
2f0f0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
2f100 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
2f110 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
2f120 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
2f130 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
2f140 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2f150 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2f160 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43  zeAggregates(pNC
2f170 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
2f180 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2f190 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73  .** Allocate a s
2f1a0 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74  ingle new regist
2f1b0 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f  er for use to ho
2f1c0 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64  ld some intermed
2f1d0 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  iate result..*/.
2f1e0 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
2f1f0 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
2f200 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  rse){.  if( pPar
2f210 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20  se->nTempReg==0 
2f220 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b  ){.    return ++
2f230 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2f240 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  }.  return pPars
2f250 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50  e->aTempReg[--pP
2f260 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b  arse->nTempReg];
2f270 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
2f280 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c  cate a register,
2f290 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c   making availabl
2f2a0 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20  e for reuse for 
2f2b0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75  some other.** pu
2f2c0 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rpose..**.** If 
2f2d0 61 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75  a register is cu
2f2e0 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73  rrently being us
2f2f0 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e  ed by the column
2f300 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20   cache, then.** 
2f310 74 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e  the deallocation
2f320 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
2f330 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  il the column ca
2f340 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73  che line that us
2f350 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74  es.** the regist
2f360 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65  er becomes stale
2f370 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2f380 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2f390 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2f3a0 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20  nt iReg){.  if( 
2f3b0 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e  iReg && pParse->
2f3c0 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
2f3d0 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
2f3e0 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  Reg) ){.    int 
2f3f0 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43  i;.    struct yC
2f400 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20  olCache *p;.    
2f410 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
2f420 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
2f430 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
2f440 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
2f450 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d      if( p->iReg=
2f460 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20  =iReg ){.       
2f470 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b   p->tempReg = 1;
2f480 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
2f490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f4a0 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
2f4b0 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
2f4c0 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a  pReg++] = iReg;.
2f4d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
2f4e0 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63  ocate or dealloc
2f4f0 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e  ate a block of n
2f500 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20  Reg consecutive 
2f510 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e  registers..*/.in
2f520 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
2f530 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
2f540 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  rse, int nReg){.
2f550 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66    int i, n;.  if
2f560 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74 75  ( nReg==1 ) retu
2f570 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  rn sqlite3GetTem
2f580 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2f590 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
2f5a0 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
2f5b0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
2f5c0 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b    if( nReg<=n ){
2f5d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 75 73  .    assert( !us
2f5e0 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
2f5f0 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31  pParse, i, i+n-1
2f600 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ) );.    pParse-
2f610 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52  >iRangeReg += nR
2f620 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
2f630 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65  nRangeReg -= nRe
2f640 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
2f650 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  i = pParse->nMem
2f660 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
2f670 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
2f680 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
2f690 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
2f6a0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72  aseTempRange(Par
2f6b0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
2f6c0 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b  iReg, int nReg){
2f6d0 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29  .  if( nReg==1 )
2f6e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
2f6f0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
2f700 73 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 72  se, iReg);.    r
2f710 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
2f720 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
2f730 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67  ove(pParse, iReg
2f740 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e  , nReg);.  if( n
2f750 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg>pParse->nRan
2f760 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61  geReg ){.    pPa
2f770 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2f780 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
2f790 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69  e->iRangeReg = i
2f7a0 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
2f7b0 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f  * Mark all tempo
2f7c0 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
2f7d0 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61  s being unavaila
2f7e0 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ble for reuse..*
2f7f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  /.void sqlite3Cl
2f800 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
2f810 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
2f820 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52    pParse->nTempR
2f830 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  eg = 0;.  pParse
2f840 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
2f850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61  .}../*.** Valida
2f860 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f  te that no tempo
2f870 72 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61  rary register fa
2f880 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72  lls within the r
2f890 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73  ange of.** iFirs
2f8a0 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73  t..iLast, inclus
2f8b0 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ive.  This routi
2f8c0 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20  ne is only call 
2f8d0 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65  from within asse
2f8e0 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  rt().** statemen
2f8f0 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ts..*/.#ifdef SQ
2f900 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73  LITE_DEBUG.int s
2f910 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52  qlite3NoTempsInR
2f920 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
2f930 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20  se, int iFirst, 
2f940 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e  int iLast){.  in
2f950 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73  t i;.  if( pPars
2f960 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20  e->nRangeReg>0. 
2f970 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61    && pParse->iRa
2f980 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e  ngeReg+pParse->n
2f990 52 61 6e 67 65 52 65 67 20 3e 20 69 46 69 72 73  RangeReg > iFirs
2f9a0 74 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e  t.   && pParse->
2f9b0 69 52 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61  iRangeReg <= iLa
2f9c0 73 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74  st.  ){.     ret
2f9d0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  urn 0;.  }.  for
2f9e0 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
2f9f0 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a  nTempReg; i++){.
2fa00 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
2fa10 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69  aTempReg[i]>=iFi
2fa20 72 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61  rst && pParse->a
2fa30 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73  TempReg[i]<=iLas
2fa40 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
2fa50 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
2fa60 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
2fa70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
2fa80 42 55 47 20 2a 2f 0a                             BUG */.