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

Artifact 665eafd45010fe6aeb8952c07e44d913ac25aec72e9a0c8784c84aeb3cc14efe:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
0fd0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29  3ExprNNCollSeq()
0fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
0ff0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1000: 29 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65  ) works the same
1010: 20 65 78 61 63 74 20 74 68 61 74 20 69 74 20 72   exact that it r
1020: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65  eturns the.** de
1030: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1040: 69 66 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20  if pExpr has no 
1050: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
1060: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  n..**.** The col
1070: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1080: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
1090: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
10a0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
10b0: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
10c0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
10d0: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
10f0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
1100: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
1110: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
1120: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
1130: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
1140: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
1150: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1160: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1170: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1180: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1190: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
11b0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
11c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
11d0: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
11e0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
11f0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >op;.    if( p->
1200: 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72  flags & EP_Gener
1210: 69 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ic ) break;.    
1220: 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f  if( (op==TK_AGG_
1230: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
1240: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
1250: 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    || op==TK_REGI
1260: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54  STER || op==TK_T
1270: 52 49 47 47 45 52 29 0a 20 20 20 20 20 26 26 20  RIGGER).     && 
1280: 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20 29  p->pTab!=0.    )
1290: 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54  {.      /* op==T
12a0: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
12b0: 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73  >pTab!=0 happens
12c0: 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20   when pExpr was 
12d0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20  originally.     
12e0: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
12f0: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
1300: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
1310: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
1320: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  ister */.      i
1330: 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  nt j = p->iColum
1340: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d  n;.      if( j>=
1350: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
1360: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
1370: 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a   p->pTab->aCol[j
1380: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
1390: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
13a0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
13b0: 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
13c0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13e0: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
13f0: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1400: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1410: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1420: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1430: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1440: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1450: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1460: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
1470: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
1480: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
1490: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
14a0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
14b0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
14c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14d0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
14e0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
14f0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26   if( p->pLeft &&
1500: 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67   (p->pLeft->flag
1510: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
1520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20  =0 ){.        p 
1530: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
1540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1550: 20 45 78 70 72 20 2a 70 4e 65 78 74 20 20 3d 20   Expr *pNext  = 
1560: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1570: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
1580: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
1590: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
15a0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
15b0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
15c0: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
15d0: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
15e0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
15f0: 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20 68 6f 6c   /* p->flags hol
1600: 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65 20 61 6e  ds EP_Collate an
1610: 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  d p->pLeft->flag
1620: 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20 41 6e 64  s does not.  And
1630: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 78  .        ** p->x
1640: 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e 6f 74 2e  .pSelect cannot.
1650: 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e 70 4c 65    So if p->x.pLe
1660: 66 74 20 65 78 69 73 74 73 2c 20 69 74 20 6d 75  ft exists, it mu
1670: 73 74 20 68 6f 6c 64 20 61 74 0a 20 20 20 20 20  st hold at.     
1680: 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20     ** least one 
1690: 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54 68 75 73  EP_Collate. Thus
16a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
16b0: 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f 0a 20 20  wo ALWAYS. */.  
16c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 2e 70        if( p->x.p
16d0: 4c 69 73 74 21 3d 30 20 26 26 20 41 4c 57 41 59  List!=0 && ALWAY
16e0: 53 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  S(!ExprHasProper
16f0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
1700: 63 74 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ct)) ){.        
1710: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41     for(i=0; ALWA
1730: 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  YS(i<p->x.pList-
1740: 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a 20  >nExpr); i++){. 
1750: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 45             if( E
1760: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1770: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1780: 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61 74  pExpr, EP_Collat
1790: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
17a0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78      pNext = p->x
17b0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
17c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1800: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
1810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1820: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
1830: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1840: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
1850: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
1860: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
1870: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1880: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
1890: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
18a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18b0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
18c0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
18d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
18e0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
18f0: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
1900: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1910: 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f 6c 6c  .** defautl coll
1920: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
1930: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1950: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
1960: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1970: 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  q() routine work
1980: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
1990: 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72 65 74  t that it.** ret
19a0: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
19b0: 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64  re is no defined
19c0: 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 43   collation..*/.C
19d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
19e0: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50 61 72  xprNNCollSeq(Par
19f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1a00: 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c   *pExpr){.  Coll
1a10: 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Seq *p = sqlite3
1a20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1a30: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  se, pExpr);.  if
1a40: 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70 50 61  ( p==0 ) p = pPa
1a50: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1a60: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  ll;.  assert( p!
1a70: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
1a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a90: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 74 77  n TRUE if the tw
1aa0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 68 61  o expressions ha
1ab0: 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  ve equivalent co
1ac0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ad0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1ae0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63  3ExprCollSeqMatc
1af0: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
1b00: 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
1b10: 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c 53 65   *pE2){.  CollSe
1b20: 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71 6c 69  q *pColl1 = sqli
1b30: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b40: 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b 0a 20  (pParse, pE1);. 
1b50: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32   CollSeq *pColl2
1b60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
1b70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b80: 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  pE2);.  return s
1b90: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ba0: 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f  oll1->zName, pCo
1bb0: 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 3b 0a  ll2->zName)==0;.
1bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1bd0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
1be0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1bf0: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1c00: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1c10: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1c20: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1c30: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c40: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1c50: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1c60: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1c70: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1c80: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
1c90: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1ca0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
1cb0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
1cc0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
1cd0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1ce0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1cf0: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1d00: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1d10: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1d20: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1d30: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1d40: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1d50: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1d60: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1d70: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1d80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1d90: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1da0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
1db0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1dc0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
1dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1de0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1e00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1e10: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1e20: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1e30: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1e40: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1e50: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1e60: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1e70: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1e80: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1e90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1eb0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ec0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ed0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1ee0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1ef0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1f00: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1f10: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1f20: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1f30: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1f40: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1f50: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1f60: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1f70: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1f80: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1f90: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1fa0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1fb0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1fc0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1fd0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1fe0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1ff0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
2000: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
2010: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
2020: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
2030: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2040: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
2050: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
2060: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
2070: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
2080: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
2090: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
20a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
20b0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
20c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
20d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
20e0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
20f0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
2100: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
2110: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2120: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2130: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2140: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
2150: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2160: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
2170: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
2180: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
2190: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21a0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
21b0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
21c0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
21f0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
2200: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
2210: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
2220: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
2230: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
2240: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
2250: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
2260: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
2270: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
2280: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
2290: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
22a0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
22b0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
22c0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
22d0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
22e0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
22f0: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
2300: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
2310: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
2320: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
2330: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
2340: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
2350: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
2360: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
2370: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
2380: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
2390: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
23a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
23b0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
23c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
23d0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
23e0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
23f0: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2400: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2410: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2420: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2430: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2440: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2460: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2470: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2480: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
2490: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
24a0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
24b0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
24c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
24d0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
24e0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
24f0: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2500: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2510: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2520: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2530: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2540: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2550: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2560: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2570: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2580: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
2590: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
25a0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
25b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25c0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
25d0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
25e0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
25f0: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2600: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2610: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2620: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2630: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2640: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2650: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2660: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2670: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2680: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
2690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
26a0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
26b0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
26c0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
26d0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
26e0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
26f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2700: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2710: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2720: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2730: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2740: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2750: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2760: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2770: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2780: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
2790: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
27a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27b0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
27c0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
27d0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
27e0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
27f0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2800: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2810: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2820: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2830: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2840: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2850: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2860: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2870: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2880: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
2890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
28a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
28b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
28c0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
28d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
28e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
28f0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2900: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2910: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2920: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2940: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2950: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2960: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2970: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2980: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
2990: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
29a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
29b0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
29c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
29d0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
29e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
29f0: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2a00: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2a10: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2a20: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2a30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2a40: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2a50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2a70: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2a80: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
2a90: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
2aa0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
2ab0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
2ac0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
2ad0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
2ae0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2af0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2b00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2b10: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2b20: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2b30: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2b40: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2b50: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2b60: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2b70: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2b80: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
2b90: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
2ba0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2bb0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
2bc0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
2bd0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2c00: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2c10: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2c20: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2c30: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2c40: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2c60: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2c70: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2c80: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
2c90: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
2ca0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
2cb0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
2cc0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
2cd0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
2ce0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2cf0: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2d00: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2d10: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2d20: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2d30: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2d40: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2d50: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2d60: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2d70: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2d80: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
2d90: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
2da0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
2db0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
2dc0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
2dd0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
2de0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2e00: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2e10: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2e20: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2e30: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2e60: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2e70: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2e80: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2e90: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ea0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2eb0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ec0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ed0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2ee0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2ef0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2f00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2f10: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2f20: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2f30: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2f40: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2f50: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2f60: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2f70: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2f80: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2fb0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2fc0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2fd0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2fe0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2ff0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
3000: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
3010: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
3020: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
3030: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
3040: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
3050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3060: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
3070: 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70  bexpression of p
3080: 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74  Vector that is t
3090: 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d  he i-th.** colum
30a0: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
30b0: 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69  (numbered starti
30c0: 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65  ng with 0).  The
30d0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
30e0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73  ensure that i is
30f0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a   within range..*
3100: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3110: 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6c  is really a scal
3120: 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72 22  ar (and "scalar"
3130: 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20 73   here includes s
3140: 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68 61  ubqueries.** tha
3150: 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  t return a singl
3160: 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20  e column!) then 
3170: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20 75  return pVector u
3180: 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  nmodified..**.**
3190: 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e 73   pVector retains
31a0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
31b0: 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65 78  e returned subex
31c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
31d0: 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69 73  If the vector is
31e0: 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20   a (SELECT ...) 
31f0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
3200: 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73 0a  ion returned is.
3210: 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70 72  ** just the expr
3220: 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69  ession for the i
3230: 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
3240: 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
3250: 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65  may.** not be re
3260: 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ady for evaluati
3270: 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 74  on because the t
3280: 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73 20  able cursor has 
3290: 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
32a0: 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45  positioned..*/.E
32b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74  xpr *sqlite3Vect
32c0: 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45  orFieldSubexpr(E
32d0: 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e  xpr *pVector, in
32e0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
32f0: 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  i<sqlite3ExprVec
3300: 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29  torSize(pVector)
3310: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
3320: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56  3ExprIsVector(pV
3330: 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61 73  ector) ){.    as
3340: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f  sert( pVector->o
3350: 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72  p2==0 || pVector
3360: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
3370: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56 65  R );.    if( pVe
3380: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3390: 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e  ECT || pVector->
33a0: 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  op2==TK_SELECT )
33b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
33c0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
33d0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
33e0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
33f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
3400: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3410: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3420: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3430: 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  pVector;.}../*.*
3440: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
3450: 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20  turn a new Expr 
3460: 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65  object which whe
3470: 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73  n passed to.** s
3480: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
3490: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61   will generate a
34a0: 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64  ll necessary cod
34b0: 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  e to compute.** 
34c0: 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f  the iField-th co
34d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
34e0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56  or expression pV
34f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ector..**.** It 
3500: 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f  is ok for pVecto
3510: 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  r to be a scalar
3520: 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69   (as long as iFi
3530: 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e  eld==0).  .** In
3540: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
3550: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
3560: 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44  ike sqlite3ExprD
3570: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  up()..**.** The 
3580: 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20  caller owns the 
3590: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
35a0: 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70  ject and is resp
35b0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65  onsible for.** e
35c0: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
35d0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
35e0: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
35f0: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  freed..**.** The
3600: 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20   caller retains 
3610: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65  ownership of pVe
3620: 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f  ctor.  If pVecto
3630: 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54  r is a TK_SELECT
3640: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
3650: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77 69  turned object wi
3660: 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56 65  ll reference pVe
3670: 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63  ctor and so pVec
3680: 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a  tor must remain.
3690: 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ** valid for the
36a0: 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65 74   life of the ret
36b0: 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49  urned object.  I
36c0: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
36d0: 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61  K_VECTOR.** or a
36e0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
36f0: 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20  on, then it can 
3700: 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f  be deleted as so
3710: 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74 69  on as this routi
3720: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a  ne.** returns..*
3730: 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20  *.** A trick to 
3740: 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43  cause a TK_SELEC
3750: 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20  T pVector to be 
3760: 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72  deleted together
3770: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74   with.** the ret
3780: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3790: 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20 74  t is to attach t
37a0: 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68  he pVector to th
37b0: 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a  e pRight field.*
37c0: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
37d0: 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  d TK_SELECT_COLU
37e0: 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a  MN Expr object..
37f0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3800: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
3810: 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ld(.  Parse *pPa
3820: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3830: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3840: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3850: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
3860: 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20  ector.  List of 
3870: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61  expressions or a
3880: 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20   sub-SELECT */. 
3890: 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20   int iField     
38a0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
38b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
38c0: 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  tor to return */
38d0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74  .){.  Expr *pRet
38e0: 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d  ;.  if( pVector-
38f0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
3900: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  {.    assert( pV
3910: 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45  ector->flags & E
3920: 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20  P_xIsSelect );. 
3930: 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c     /* The TK_SEL
3940: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
3950: 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  node:.    **.   
3960: 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20   ** pLeft:      
3970: 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e       pVector con
3980: 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43  taining TK_SELEC
3990: 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e  T.  Not deleted.
39a0: 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20  .    ** pRight: 
39b0: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65           not use
39c0: 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76  d.  But recursiv
39d0: 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  ely deleted..   
39e0: 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20   ** iColumn:    
39f0: 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20       Index of a 
3a00: 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f  column in pVecto
3a10: 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a  r.    ** iTable:
3a20: 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20 74            0 or t
3a30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
3a40: 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53 20  umns on the LHS 
3a50: 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74  of an assignment
3a60: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
3a70: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
3a80: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
3a90: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3aa0: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3ab0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3ac0: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
3ad0: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
3ae0: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
3af0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
3b00: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
3b10: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3b20: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3b30: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3b40: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
3b50: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
3b60: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
3b70: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
3b80: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
3b90: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
3ba0: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3bb0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
3bc0: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
3bd0: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
3be0: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
3bf0: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
3c00: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3c10: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3c20: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3c30: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3c40: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3c50: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
3c60: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
3c70: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
3c80: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3c90: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3ca0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3cb0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
3cc0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Ret ){.      pRe
3cd0: 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69  t->iColumn = iFi
3ce0: 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  eld;.      pRet-
3cf0: 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72  >pLeft = pVector
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3d10: 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70  rt( pRet==0 || p
3d20: 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  Ret->iTable==0 )
3d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3d40: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
3d50: 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63  TK_VECTOR ) pVec
3d60: 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  tor = pVector->x
3d70: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
3d80: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65  ].pExpr;.    pRe
3d90: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
3da0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
3db0: 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a  Vector, 0);.  }.
3dc0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
3de0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f  ssion pExpr is o
3df0: 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54  f type TK_SELECT
3e00: 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
3e10: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69  to evaluate.** i
3e20: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  t. Return the re
3e30: 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20  gister in which 
3e40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
3e50: 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65  ored (or, if the
3e60: 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
3e70: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3e80: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  n one column, th
3e90: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3ea0: 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74  ray.** of regist
3eb0: 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65  ers in which the
3ec0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3ed0: 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  d)..**.** If pEx
3ee0: 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53  pr is not a TK_S
3ef0: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3f00: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
3f10: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
3f20: 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
3f30: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3f40: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
3f50: 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  eg = 0;.#ifndef 
3f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3f70: 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
3f80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3f90: 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c  ){.    reg = sql
3fa0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
3fb0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
3fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
3fd0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b  if.  return reg;
3fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
3ff0: 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74  nt pVector point
4000: 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78  s to a vector ex
4010: 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65  pression - eithe
4020: 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  r a TK_VECTOR.**
4030: 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68   or TK_SELECT th
4040: 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  at returns more 
4050: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e  than one column.
4060: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4070: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65  eturns.** the re
4080: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66  gister number of
4090: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
40a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
40b0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  lue of.** elemen
40c0: 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20  t iField of the 
40d0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  vector..**.** If
40e0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
40f0: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
4100: 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  on, then code fo
4110: 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a  r it must have .
4120: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4130: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
4140: 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73  the exprCodeSubs
4150: 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e  elect() routine.
4160: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
4170: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65   parameter regSe
4180: 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74  lect should be t
4190: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
41a0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
41b0: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s.** containing 
41c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
41d0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a  he sub-select. .
41e0: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
41f0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
4200: 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65  ECTOR, then code
4210: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
4220: 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67  ed field.** is g
4230: 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69  enerated. In thi
4240: 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65  s case (*pRegFre
4250: 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  e) may be set to
4260: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
4270: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  * a temporary re
4280: 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65  gister to be fre
4290: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
42a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
42b0: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
42c0: 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75  returning, outpu
42d0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70  t parameter (*pp
42e0: 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20  Expr) is set to 
42f0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4300: 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72  Expr object corr
4310: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65  esponding to ele
4320: 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68  ment iElem of th
4330: 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61  e vector..*/.sta
4340: 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74  tic int exprVect
4350: 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  orRegister(.  Pa
4360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
4390: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
43a0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
43b0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f      /* Vector to
43c0: 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74   extract element
43d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
43e0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4400: 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66  eld to extract f
4410: 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20  rom pVector */. 
4420: 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20   int regSelect, 
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
4450: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4460: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
4470: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
4480: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70       /* OUT: Exp
4490: 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20  ression element 
44a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72  */.  int *pRegFr
44b0: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
44c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d       /* OUT: Tem
44d0: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
44e0: 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70  ee */.){.  u8 op
44f0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a   = pVector->op;.
4500: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
4510: 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54  _VECTOR || op==T
4520: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70  K_REGISTER || op
4530: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
4540: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
4550: 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45  STER ){.    *ppE
4560: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63  xpr = sqlite3Vec
4570: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
4580: 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29  pVector, iField)
4590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 65  ;.    return pVe
45a0: 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69  ctor->iTable+iFi
45b0: 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  eld;.  }.  if( o
45c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
45d0: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56      *ppExpr = pV
45e0: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
45f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65  ->pEList->a[iFie
4600: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ld].pExpr;.     
4610: 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74  return regSelect
4620: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a  +iField;.  }.  *
4630: 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72  ppExpr = pVector
4640: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
4650: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65  eld].pExpr;.  re
4660: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
4670: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
4680: 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72   *ppExpr, pRegFr
4690: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ee);.}../*.** Ex
46a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
46b0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  s a comparison b
46c0: 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f  etween two vecto
46d0: 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74  r values. Comput
46e0: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
46f0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4700: 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c  n (1, 0, or NULL
4710: 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  ) and write that
4720: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  .** result into 
4730: 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a  register dest..*
4740: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4750: 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65  must satisfy the
4760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f   following preco
4770: 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  nditions:.**.** 
4780: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
4790: 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d  =TK_IS:      op=
47a0: 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53  =TK_EQ and p5==S
47b0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
47c0: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
47d0: 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d  =TK_ISNOT:   op=
47e0: 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53  =TK_NE and p5==S
47f0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
4800: 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20     otherwise:   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d               op=
4820: 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70  =pExpr->op and p
4830: 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76  5==0.*/.static v
4840: 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f  oid codeVectorCo
4850: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
4860: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
4870: 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  * Code generator
4880: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4890: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
48a0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
48b0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
48c0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
48d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
48e0: 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
48f0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4900: 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20  /.  u8 op,      
4910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
4920: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4930: 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
4940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4950: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20  QLITE_NULLEQ or 
4960: 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  zero */.){.  Vdb
4970: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4980: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c  Vdbe;.  Expr *pL
4990: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
49a0: 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft;.  Expr *pRig
49b0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
49c0: 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20  ht;.  int nLeft 
49d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
49e0: 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
49f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4a00: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e  egLeft = 0;.  in
4a10: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
4a20: 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20    u8 opx = op;. 
4a30: 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20   int addrDone = 
4a40: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4a50: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  abel(v);..  if( 
4a60: 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45 78  nLeft!=sqlite3Ex
4a70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69  prVectorSize(pRi
4a80: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
4a90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4aa0: 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
4ab0: 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72 65  isused");.    re
4ac0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4ad0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
4ae0: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
4af0: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
4b20: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20  p==TK_ISNOT .   
4b30: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72  ==TK_LT || pExpr
4b50: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20  ->op==TK_GT .   
4b60: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b70: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72  ==TK_LE || pExpr
4b80: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29  ->op==TK_GE .  )
4b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
4ba0: 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45  r->op==op || (pE
4bb0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26  xpr->op==TK_IS &
4bc0: 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20  & op==TK_EQ).   
4bd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78           || (pEx
4be0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
4bf0: 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29   && op==TK_NE) )
4c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c10: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d  0 || pExpr->op!=
4c20: 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  op );.  assert( 
4c30: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
4c40: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
4c50: 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53  op );..  p5 |= S
4c60: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20  QLITE_STOREP2;. 
4c70: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20   if( opx==TK_LE 
4c80: 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20  ) opx = TK_LT;. 
4c90: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20   if( opx==TK_GE 
4ca0: 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a  ) opx = TK_GT;..
4cb0: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4cc0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4cd0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4ce0: 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43  regRight = exprC
4cf0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
4d00: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20  rse, pRight);.. 
4d10: 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f   for(i=0; 1 /*Lo
4d20: 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65  op exits by "bre
4d30: 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20  ak"*/; i++){.   
4d40: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
4d50: 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  0, regFree2 = 0;
4d60: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a  .    Expr *pL, *
4d70: 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c  pR; .    int r1,
4d80: 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28   r2;.    assert(
4d90: 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74   i>=0 && i<nLeft
4da0: 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 65 78 70   );.    r1 = exp
4db0: 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28  rVectorRegister(
4dc0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 69  pParse, pLeft, i
4dd0: 2c 20 72 65 67 4c 65 66 74 2c 20 26 70 4c 2c 20  , regLeft, &pL, 
4de0: 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
4df0: 72 32 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52  r2 = exprVectorR
4e00: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
4e10: 70 52 69 67 68 74 2c 20 69 2c 20 72 65 67 52 69  pRight, i, regRi
4e20: 67 68 74 2c 20 26 70 52 2c 20 26 72 65 67 46 72  ght, &pR, &regFr
4e30: 65 65 32 29 3b 0a 20 20 20 20 63 6f 64 65 43 6f  ee2);.    codeCo
4e40: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
4e50: 2c 20 70 52 2c 20 6f 70 78 2c 20 72 31 2c 20 72  , pR, opx, r1, r
4e60: 32 2c 20 64 65 73 74 2c 20 70 35 29 3b 0a 20 20  2, dest, p5);.  
4e70: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
4e80: 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
4e90: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
4ea0: 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  t);.    testcase
4eb0: 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
4ec0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4ed0: 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 74 65  ==OP_Le);.    te
4ee0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
4ef0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4f00: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
4f10: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4f20: 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
4f30: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f40: 5f 47 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Ge);.    testca
4f50: 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
4f60: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f70: 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
4f80: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f90: 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ne); VdbeCoverag
4fa0: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29  eIf(v,op==OP_Ne)
4fb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
4fc0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
4fd0: 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
4fe0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4ff0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5000: 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20   regFree2);.    
5010: 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 31 20 29  if( i==nLeft-1 )
5020: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
5030: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 78     }.    if( opx
5040: 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 20  ==TK_EQ ){.     
5050: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5060: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
5070: 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b  dest, addrDone);
5080: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5090: 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d 20 53 51  ;.      p5 |= SQ
50a0: 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20  LITE_KEEPNULL;. 
50b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 78     }else if( opx
50c0: 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20 20 20 20 20  ==TK_NE ){.     
50d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
50e0: 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 64 65 73  p2(v, OP_If, des
50f0: 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56 64  t, addrDone); Vd
5100: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5110: 20 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54       p5 |= SQLIT
5120: 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20  E_KEEPNULL;.    
5130: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
5140: 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c  ert( op==TK_LT |
5150: 7c 20 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f  | op==TK_GT || o
5160: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p==TK_LE || op==
5170: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 73  TK_GE );.      s
5180: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5190: 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71  (v, OP_ElseNotEq
51a0: 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a  , 0, addrDone);.
51b0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
51c0: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
51d0: 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
51e0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
51f0: 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_GT);.      Vd
5200: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
5210: 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20  op==TK_LE);.    
5220: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
5230: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a  (v, op==TK_GE);.
5240: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65        if( i==nLe
5250: 66 74 2d 32 20 29 20 6f 70 78 20 3d 20 6f 70 3b  ft-2 ) opx = op;
5260: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
5270: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
5280: 61 62 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e 65  abel(v, addrDone
5290: 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  );.}..#if SQLITE
52a0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
52b0: 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  0./*.** Check th
52c0: 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69  at argument nHei
52d0: 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ght is less than
52e0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
52f0: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72   maximum.** expr
5300: 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c  ession depth all
5310: 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  owed. If it is n
5320: 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ot, leave an err
5330: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a  or message in.**
5340: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20   pParse..*/.int 
5350: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
5360: 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50  Height(Parse *pP
5370: 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68  arse, int nHeigh
5380: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
5390: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
53a0: 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73  mxHeight = pPars
53b0: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
53c0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
53d0: 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48  DEPTH];.  if( nH
53e0: 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29  eight>mxHeight )
53f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5400: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
5410: 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f        "Expressio
5420: 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61  n tree is too la
5430: 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70  rge (maximum dep
5440: 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68  th %d)", mxHeigh
5450: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20  t.    );.    rc 
5460: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
5470: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5480: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  .}../* The follo
5490: 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74  wing three funct
54a0: 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78  ions, heightOfEx
54b0: 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78  pr(), heightOfEx
54c0: 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20  prList().** and 
54d0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29  heightOfSelect()
54e0: 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65  , are used to de
54f0: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69  termine the maxi
5500: 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66  mum height.** of
5510: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
5520: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20  tree referenced 
5530: 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  by the structure
5540: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
5550: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
5560: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
5570: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69  maximum height i
5580: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
5590: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
55a0: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
55b0: 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20  y pnHeight, the 
55c0: 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
55d0: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65  , then set *pnHe
55e0: 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  ight to that.** 
55f0: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
5600: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
5610: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
5620: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
5630: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
5640: 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69  ->nHeight>*pnHei
5650: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  ght ){.      *pn
5660: 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69  Height = p->nHei
5670: 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ght;.    }.  }.}
5680: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5690: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78  ghtOfExprList(Ex
56a0: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a  prList *p, int *
56b0: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
56c0: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
56d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
56e0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  p->nExpr; i++){.
56f0: 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78        heightOfEx
5700: 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pr(p->a[i].pExpr
5710: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5720: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5730: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c  void heightOfSel
5740: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 53 65 6c  ect(Select *pSel
5750: 65 63 74 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67  ect, int *pnHeig
5760: 68 74 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ht){.  Select *p
5770: 3b 0a 20 20 66 6f 72 28 70 3d 70 53 65 6c 65 63  ;.  for(p=pSelec
5780: 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f  t; p; p=p->pPrio
5790: 72 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  r){.    heightOf
57a0: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
57b0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
57c0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
57d0: 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74  Having, pnHeight
57e0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
57f0: 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70  xpr(p->pLimit, p
5800: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5810: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5820: 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67  ->pEList, pnHeig
5830: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5840: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  fExprList(p->pGr
5850: 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29  oupBy, pnHeight)
5860: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5870: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
5880: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
5890: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
58a0: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
58b0: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
58c0: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
58d0: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
58e0: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
58f0: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
5900: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
5910: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
5920: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
5930: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
5940: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
5950: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
5960: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
5970: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
5980: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
5990: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
59a0: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a   plus one..**.**
59b0: 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20   Also propagate 
59c0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
59d0: 67 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e  gs up from Expr.
59e0: 78 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e  x.pList to Expr.
59f0: 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70  flags,.** if app
5a00: 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
5a10: 74 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74  tic void exprSet
5a20: 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b  Height(Expr *p){
5a30: 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d  .  int nHeight =
5a40: 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78   0;.  heightOfEx
5a50: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48  pr(p->pLeft, &nH
5a60: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
5a70: 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  OfExpr(p->pRight
5a80: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69  , &nHeight);.  i
5a90: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
5aa0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
5ab0: 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ct) ){.    heigh
5ac0: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70  tOfSelect(p->x.p
5ad0: 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74  Select, &nHeight
5ae0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
5af0: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
5b00: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5b10: 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  t(p->x.pList, &n
5b20: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e  Height);.    p->
5b30: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
5b40: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
5b50: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
5b60: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  x.pList);.  }.  
5b70: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
5b80: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
5b90: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
5ba0: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
5bb0: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
5bc0: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
5bd0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
5be0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
5bf0: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
5c00: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
5c10: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
5c20: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
5c30: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   pParse..**.** A
5c40: 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c  lso propagate al
5c50: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
5c60: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
5c70: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
5c80: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
5c90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
5ca0: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
5cb0: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
5cc0: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
5cd0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
5ce0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70   ) return;.  exp
5cf0: 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20  rSetHeight(p);. 
5d00: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
5d10: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
5d20: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a  p->nHeight);.}..
5d30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5d40: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
5d50: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
5d60: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
5d70: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65  d.** by the sele
5d80: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
5d90: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
5da0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
5db0: 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
5dc0: 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ht(Select *p){. 
5dd0: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
5de0: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
5df0: 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b  ct(p, &nHeight);
5e00: 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68  .  return nHeigh
5e10: 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42  t;.}.#else /* AB
5e20: 4f 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66  OVE:  Height enf
5e30: 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64  orcement enabled
5e40: 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74  .  BELOW: Height
5e50: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66   enforcement off
5e60: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67   */./*.** Propag
5e70: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5e80: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5e90: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5ea0: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
5eb0: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
5ec0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
5ed0: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
5ee0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5ef0: 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
5f00: 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78  ->x.pList && !Ex
5f10: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5f20: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
5f30: 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  {.    p->flags |
5f40: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
5f50: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5f60: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
5f70: 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  );.  }.}.#define
5f80: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
5f90: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
5fa0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
5fb0: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
5fc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
5fd0: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
5fe0: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
5ff0: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
6000: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
6010: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
6020: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
6030: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
6040: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
6050: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
6060: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
6070: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
6080: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
6090: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
60a0: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
60b0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
60c0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
60d0: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
60e0: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
60f0: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
6100: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
6110: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
6120: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
6130: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
6140: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
6150: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
6160: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  ting is performe
6170: 64 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  d.  The deQuote.
6180: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
6190: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
61a0: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
61b0: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
61c0: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
61d0: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
61e0: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
61f0: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
6200: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
6210: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
6220: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
6230: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
6240: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
6250: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
6260: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
6270: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
6280: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
6290: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
62a0: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
62b0: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
62c0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
62d0: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
62e0: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
62f0: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
6300: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
6310: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
6320: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
6330: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
6340: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
6350: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
6360: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
6370: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
6380: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
6390: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
63a0: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
63b0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
63c0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
63e0: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
63f0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29  3DbMallocRawNN()
6400: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6420: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6430: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  de */.  const To
6440: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20  ken *pToken,    
6450: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
6460: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
6470: 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  L */.  int dequo
6480: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
6490: 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74  * True to dequot
64a0: 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  e */.){.  Expr *
64b0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74  pNew;.  int nExt
64c0: 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  ra = 0;.  int iV
64d0: 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  alue = 0;..  ass
64e0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
64f0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
6500: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
6510: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
6520: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
6530: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
6540: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
6550: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
6560: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
6570: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  n->n+1;.      as
6580: 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20  sert( iValue>=0 
6590: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
65a0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
65b0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
65c0: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
65d0: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
65e0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e  ){.    memset(pN
65f0: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ew, 0, sizeof(Ex
6600: 70 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pr));.    pNew->
6610: 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20  op = (u8)op;.   
6620: 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31   pNew->iAgg = -1
6630: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e  ;.    if( pToken
6640: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45   ){.      if( nE
6650: 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xtra==0 ){.     
6660: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
6670: 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  = EP_IntValue|EP
6680: 5f 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 70  _Leaf;.        p
6690: 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
66a0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65  iValue;.      }e
66b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
66c0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
66d0: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
66e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
66f0: 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70  Token->z!=0 || p
6700: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20  Token->n==0 );. 
6710: 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65         if( pToke
6720: 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e  n->n ) memcpy(pN
6730: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54  ew->u.zToken, pT
6740: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
6750: 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  >n);.        pNe
6760: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b  w->u.zToken[pTok
6770: 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  en->n] = 0;.    
6780: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
6790: 26 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74  && sqlite3Isquot
67a0: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
67b0: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
67c0: 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54    if( pNew->u.zT
67d0: 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70  oken[0]=='"' ) p
67e0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
67f0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
6800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
6810: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
6820: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ken);.        }.
6830: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
6840: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
6850: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
6860: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
6870: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
6880: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
6890: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
68a0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
68b0: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
68c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
68d0: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
68e0: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
68f0: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
6900: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
6910: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6920: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
6930: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6940: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6950: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
6960: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6970: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6980: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6990: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
69a0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
69b0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
69c0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
69d0: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
69e0: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
69f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6a00: 28 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75  (zToken);.  retu
6a10: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
6a20: 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20  loc(db, op, &x, 
6a30: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  0);.}../*.** Att
6a40: 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65  ach subtrees pLe
6a50: 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f  ft and pRight to
6a60: 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70   the Expr node p
6a70: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  Root..**.** If p
6a80: 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Root==NULL that 
6a90: 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d  means that a mem
6aa0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
6ab0: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
6ac0: 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61  d..** In that ca
6ad0: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73  se, delete the s
6ae0: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
6af0: 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69  d pRight..*/.voi
6b00: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74  d sqlite3ExprAtt
6b10: 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73  achSubtrees(.  s
6b20: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78  qlite3 *db,.  Ex
6b30: 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70  pr *pRoot,.  Exp
6b40: 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72  r *pLeft,.  Expr
6b50: 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66   *pRight.){.  if
6b60: 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( pRoot==0 ){.  
6b70: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
6b80: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6b90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6ba0: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
6bb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6bc0: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
6bd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6be0: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
6bf0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68      pRoot->pRigh
6c00: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
6c10: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
6c20: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
6c30: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a   pRight->flags;.
6c40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
6c50: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  eft ){.      pRo
6c60: 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66  ot->pLeft = pLef
6c70: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6c80: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6c90: 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66  agate & pLeft->f
6ca0: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lags;.    }.    
6cb0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52  exprSetHeight(pR
6cc0: 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oot);.  }.}../*.
6cd0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45  ** Allocate an E
6ce0: 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a  xpr node which j
6cf0: 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20  oins as many as 
6d00: 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a  two subtrees..**
6d10: 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20  .** One or both 
6d20: 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20  of the subtrees 
6d30: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65  can be NULL.  Re
6d40: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6d50: 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70  o the new.** Exp
6d60: 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20  r node.  Or, if 
6d70: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
6d80: 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d  urs, set pParse-
6d90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6da0: 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73  d,.** free the s
6db0: 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75  ubtrees and retu
6dc0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72  rn NULL..*/.Expr
6dd0: 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a   *sqlite3PExpr(.
6de0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
6e00: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6e10: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
6e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
6e30: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
6e40: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6e60: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
6e70: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 20 20   Expr *pRight   
6e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
6e90: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a  t operand */.){.
6ea0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28    Expr *p;.  if(
6eb0: 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70   op==TK_AND && p
6ec0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
6ed0: 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 64  {.    /* Take ad
6ee0: 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72 74  vantage of short
6ef0: 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65 20 6f  -circuit false o
6f00: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
6f10: 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73  AND */.    p = s
6f20: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
6f30: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c  arse->db, pLeft,
6f40: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
6f50: 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e{.    p = sqlit
6f60: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
6f70: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
6f80: 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 69  of(Expr));.    i
6f90: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  f( p ){.      me
6fa0: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
6fb0: 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 20 20  f(Expr));.      
6fc0: 70 2d 3e 6f 70 20 3d 20 6f 70 20 26 20 54 4b 46  p->op = op & TKF
6fd0: 4c 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 70  LG_MASK;.      p
6fe0: 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20  ->iAgg = -1;.   
6ff0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
7000: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
7010: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20  (pParse->db, p, 
7020: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
7030: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a    }.  if( p ) {.
7040: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7050: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
7060: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
7070: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
7080: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65  }../*.** Add pSe
7090: 6c 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72  lect to the Expr
70a0: 2e 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64  .x.pSelect field
70b0: 2e 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20  .  Or, if pExpr 
70c0: 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20  is NULL (due.** 
70d0: 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  do a memory allo
70e0: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20  cation failure) 
70f0: 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
7100: 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a  pSelect object..
7110: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
7120: 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61  ExprAddSelect(Pa
7130: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
7140: 72 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74  r *pExpr, Select
7150: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66   *pSelect){.  if
7160: 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ( pExpr ){.    p
7170: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
7180: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45  = pSelect;.    E
7190: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
71a0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
71b0: 63 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b  ct|EP_Subquery);
71c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
71d0: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
71e0: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  s(pParse, pExpr)
71f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7200: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
7210: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7220: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
7230: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
7240: 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  e->db, pSelect);
7250: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  .  }.}.../*.** I
7260: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
7270: 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
7280: 72 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20  r TRUE or FALSE 
7290: 28 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a  (respectively),.
72a0: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31  ** then return 1
72b0: 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  .  If one cannot
72c0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74   determine the t
72d0: 72 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68  ruth value of th
72e0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
72f0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
7300: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
7310: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
7320: 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20  ization.  If is 
7330: 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68  OK to return 0 h
7340: 65 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74  ere even if.** t
7350: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
7360: 61 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66  ally is always f
7370: 61 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61  alse or false (a
7380: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29   false negative)
7390: 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61  ..** But it is a
73a0: 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31   bug to return 1
73b0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
73c0: 6f 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69  on might have di
73d0: 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65  fferent.** boole
73e0: 61 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66  an values in dif
73f0: 66 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61  ferent circumsta
7400: 6e 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f  nces (a false po
7410: 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e  sitive.).**.** N
7420: 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20  ote that if the 
7430: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61  expression is pa
7440: 72 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61  rt of conditiona
7450: 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20  l for a.** LEFT 
7460: 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61  JOIN, then we ca
7470: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61  nnot determine a
7480: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
7490: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
74a0: 20 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66   is it true or f
74b0: 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20  alse, so always 
74c0: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
74d0: 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61  tic int exprAlwa
74e0: 79 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b  ysTrue(Expr *p){
74f0: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
7500: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
7510: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
7520: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
7530: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
7540: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
7550: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
7560: 20 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a   return v!=0;.}.
7570: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
7580: 6c 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20  lwaysFalse(Expr 
7590: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
75a0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
75b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
75c0: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
75d0: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
75e0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
75f0: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
7600: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30  0;.  return v==0
7610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
7620: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
7630: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
7640: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
7650: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
7660: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
7670: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
7680: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
7690: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64  **.** If one sid
76a0: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
76b0: 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f  f the AND is kno
76c0: 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20  wn to be false, 
76d0: 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20  then instead.** 
76e0: 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  of returning an 
76f0: 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  AND expression, 
7700: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
7710: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
7720: 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75  n with.** a valu
7730: 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45  e of false..*/.E
7740: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
7750: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
7760: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
7770: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
7780: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
7790: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
77a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
77b0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
77c0: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
77d0: 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
77e0: 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20  aysFalse(pLeft) 
77f0: 7c 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  || exprAlwaysFal
7800: 73 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  se(pRight) ){.  
7810: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7820: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
7830: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7840: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
7850: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
7860: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
7870: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
7880: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
7890: 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  [0], 0);.  }else
78a0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
78b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
78c0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20  loc(db, TK_AND, 
78d0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
78e0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
78f0: 72 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70  rees(db, pNew, p
7900: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
7910: 20 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a     return pNew;.
7920: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
7930: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
7940: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
7950: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
7960: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67   multiple.** arg
7970: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20  uments..*/.Expr 
7980: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63  *sqlite3ExprFunc
7990: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
79a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
79b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
79c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
79d0: 70 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 41  pList,      /* A
79e0: 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a  rgument list */.
79f0: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c    Token *pToken,
7a00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
7a10: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
7a20: 2a 2f 0a 20 20 69 6e 74 20 65 44 69 73 74 69 6e  */.  int eDistin
7a30: 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 46  ct         /* SF
7a40: 5f 44 69 73 74 69 6e 63 74 20 6f 72 20 53 46 5f  _Distinct or SF_
7a50: 41 4c 4c 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20  ALL or 0 */.){. 
7a60: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73   Expr *pNew;.  s
7a70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7a80: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
7a90: 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70  t( pToken );.  p
7aa0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
7ab0: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55  rAlloc(db, TK_FU
7ac0: 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20  NCTION, pToken, 
7ad0: 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  1);.  if( pNew==
7ae0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7af0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
7b00: 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76  b, pList); /* Av
7b10: 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20  oid memory leak 
7b20: 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  when malloc fail
7b30: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
7b40: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
7b50: 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 45 78  st && pList->nEx
7b60: 70 72 20 3e 20 70 50 61 72 73 65 2d 3e 64 62 2d  pr > pParse->db-
7b70: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7b80: 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
7b90: 47 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  G] ){.    sqlite
7ba0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7bb0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75  , "too many argu
7bc0: 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69 6f  ments on functio
7bd0: 6e 20 25 54 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a  n %T", pToken);.
7be0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c    }.  pNew->x.pL
7bf0: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45  ist = pList;.  E
7c00: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
7c10: 4e 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29  New, EP_HasFunc)
7c20: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
7c30: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7c40: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
7c50: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
7c60: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
7c70: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
7c80: 3b 0a 20 20 69 66 28 20 65 44 69 73 74 69 6e 63  ;.  if( eDistinc
7c90: 74 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  t==SF_Distinct )
7ca0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
7cb0: 28 70 4e 65 77 2c 20 45 50 5f 44 69 73 74 69 6e  (pNew, EP_Distin
7cc0: 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ct);.  return pN
7cd0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
7ce0: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
7cf0: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
7d00: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
7d10: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
7d20: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
7d30: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
7d40: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
7d50: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
7d60: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
7d70: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
7d80: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
7d90: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
7da0: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
7db0: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
7dc0: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
7dd0: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
7de0: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
7df0: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
7e00: 6f 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61 76  ot too big to av
7e10: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
7e20: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
7e30: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
7e40: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
7e50: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
7e60: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
7e70: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
7e80: 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61  orm ":aaa", "@aa
7e90: 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72  a", or "$aaa" ar
7ea0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
7eb0: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
7ec0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
7ed0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
7ee0: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
7ef0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
7f00: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
7f10: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
7f20: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
7f30: 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20  ential variable 
7f40: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
7f50: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
7f60: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
7f70: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
7f80: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
7f90: 45 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20  Expr, u32 n){.  
7fa0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7fb0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73  arse->db;.  cons
7fc0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56  t char *z;.  ynV
7fd0: 61 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45 78  ar x;..  if( pEx
7fe0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
7ff0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
8000: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
8010: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  , EP_IntValue|EP
8020: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
8030: 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20  nOnly) );.  z = 
8040: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
8050: 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20  .  assert( z!=0 
8060: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30  );.  assert( z[0
8070: 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ]!=0 );.  assert
8080: 28 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74 65  ( n==(u32)sqlite
8090: 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a  3Strlen30(z) );.
80a0: 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b    if( z[1]==0 ){
80b0: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
80c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22   of the form "?"
80d0: 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65  .  Assign the ne
80e0: 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  xt variable numb
80f0: 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  er */.    assert
8100: 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20  ( z[0]=='?' );. 
8110: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b     x = (ynVar)(+
8120: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
8130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
8140: 20 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20   doAdd = 0;.    
8150: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
8160: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
8170: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
8180: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
8190: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
81a0: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
81b0: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
81c0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
81d0: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
81e0: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20       int bOk;.  
81f0: 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20      if( n==2 ){ 
8200: 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49  /*OPTIMIZATION-I
8210: 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20  F-TRUE*/.       
8220: 20 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20   i = z[1]-'0';  
8230: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
8240: 73 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73  se of ?N for a s
8250: 69 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f  ingle digit N */
8260: 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31  .        bOk = 1
8270: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8280: 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d         bOk = 0==
8290: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a  sqlite3Atoi64(&z
82a0: 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51  [1], &i, n-1, SQ
82b0: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
82c0: 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
82d0: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
82e0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
82f0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8300: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
8310: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
8320: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
8330: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
8340: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
8350: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8360: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
8370: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
8380: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
8390: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
83a0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
83b0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
83c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
83d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
83e0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
83f0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
8400: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
8410: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
8420: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
8430: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
8440: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
8450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8460: 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20  x = (ynVar)i;.  
8470: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
8480: 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ->nVar ){.      
8490: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
84a0: 20 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20   (int)x;.       
84b0: 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20   doAdd = 1;.    
84c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
84d0: 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d  te3VListNumToNam
84e0: 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  e(pParse->pVList
84f0: 2c 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , x)==0 ){.     
8500: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8510: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
8520: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
8530: 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c  rds like ":aaa",
8540: 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61   "$aaa" or "@aaa
8550: 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61  ".  Reuse the sa
8560: 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  me variable.    
8570: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
8580: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
8590: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
85a0: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
85b0: 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  name.      ** ha
85c0: 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64  s never appeared
85d0: 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74   before, reuse t
85e0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
85f0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f   number.      */
8600: 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61  .      x = (ynVa
8610: 72 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61  r)sqlite3VListNa
8620: 6d 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e  meToNum(pParse->
8630: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20  pVList, z, n);. 
8640: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b       if( x==0 ){
8650: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e  .        x = (yn
8660: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
8670: 56 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f  Var);.        do
8680: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
8690: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
86a0: 6f 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50  oAdd ){.      pP
86b0: 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73  arse->pVList = s
86c0: 71 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28 64  qlite3VListAdd(d
86d0: 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  b, pParse->pVLis
86e0: 74 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20  t, z, n, x);.   
86f0: 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e   }.  }.  pExpr->
8700: 69 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69  iColumn = x;.  i
8710: 66 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  f( x>db->aLimit[
8720: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
8730: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
8740: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8750: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
8760: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
8770: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
8780: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
8790: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
87a0: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73  ssion tree..*/.s
87b0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
87c0: 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74  NLINE void sqlit
87d0: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73  e3ExprDeleteNN(s
87e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
87f0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
8800: 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e  p!=0 );.  /* San
8810: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
8820: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
8830: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
8840: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
8850: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
8860: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8870: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
8880: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
8890: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
88a0: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 45 78  E_DEBUG.  if( Ex
88b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
88c0: 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21 45 78   EP_Leaf) && !Ex
88d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
88e0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
88f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8900: 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20  >pLeft==0 );.   
8910: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
8920: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht==0 );.    ass
8930: 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63  ert( p->x.pSelec
8940: 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  t==0 );.  }.#end
8950: 69 66 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  if.  if( !ExprHa
8960: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28 45 50  sProperty(p, (EP
8970: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65  _TokenOnly|EP_Le
8980: 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  af)) ){.    /* T
8990: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
89a0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
89b0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
89c0: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
89d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
89e0: 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d  x.pList==0 || p-
89f0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8a00: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26    if( p->pLeft &
8a10: 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  & p->op!=TK_SELE
8a20: 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69  CT_COLUMN ) sqli
8a30: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8a40: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
8a50: 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
8a60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8a70: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62  3ExprDeleteNN(db
8a80: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
8a90: 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
8aa0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8ab0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
8ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
8ad0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
8ae0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
8af0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8b00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8b10: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  ete(db, p->x.pLi
8b20: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
8b30: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8b40: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
8b50: 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  d) ){.      sqli
8b60: 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28  te3WindowDelete(
8b70: 64 62 2c 20 70 2d 3e 70 57 69 6e 29 3b 0a 20 20  db, p->pWin);.  
8b80: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 45 78    }.  }.  if( Ex
8b90: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8ba0: 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20   EP_MemToken) ) 
8bb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8bc0: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
8bd0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
8be0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61  operty(p, EP_Sta
8bf0: 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  tic) ){.    sqli
8c00: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
8c10: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
8c20: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8c30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
8c40: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
8c50: 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  ) sqlite3ExprDel
8c60: 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a  eteNN(db, p);.}.
8c70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8c80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
8c90: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
8ca0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
8cb0: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73  tructure .** pas
8cc0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
8cd0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20   argument. This 
8ce0: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
8cf0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a   EXPR_FULLSIZE,.
8d00: 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44 53  ** EXPR_REDUCEDS
8d10: 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45  IZE or EXPR_TOKE
8d20: 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74  NONLYSIZE..*/.st
8d30: 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74 72  atic int exprStr
8d40: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29  uctSize(Expr *p)
8d50: 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  {.  if( ExprHasP
8d60: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
8d70: 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  kenOnly) ) retur
8d80: 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  n EXPR_TOKENONLY
8d90: 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72  SIZE;.  if( Expr
8da0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8db0: 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65 74  P_Reduced) ) ret
8dc0: 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44  urn EXPR_REDUCED
8dd0: 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45  SIZE;.  return E
8de0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a  XPR_FULLSIZE;.}.
8df0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64  ./*.** The duped
8e00: 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74  Expr*Size() rout
8e10: 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72 6e  ines each return
8e20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
8e30: 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  ytes required.**
8e40: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79   to store a copy
8e50: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
8e60: 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  n or expression 
8e70: 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66 66  tree.  They diff
8e80: 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63  er in.** how muc
8e90: 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69 73  h of the tree is
8ea0: 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a   measured..**.**
8eb0: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 74       dupedExprSt
8ec0: 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20 53  ructSize()     S
8ed0: 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20  ize of only the 
8ee0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 0a  Expr structure .
8ef0: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
8f00: 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20 20  NodeSize()      
8f10: 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20   Size of Expr + 
8f20: 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a  space for token.
8f30: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
8f40: 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20 20  Size()          
8f50: 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20   Expr + token + 
8f60: 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e  subtree componen
8f70: 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ts.**.**********
8f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fc0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  *.**.** The dupe
8fd0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
8fe0: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
8ff0: 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52  ns two values OR
9000: 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a  -ed together:  .
9010: 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63 65  ** (1) the space
9020: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20   required for a 
9030: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
9040: 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20   structure only 
9050: 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20  and .** (2) the 
9060: 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61  EP_xxx flags tha
9070: 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20  t indicate what 
9080: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73 69  the structure si
9090: 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a  ze should be..**
90a0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
90b0: 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  es is always one
90c0: 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   of:.**.**      
90d0: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a  EXPR_FULLSIZE.**
90e0: 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55 43        EXPR_REDUC
90f0: 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65  EDSIZE   | EP_Re
9100: 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58  duced.**      EX
9110: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
9120: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a   | EP_TokenOnly.
9130: 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  **.** The size o
9140: 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
9150: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
9160: 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75  masking the retu
9170: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  rn value.** of t
9180: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
9190: 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61   0xfff.  The fla
91a0: 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  gs can be found 
91b0: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a  by masking the.*
91c0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  * return value w
91d0: 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ith EP_Reduced|E
91e0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a  P_TokenOnly..**.
91f0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74  ** Note that wit
9200: 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  h flags==EXPRDUP
9210: 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f  _REDUCE, this ro
9220: 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20  utines works on 
9230: 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e  full-size.** (un
9240: 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f 62  reduced) Expr ob
9250: 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f 72  jects as they or
9260: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73   originally cons
9270: 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20 70  tructed by the p
9280: 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67  arser..** During
9290: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
92a0: 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f  ysis, extra info
92b0: 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75  rmation is compu
92c0: 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e  ted and moved in
92d0: 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74  to.** later part
92e0: 73 20 6f 66 20 74 68 65 20 45 78 70 72 20 6f 62  s of the Expr ob
92f0: 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65 78  ject and that ex
9300: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
9310: 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70 65  might get choppe
9320: 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20  d.** off if the 
9330: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
9340: 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73  duced.  Note als
9350: 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  o that it does n
9360: 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61  ot work to.** ma
9370: 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52 45  ke an EXPRDUP_RE
9380: 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72  DUCE copy of a r
9390: 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69 6f  educed expressio
93a0: 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c  n.  It is only l
93b0: 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63  egal.** to reduc
93c0: 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78 70  e a pristine exp
93d0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f  ression tree fro
93e0: 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 54  m the parser.  T
93f0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
9400: 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70  n.** of dupedExp
9410: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f  rStructSize() co
9420: 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61  ntain multiple a
9430: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
9440: 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  ts that attempt.
9450: 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ** to enforce th
9460: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a  is constraint..*
9470: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
9480: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
9490: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
94a0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  ags){.  int nSiz
94b0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  e;.  assert( fla
94c0: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
94d0: 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29  CE || flags==0 )
94e0: 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c  ; /* Only one fl
94f0: 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64  ag value allowed
9500: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 58   */.  assert( EX
9510: 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66  PR_FULLSIZE<=0xf
9520: 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ff );.  assert( 
9530: 28 30 78 66 66 66 20 26 20 28 45 50 5f 52 65 64  (0xfff & (EP_Red
9540: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9550: 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  y))==0 );.  if( 
9560: 30 3d 3d 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f  0==flags || p->o
9570: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
9580: 55 4d 4e 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  UMN .#ifndef SQL
9590: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
95a0: 55 4e 43 0a 20 20 20 7c 7c 20 70 2d 3e 70 57 69  UNC.   || p->pWi
95b0: 6e 20 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  n .#endif.  ){. 
95c0: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
95d0: 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73  FULLSIZE;.  }els
95e0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  e{.    assert( !
95f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9600: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
9610: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
9620: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9630: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9640: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a  P_FromJoin) ); .
9650: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9660: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9670: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a  EP_MemToken) );.
9680: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9690: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
96a0: 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a  EP_NoReduce) );.
96b0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
96c0: 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   || p->x.pList )
96d0: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
96e0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
96f0: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20   | EP_Reduced;. 
9700: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9710: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
9720: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53  t==0 );.      nS
9730: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
9740: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
9750: 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20  kenOnly;.    }. 
9760: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a   }.  return nSiz
9770: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
9780: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
9790: 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62  s the space in b
97a0: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
97b0: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
97c0: 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20  .** of the Expr 
97d0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
97e0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
97f0: 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  .u.zToken string
9800: 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72   (if that.** str
9810: 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29  ing is defined.)
9820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9830: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
9840: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
9850: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
9860: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
9870: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
9880: 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28  ) & 0xfff;.  if(
9890: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
98a0: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
98b0: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
98c0: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
98d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
98e0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b  (p->u.zToken)+1;
98f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f  .  }.  return RO
9900: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a  UND8(nByte);.}..
9910: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
9920: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9930: 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65   required to cre
9940: 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ate a duplicate 
9950: 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  of the .** expre
9960: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
9970: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
9980: 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  nt. The second a
9990: 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
99a0: 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mask containing 
99b0: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
99c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  s..**.** The val
99d0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  ue returned incl
99e0: 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72  udes space to cr
99f0: 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
9a00: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a  he Expr struct.*
9a10: 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65  * itself and the
9a20: 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64   buffer referred
9a30: 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54   to by Expr.u.zT
9a40: 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a  oken, if any..**
9a50: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
9a60: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
9a70: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
9a80: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63  return value inc
9a90: 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20  ludes .** space 
9aa0: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c  to duplicate all
9ab0: 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74   Expr nodes in t
9ac0: 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62  he tree formed b
9ad0: 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a  y Expr.pLeft .**
9ae0: 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74   and Expr.pRight
9af0: 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20   variables (but 
9b00: 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75  not for any stru
9b10: 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74  ctures pointed t
9b20: 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64  o or .** descend
9b30: 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  ed from the Expr
9b40: 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72  .x.pList or Expr
9b50: 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61  .x.pSelect varia
9b60: 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  bles)..*/.static
9b70: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69   int dupedExprSi
9b80: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
9b90: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
9ba0: 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  yte = 0;.  if( p
9bb0: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
9bc0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
9bd0: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
9be0: 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44   if( flags&EXPRD
9bf0: 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20  UP_REDUCE ){.   
9c00: 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65     nByte += dupe
9c10: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65  dExprSize(p->pLe
9c20: 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70  ft, flags) + dup
9c30: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52  edExprSize(p->pR
9c40: 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ight, flags);.  
9c50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9c60: 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nByte;.}../*.**
9c70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
9c80: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
9c90: 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65  ite3ExprDup(), e
9ca0: 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a  xcept that if pz
9cb0: 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f  Buffer .** is no
9cc0: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42  t NULL then *pzB
9cd0: 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64  uffer is assumed
9ce0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
9cf0: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
9d00: 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  gh .** to store 
9d10: 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72  the copy of expr
9d20: 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f  ession p, the co
9d30: 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f  pies of p->u.zTo
9d40: 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69  ken.** (if appli
9d50: 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20  cable), and the 
9d60: 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d  copies of the p-
9d70: 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52  >pLeft and p->pR
9d80: 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ight expressions
9d90: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66  ,.** if any. Bef
9da0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
9db0: 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20  pzBuffer is set 
9dc0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
9dd0: 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f  e past the.** po
9de0: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66  rtion of the buf
9df0: 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  fer copied into 
9e00: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
9e10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
9e20: 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65   *exprDup(sqlite
9e30: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
9e40: 69 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38  int dupFlags, u8
9e50: 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20   **pzBuffer){.  
9e60: 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20  Expr *pNew;     
9e70: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
9e80: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38  o return */.  u8
9e90: 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20   *zAlloc;       
9ea0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70      /* Memory sp
9eb0: 61 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ace from which t
9ec0: 6f 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a  o build Expr obj
9ed0: 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61  ect */.  u32 sta
9ee0: 74 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  ticFlag;       /
9ef0: 2a 20 45 50 5f 53 74 61 74 69 63 20 69 66 20 73  * EP_Static if s
9f00: 70 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65  pace not obtaine
9f10: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f  d from malloc */
9f20: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
9f30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9f40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75   );.  assert( du
9f50: 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70  pFlags==0 || dup
9f60: 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  Flags==EXPRDUP_R
9f70: 45 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72  EDUCE );.  asser
9f80: 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c  t( pzBuffer==0 |
9f90: 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52  | dupFlags==EXPR
9fa0: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20  DUP_REDUCE );.. 
9fb0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
9fc0: 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
9fd0: 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63  e new Expr struc
9fe0: 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ture. */.  if( p
9ff0: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a  zBuffer ){.    z
a000: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
a010: 72 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61  r;.    staticFla
a020: 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20  g = EP_Static;. 
a030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c   }else{.    zAll
a040: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
a050: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75  llocRawNN(db, du
a060: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64  pedExprSize(p, d
a070: 75 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73  upFlags));.    s
a080: 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20  taticFlag = 0;. 
a090: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70   }.  pNew = (Exp
a0a0: 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69  r *)zAlloc;..  i
a0b0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f  f( pNew ){.    /
a0c0: 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74  * Set nNewSize t
a0d0: 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63  o the size alloc
a0e0: 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72  ated for the str
a0f0: 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
a100: 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77  o.    ** by pNew
a110: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
a120: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
a130: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
a140: 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f   or.    ** EXPR_
a150: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e  TOKENONLYSIZE. n
a160: 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20  Token is set to 
a170: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
a180: 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20  tes consumed.   
a190: 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20   ** by the copy 
a1a0: 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  of the p->u.zTok
a1b0: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e  en string (if an
a1c0: 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  y)..    */.    c
a1d0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53  onst unsigned nS
a1e0: 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65  tructSize = dupe
a1f0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
a200: 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  p, dupFlags);.  
a210: 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77    const int nNew
a220: 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69  Size = nStructSi
a230: 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20  ze & 0xfff;.    
a240: 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  int nToken;.    
a250: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
a260: 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61  erty(p, EP_IntVa
a270: 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f  lue) && p->u.zTo
a280: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f  ken ){.      nTo
a290: 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ken = sqlite3Str
a2a0: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
a2b0: 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73  n) + 1;.    }els
a2c0: 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  e{.      nToken 
a2d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
a2e0: 66 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20  f( dupFlags ){. 
a2f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
a300: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a310: 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29  EP_Reduced)==0 )
a320: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
a330: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69  Alloc, p, nNewSi
a340: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
a350: 20 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20        u32 nSize 
a360: 3d 20 28 75 33 32 29 65 78 70 72 53 74 72 75 63  = (u32)exprStruc
a370: 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20  tSize(p);.      
a380: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
a390: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , nSize);.      
a3a0: 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46  if( nSize<EXPR_F
a3b0: 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20  ULLSIZE ){ .    
a3c0: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c      memset(&zAll
a3d0: 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58  oc[nSize], 0, EX
a3e0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a  PR_FULLSIZE-nSiz
a3f0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
a400: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
a410: 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50  e EP_Reduced, EP
a420: 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20  _TokenOnly, and 
a430: 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20  EP_Static flags 
a440: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a  appropriately. *
a450: 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  /.    pNew->flag
a460: 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65  s &= ~(EP_Reduce
a470: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  d|EP_TokenOnly|E
a480: 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54  P_Static|EP_MemT
a490: 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d  oken);.    pNew-
a4a0: 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63  >flags |= nStruc
a4b0: 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75  tSize & (EP_Redu
a4c0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
a4d0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  );.    pNew->fla
a4e0: 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67  gs |= staticFlag
a4f0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  ;..    /* Copy t
a500: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
a510: 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a  tring, if any. *
a520: 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e  /.    if( nToken
a530: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
a540: 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75  zToken = pNew->u
a550: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
a560: 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a  )&zAlloc[nNewSiz
a570: 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  e];.      memcpy
a580: 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54  (zToken, p->u.zT
a590: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
a5a0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d     }..    if( 0=
a5b0: 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77  =((p->flags|pNew
a5c0: 2d 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54  ->flags) & (EP_T
a5d0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66  okenOnly|EP_Leaf
a5e0: 29 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  )) ){.      /* F
a5f0: 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d  ill in the pNew-
a600: 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e  >x.pSelect or pN
a610: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62  ew->x.pList memb
a620: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  er. */.      if(
a630: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a640: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
a650: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
a660: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73  w->x.pSelect = s
a670: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
a680: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
a690: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
a6a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a6b0: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
a6c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
a6d0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c  tDup(db, p->x.pL
a6e0: 69 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  ist, dupFlags);.
a6f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
a700: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e     /* Fill in pN
a710: 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e  ew->pLeft and pN
a720: 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20  ew->pRight. */. 
a730: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
a740: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
a750: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a760: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a  Only) ){.      z
a770: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
a780: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75  prNodeSize(p, du
a790: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  pFlags);.      i
a7a0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
a7b0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b  rty(pNew, EP_Tok
a7c0: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20  enOnly|EP_Leaf) 
a7d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
a7e0: 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66  >pLeft = p->pLef
a7f0: 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ?.            
a800: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75            exprDu
a810: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
a820: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
a830: 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20  &zAlloc) : 0;.  
a840: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
a850: 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f  ht = p->pRight ?
a860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a870: 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28          exprDup(
a880: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45  db, p->pRight, E
a890: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a8a0: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a8b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a8c0: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  zBuffer ){.     
a8d0: 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a     *pzBuffer = z
a8e0: 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20  Alloc;.      }. 
a8f0: 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65     }else{.#ifnde
a900: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
a910: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69  NDOWFUNC.      i
a920: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a930: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
a940: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29  |EP_TokenOnly) )
a950: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a960: 70 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  pWin = 0;.      
a970: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
a980: 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 73 71 6c 69  New->pWin = sqli
a990: 74 65 33 57 69 6e 64 6f 77 44 75 70 28 64 62 2c  te3WindowDup(db,
a9a0: 20 70 4e 65 77 2c 20 70 2d 3e 70 57 69 6e 29 3b   pNew, p->pWin);
a9b0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  .      }.#endif 
a9c0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
a9d0: 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20  INDOWFUNC */.   
a9e0: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
a9f0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
aa00: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
aa10: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
aa20: 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  pNew->op==TK_SEL
aa30: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  ECT_COLUMN ){.  
aa40: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
aa50: 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a  eft = p->pLeft;.
aa60: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
aa70: 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  ( p->iColumn==0 
aa80: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
aa90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
aaa0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
aab0: 30 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d  0  || p->pRight=
aac0: 3d 70 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20  =p->pLeft );.   
aad0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aae0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
aaf0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
ab00: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c  up(db, p->pLeft,
ab10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
ab20: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
ab30: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
ab40: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
ab50: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ht, 0);.      }.
ab60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
ab70: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
ab80: 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74  * Create and ret
ab90: 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20  urn a deep copy 
aba0: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61  of the object pa
abb0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
abc0: 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  nd .** argument.
abd0: 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69   If an OOM condi
abe0: 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65  tion is encounte
abf0: 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  red, NULL is ret
ac00: 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  urned.** and the
ac10: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ac20: 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23  d flag set..*/.#
ac30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ac40: 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69  IT_CTE.static Wi
ac50: 74 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69  th *withDup(sqli
ac60: 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
ac70: 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20  ){.  With *pRet 
ac80: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
ac90: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
aca0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a  sizeof(*p) + siz
acb0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
acc0: 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20  p->nCte-1);.    
acd0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  pRet = sqlite3Db
ace0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
acf0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
ad00: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Ret ){.      int
ad10: 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   i;.      pRet->
ad20: 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a  nCte = p->nCte;.
ad30: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ad40: 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
ad50: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
ad60: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
ad70: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
ad80: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  , p->a[i].pSelec
ad90: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
ada0: 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20  Ret->a[i].pCols 
adb0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
adc0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
add0: 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20  .pCols, 0);.    
ade0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a      pRet->a[i].z
adf0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
ae00: 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  StrDup(db, p->a[
ae10: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
ae20: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
ae30: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
ae40: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74  lse.# define wit
ae50: 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64  hDup(x,y) 0.#end
ae60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
ae70: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
ae80: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
ae90: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
aea0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
aeb0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
aec0: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
aed0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
aee0: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
aef0: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
af00: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
af10: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
af20: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
af30: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
af40: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
af50: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
af60: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
af70: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
af80: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
af90: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
afa0: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
afb0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
afc0: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
afd0: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
afe0: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
aff0: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
b000: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
b010: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
b020: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
b030: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
b040: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
b050: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
b060: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
b070: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
b080: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
b090: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
b0a0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
b0b0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
b0c0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  ..** If the EXPR
b0d0: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
b0e0: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
b0f0: 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
b100: 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e  ned is a.** trun
b110: 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  cated version of
b120: 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20   the usual Expr 
b130: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
b140: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
b150: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
b160: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
b170: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b180: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
b190: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
b1a0: 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  3ExprDup(sqlite3
b1b0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
b1c0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
b1d0: 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
b1e0: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
b1f0: 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75  REDUCE );.  retu
b200: 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70 28 64  rn p ? exprDup(d
b210: 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 20  b, p, flags, 0) 
b220: 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20  : 0;.}.ExprList 
b230: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
b240: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b250: 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e   ExprList *p, in
b260: 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72  t flags){.  Expr
b270: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
b280: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
b290: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
b2a0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
b2b0: 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53 65 6c   Expr *pPriorSel
b2c0: 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73  ectCol = 0;.  as
b2d0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
b2e0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b2f0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
b300: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b310: 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65 33 44  wNN(db, sqlite3D
b320: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
b330: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  p));.  if( pNew=
b340: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b350: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70   pNew->nExpr = p
b360: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74 65 6d  ->nExpr;.  pItem
b370: 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f   = pNew->a;.  pO
b380: 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20  ldItem = p->a;. 
b390: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b3a0: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
b3b0: 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b  ++, pOldItem++){
b3c0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45  .    Expr *pOldE
b3d0: 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  xpr = pOldItem->
b3e0: 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
b3f0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 70  *pNewExpr;.    p
b400: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Item->pExpr = sq
b410: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b420: 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73   pOldExpr, flags
b430: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45  );.    if( pOldE
b440: 78 70 72 20 0a 20 20 20 20 20 26 26 20 70 4f 6c  xpr .     && pOl
b450: 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  dExpr->op==TK_SE
b460: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  LECT_COLUMN.    
b470: 20 26 26 20 28 70 4e 65 77 45 78 70 72 20 3d 20   && (pNewExpr = 
b480: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30  pItem->pExpr)!=0
b490: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61   .    ){.      a
b4a0: 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d  ssert( pNewExpr-
b4b0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69  >iColumn==0 || i
b4c0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
b4d0: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
b4e0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
b4f0: 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78 70 72  assert( pOldExpr
b500: 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70  ->pLeft==pOldExp
b510: 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20  r->pRight );.   
b520: 20 20 20 20 20 70 50 72 69 6f 72 53 65 6c 65 63       pPriorSelec
b530: 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d  tCol = pNewExpr-
b540: 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70  >pLeft = pNewExp
b550: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
b560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b570: 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
b580: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b590: 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d  Item[-1].pExpr!=
b5a0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
b5b0: 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69  ert( pNewExpr->i
b5c0: 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31  Column==pItem[-1
b5d0: 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
b5e0: 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  +1 );.        as
b5f0: 73 65 72 74 28 20 70 50 72 69 6f 72 53 65 6c 65  sert( pPriorSele
b600: 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d  ctCol==pItem[-1]
b610: 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b  .pExpr->pLeft );
b620: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 45 78 70  .        pNewExp
b630: 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50 72 69 6f  r->pLeft = pPrio
b640: 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20  rSelectCol;.    
b650: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49    }.    }.    pI
b660: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
b670: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b680: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
b690: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
b6a0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
b6b0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b6c0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
b6d0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
b6e0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
b6f0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
b700: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
b710: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
b720: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
b730: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
b740: 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
b750: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 6f   = pOldItem->bSo
b760: 72 74 65 72 52 65 66 3b 0a 20 20 20 20 70 49 74  rterRef;.    pIt
b770: 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d  em->u = pOldItem
b780: 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ->u;.  }.  retur
b790: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
b7a0: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
b7b0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
b7c0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
b7d0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
b7e0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
b7f0: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
b800: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
b810: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
b820: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
b830: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
b840: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
b850: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
b860: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
b870: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
b880: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
b890: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b8a0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
b8b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b8c0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
b8d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b8e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
b8f0: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
b900: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
b910: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
b920: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
b930: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
b940: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
b950: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64  yte;.  assert( d
b960: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b970: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b980: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
b990: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
b9a0: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
b9b0: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
b9c0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
b9d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b9e0: 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29  awNN(db, nByte )
b9f0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
ba00: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
ba10: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
ba20: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
ba30: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
ba40: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
ba50: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
ba60: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
ba70: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
ba80: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
ba90: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
baa0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
bab0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
bac0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63     pNewItem->pSc
bad0: 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  hema = pOldItem-
bae0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e  >pSchema;.    pN
baf0: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
bb00: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
bb10: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bb20: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
bb30: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
bb40: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
bb50: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bb60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
bb70: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
bb80: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
bb90: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
bba0: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
bbb0: 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49  Item->fg = pOldI
bbc0: 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65  tem->fg;.    pNe
bbd0: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
bbe0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
bbf0: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
bc00: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
bc10: 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69  pOldItem->addrFi
bc20: 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49  llSub;.    pNewI
bc30: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
bc40: 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65   pOldItem->regRe
bc50: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e  turn;.    if( pN
bc60: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64  ewItem->fg.isInd
bc70: 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20  exedBy ){.      
bc80: 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  pNewItem->u1.zIn
bc90: 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
bca0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
bcb0: 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ldItem->u1.zInde
bcc0: 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  xedBy);.    }.  
bcd0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49    pNewItem->pIBI
bce0: 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ndex = pOldItem-
bcf0: 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69  >pIBIndex;.    i
bd00: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
bd10: 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
bd20: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e     pNewItem->u1.
bd30: 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20  pFuncArg = .    
bd40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
bd50: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  rListDup(db, pOl
bd60: 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  dItem->u1.pFuncA
bd70: 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  rg, flags);.    
bd80: 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  }.    pTab = pNe
bd90: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
bda0: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
bdb0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
bdc0: 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
bdd0: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f++;.    }.    p
bde0: 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  NewItem->pSelect
bdf0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
be00: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
be10: 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73  ->pSelect, flags
be20: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
be30: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
be40: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  prDup(db, pOldIt
be50: 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b  em->pOn, flags);
be60: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
be70: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
be80: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c  dListDup(db, pOl
be90: 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  dItem->pUsing);.
bea0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f      pNewItem->co
beb0: 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lUsed = pOldItem
bec0: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20  ->colUsed;.  }. 
bed0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
bee0: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
bef0: 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  dListDup(sqlite3
bf00: 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29   *db, IdList *p)
bf10: 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77  {.  IdList *pNew
bf20: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
bf30: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
bf40: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
bf50: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
bf60: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
bf70: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
bf80: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
bf90: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
bfa0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
bfb0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
bfc0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
bfd0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e  locRawNN(db, p->
bfe0: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
bff0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
c000: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
c010: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
c020: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
c030: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
c040: 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61 75   Note that becau
c050: 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
c060: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  he allocation fo
c070: 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a  r p->a[] is not.
c080: 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79    ** necessarily
c090: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c   a power of two,
c0a0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
c0b0: 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62  pend() may not b
c0c0: 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e  e called.  ** on
c0d0: 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
c0e0: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20 66  reated by this f
c0f0: 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f  unction. */.  fo
c100: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
c110: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
c120: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
c130: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
c140: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
c150: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
c160: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
c170: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
c180: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
c190: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
c1a0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
c1b0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
c1c0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
c1d0: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
c1e0: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
c1f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
c200: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
c210: 6c 65 63 74 20 2a 70 44 75 70 2c 20 69 6e 74 20  lect *pDup, int 
c220: 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74  flags){.  Select
c230: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 53 65   *pRet = 0;.  Se
c240: 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b  lect *pNext = 0;
c250: 0a 20 20 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d  .  Select **pp =
c260: 20 26 70 52 65 74 3b 0a 20 20 53 65 6c 65 63 74   &pRet;.  Select
c270: 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
c280: 64 62 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70  db!=0 );.  for(p
c290: 3d 70 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70  =pDup; p; p=p->p
c2a0: 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
c2b0: 63 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  ct *pNew = sqlit
c2c0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
c2d0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
c2e0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
c2f0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
c300: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
c310: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c320: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
c330: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c340: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
c350: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
c360: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
c370: 20 20 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65      pNew->pWhere
c380: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
c390: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
c3a0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c3b0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
c3c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c3d0: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
c3e0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c3f0: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
c400: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c410: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
c420: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c430: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
c440: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
c450: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
c460: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c470: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
c480: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  pNew->pNext = pN
c490: 65 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ext;.    pNew->p
c4a0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
c4b0: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
c4c0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c4d0: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67   p->pLimit, flag
c4e0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c  s);.    pNew->iL
c4f0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
c500: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
c510: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c  .    pNew->selFl
c520: 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
c530: 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65  s & ~SF_UsesEphe
c540: 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77 2d  meral;.    pNew-
c550: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
c560: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
c570: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
c580: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
c590: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
c5a0: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
c5b0: 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77   pNew->pWith = w
c5c0: 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  ithDup(db, p->pW
c5d0: 69 74 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ith);.#ifndef SQ
c5e0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
c5f0: 46 55 4e 43 0a 20 20 20 20 70 4e 65 77 2d 3e 70  FUNC.    pNew->p
c600: 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Win = 0;.    pNe
c610: 77 2d 3e 70 57 69 6e 44 65 66 6e 20 3d 20 73 71  w->pWinDefn = sq
c620: 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44  lite3WindowListD
c630: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 6e 44 65  up(db, p->pWinDe
c640: 66 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  fn);.#endif.    
c650: 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d 20 70 2d  pNew->selId = p-
c660: 3e 73 65 6c 49 64 3b 0a 20 20 20 20 2a 70 70 20  >selId;.    *pp 
c670: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 70 20 3d  = pNew;.    pp =
c680: 20 26 70 4e 65 77 2d 3e 70 50 72 69 6f 72 3b 0a   &pNew->pPrior;.
c690: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 4e 65 77      pNext = pNew
c6a0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
c6b0: 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65  pRet;.}.#else.Se
c6c0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
c6d0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
c6e0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
c6f0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
c700: 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72  ert( p==0 );.  r
c710: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
c720: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
c730: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
c740: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70  he end of an exp
c750: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
c760: 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e  f pList is.** in
c770: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
c780: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
c790: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
c7a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74  .**.** The pList
c7b0: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
c7c0: 65 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72  e either NULL or
c7d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
c7e0: 20 45 78 70 72 4c 69 73 74 0a 2a 2a 20 6f 62 74   ExprList.** obt
c7f0: 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 70 72 69  ained from a pri
c800: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
c810: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
c820: 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ().  This routin
c830: 65 0a 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20  e.** may not be 
c840: 75 73 65 64 20 77 69 74 68 20 61 6e 20 45 78 70  used with an Exp
c850: 72 4c 69 73 74 20 6f 62 74 61 69 6e 65 64 20 66  rList obtained f
c860: 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  rom sqlite3ExprL
c870: 69 73 74 44 75 70 28 29 2e 0a 2a 2a 20 52 65 61  istDup()..** Rea
c880: 73 6f 6e 3a 20 20 54 68 69 73 20 72 6f 75 74 69  son:  This routi
c890: 6e 65 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ne assumes that 
c8a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c  the number of sl
c8b0: 6f 74 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b  ots in pList->a[
c8c0: 5d 0a 2a 2a 20 69 73 20 61 20 70 6f 77 65 72 20  ].** is a power 
c8d0: 6f 66 20 74 77 6f 2e 20 20 54 68 61 74 20 69 73  of two.  That is
c8e0: 20 74 72 75 65 20 66 6f 72 20 73 71 6c 69 74 65   true for sqlite
c8f0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
c900: 29 20 72 65 74 75 72 6e 73 0a 2a 2a 20 62 75 74  ) returns.** but
c910: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
c920: 69 6c 79 20 74 72 75 65 20 66 72 6f 6d 20 74 68  ily true from th
c930: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
c940: 66 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  f sqlite3ExprLis
c950: 74 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  tDup()..**.** If
c960: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
c970: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
c980: 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69  s, the entire li
c990: 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a  st is freed and.
c9a0: 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
c9b0: 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c  ned.  If non-NUL
c9c0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  L is returned, t
c9d0: 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
c9e0: 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65  teed.** that the
c9f0: 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73   new entry was s
ca00: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65  uccessfully appe
ca10: 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  nded..*/.ExprLis
ca20: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
ca30: 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73  stAppend(.  Pars
ca40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ca50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
ca60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
ca70: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
ca80: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
ca90: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
caa0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
cab0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
cac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
cad0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
cae0: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
caf0: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
cb00: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
cb10: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
cb20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
cb30: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
cb40: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
cb50: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
cb60: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
cb70: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
cb80: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  , sizeof(ExprLis
cb90: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
cba0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
cbb0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
cbc0: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45   }.    pList->nE
cbd0: 78 70 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  xpr = 0;.  }else
cbe0: 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78   if( (pList->nEx
cbf0: 70 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78  pr & (pList->nEx
cc00: 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  pr-1))==0 ){.   
cc10: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b   ExprList *pNew;
cc20: 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
cc30: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
cc40: 20 70 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20   pList, .       
cc50: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c        sizeof(*pL
cc60: 69 73 74 29 2b 28 32 2a 70 4c 69 73 74 2d 3e 6e  ist)+(2*pList->n
cc70: 45 78 70 72 20 2d 20 31 29 2a 73 69 7a 65 6f 66  Expr - 1)*sizeof
cc80: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
cc90: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
cca0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
ccb0: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
ccc0: 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pList = pNew;.  
ccd0: 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
cce0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
ccf0: 70 72 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28  pr++];.  assert(
cd00: 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74   offsetof(struct
cd10: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a   ExprList_item,z
cd20: 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49  Name)==sizeof(pI
cd30: 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20  tem->pExpr) );. 
cd40: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f   assert( offseto
cd50: 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73  f(struct ExprLis
cd60: 74 5f 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30  t_item,pExpr)==0
cd70: 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 49   );.  memset(&pI
cd80: 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a  tem->zName,0,siz
cd90: 65 6f 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73  eof(*pItem)-offs
cda0: 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72  etof(struct Expr
cdb0: 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29  List_item,zName)
cdc0: 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  );.  pItem->pExp
cdd0: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74  r = pExpr;.  ret
cde0: 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d  urn pList;..no_m
cdf0: 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76  em:     .  /* Av
ce00: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
ce10: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73  ry if malloc has
ce20: 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71   failed. */.  sq
ce30: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
ce40: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  db, pExpr);.  sq
ce50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
ce60: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
ce70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
ce80: 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e  *.** pColumns an
ce90: 64 20 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76  d pExpr form a v
cea0: 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74  ector assignment
ceb0: 20 77 68 69 63 68 20 69 73 20 70 61 72 74 20 6f   which is part o
cec0: 66 20 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61  f the SET.** cla
ced0: 75 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45  use of an UPDATE
cee0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b   statement.  Lik
cef0: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
cf00: 20 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28       (a,b,c) = (
cf10: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
cf20: 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c  3).** Or:    (a,
cf30: 62 2c 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78  b,c) = (SELECT x
cf40: 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a  ,y,z FROM ....).
cf50: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74  **.** For each t
cf60: 65 72 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f  erm of the vecto
cf70: 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70  r assignment, ap
cf80: 70 65 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73  pend new entries
cf90: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   to the.** expre
cfa0: 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74  ssion list pList
cfb0: 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f  .  In the case o
cfc0: 66 20 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20  f a subquery on 
cfd0: 74 68 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a  the RHS, append.
cfe0: 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  ** TK_SELECT_COL
cff0: 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  UMN expressions.
d000: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
d010: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
d020: 65 6e 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72  endVector(.  Par
d030: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d040: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
d050: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
d060: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
d070: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
d080: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
d090: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
d0a0: 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d    IdList *pColum
d0b0: 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ns,      /* List
d0c0: 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53   of names of LHS
d0d0: 20 6f 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65   of the assignme
d0e0: 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  nt */.  Expr *pE
d0f0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
d100: 2a 20 56 65 63 74 6f 72 20 65 78 70 72 65 73 73  * Vector express
d110: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
d120: 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  ed. Might be NUL
d130: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  L */.){.  sqlite
d140: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d150: 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  db;.  int n;.  i
d160: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72  nt i;.  int iFir
d170: 73 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  st = pList ? pLi
d180: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
d190: 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e   /* pColumns can
d1a0: 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75   only be NULL du
d1b0: 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20  e to an OOM but 
d1c0: 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73  an OOM will caus
d1d0: 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70  e an.  ** exit p
d1e0: 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
d1f0: 74 69 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b  tine being invok
d200: 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  ed */.  if( NEVE
d210: 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29  R(pColumns==0) )
d220: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
d230: 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  end_error;.  if(
d240: 20 70 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f   pExpr==0 ) goto
d250: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
d260: 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  rror;..  /* If t
d270: 68 65 20 52 48 53 20 69 73 20 61 20 76 65 63 74  he RHS is a vect
d280: 6f 72 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  or, then we can 
d290: 69 6d 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63  immediately chec
d2a0: 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20  k to see that . 
d2b0: 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20   ** the size of 
d2c0: 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20  the RHS and LHS 
d2d0: 6d 61 74 63 68 2e 20 20 42 75 74 20 69 66 20 74  match.  But if t
d2e0: 68 65 20 52 48 53 20 69 73 20 61 20 53 45 4c 45  he RHS is a SELE
d2f0: 43 54 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61  CT, .  ** wildca
d300: 72 64 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65  rds ("*") in the
d310: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
d320: 68 65 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62  he SELECT must b
d330: 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72  e expanded befor
d340: 65 0a 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f  e.  ** we can do
d350: 20 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c   the size check,
d360: 20 73 6f 20 64 65 66 65 72 20 74 68 65 20 73 69   so defer the si
d370: 7a 65 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63  ze check until c
d380: 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a  ode generation..
d390: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
d3a0: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op!=TK_SELECT 
d3b0: 26 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64  && pColumns->nId
d3c0: 21 3d 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72  !=(n=sqlite3Expr
d3d0: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
d3e0: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
d3f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d400: 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73  , "%d columns as
d410: 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73  signed %d values
d420: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
d430: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d         pColumns-
d440: 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f  >nId, n);.    go
d450: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
d460: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66  _error;.  }..  f
d470: 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d  or(i=0; i<pColum
d480: 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  ns->nId; i++){. 
d490: 20 20 20 45 78 70 72 20 2a 70 53 75 62 45 78 70     Expr *pSubExp
d4a0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46  r = sqlite3ExprF
d4b0: 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50  orVectorField(pP
d4c0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b  arse, pExpr, i);
d4d0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
d4e0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
d4f0: 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  nd(pParse, pList
d500: 2c 20 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20  , pSubExpr);.   
d510: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
d520: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
d530: 74 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74  t->nExpr==iFirst
d540: 2b 69 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c  +i+1 );.      pL
d550: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
d560: 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70  xpr-1].zName = p
d570: 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e  Columns->a[i].zN
d580: 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75  ame;.      pColu
d590: 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  mns->a[i].zName 
d5a0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
d5b0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
d5c0: 63 46 61 69 6c 65 64 20 26 26 20 70 45 78 70 72  cFailed && pExpr
d5d0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
d5e0: 26 26 20 41 4c 57 41 59 53 28 70 4c 69 73 74 21  && ALWAYS(pList!
d5f0: 3d 30 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20  =0) ){.    Expr 
d600: 2a 70 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d  *pFirst = pList-
d610: 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72  >a[iFirst].pExpr
d620: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
d630: 69 72 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  irst!=0 );.    a
d640: 73 73 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f  ssert( pFirst->o
d650: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
d660: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20  UMN );.     .   
d670: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45   /* Store the SE
d680: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
d690: 6e 20 70 52 69 67 68 74 20 73 6f 20 69 74 20 77  n pRight so it w
d6a0: 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77  ill be deleted w
d6b0: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  hen.    ** sqlit
d6c0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
d6d0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a  () is called */.
d6e0: 20 20 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67      pFirst->pRig
d6f0: 68 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  ht = pExpr;.    
d700: 70 45 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20  pExpr = 0;..    
d710: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
d720: 73 69 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20  size of the LHS 
d730: 69 6e 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61  in iTable so tha
d740: 74 20 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74  t we can check t
d750: 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  hat.    ** the R
d760: 48 53 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73  HS and LHS sizes
d770: 20 6d 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f   match during co
d780: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a  de generation. *
d790: 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54  /.    pFirst->iT
d7a0: 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d  able = pColumns-
d7b0: 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f  >nId;.  }..vecto
d7c0: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a  r_append_error:.
d7d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
d7e0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
d7f0: 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
d800: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d  elete(db, pColum
d810: 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  ns);.  return pL
d820: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ist;.}../*.** Se
d830: 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72  t the sort order
d840: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c   for the last el
d850: 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76  ement on the giv
d860: 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a  en ExprList..*/.
d870: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
d880: 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72  ListSetSortOrder
d890: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
d8a0: 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20  t iSortOrder){. 
d8b0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
d8c0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51  rn;.  assert( SQ
d8d0: 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45  LITE_SO_UNDEFINE
d8e0: 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  D<0 && SQLITE_SO
d8f0: 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54  _ASC>=0 && SQLIT
d900: 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20  E_SO_DESC>0 );. 
d910: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70   assert( p->nExp
d920: 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f  r>0 );.  if( iSo
d930: 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20  rtOrder<0 ){.   
d940: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d   assert( p->a[p-
d950: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
d960: 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  der==SQLITE_SO_A
d970: 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  SC );.    return
d980: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e  ;.  }.  p->a[p->
d990: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
d9a0: 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72  er = (u8)iSortOr
d9b0: 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  der;.}../*.** Se
d9c0: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
d9d0: 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74  [].zName element
d9e0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
d9f0: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
da00: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
da10: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
da20: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
da30: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
da40: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
da50: 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20  ut pName should 
da60: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
da70: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
da80: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
da90: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
daa0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
dab0: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
dac0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
dad0: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20  rListSetName(.  
dae0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
daf0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
db00: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
db10: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
db20: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
db30: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
db40: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54  the span. */.  T
db50: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
db60: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74         /* Name t
db70: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20  o be added */.  
db80: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
db90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
dba0: 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d  to cause the nam
dbb0: 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64  e to be dequoted
dbc0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
dbd0: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61   pList!=0 || pPa
dbe0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
dbf0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
dc00: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
dc10: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
dc20: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
dc30: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
dc40: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49  Expr>0 );.    pI
dc50: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
dc60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
dc70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
dc80: 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a  em->zName==0 );.
dc90: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
dca0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
dcb0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
dcc0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
dcd0: 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71  >n);.    if( deq
dce0: 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44 65  uote ) sqlite3De
dcf0: 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  quote(pItem->zNa
dd00: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49 4e 5f  me);.    if( IN_
dd10: 52 45 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 20 29 7b  RENAME_COLUMN ){
dd20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
dd30: 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
dd40: 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 49 74 65  rse, (void*)pIte
dd50: 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29  m->zName, pName)
dd60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
dd70: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
dd80: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
dd90: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
dda0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
ddb0: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
ddc0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
ddd0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
dde0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
ddf0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
de00: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
de10: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
de20: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
de30: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
de40: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
de50: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
de60: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
de70: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
de80: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
de90: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
dea0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
deb0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
dec0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
ded0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
dee0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
def0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
df00: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
df10: 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *zStart,     /*
df20: 20 53 74 61 72 74 20 6f 66 20 74 68 65 20 73 70   Start of the sp
df30: 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  an */.  const ch
df40: 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20 20  ar *zEnd        
df50: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70  /* End of the sp
df60: 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  an */.){.  sqlit
df70: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
df80: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
df90: 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  List!=0 || db->m
dfa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
dfb0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
dfc0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
dfd0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
dfe0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
dff0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
e000: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
e010: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
e020: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e030: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
e040: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
e050: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 70 61  n = sqlite3DbSpa
e060: 6e 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74 2c  nDup(db, zStart,
e070: 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   zEnd);.  }.}../
e080: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
e090: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
e0a0: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
e0b0: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
e0c0: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
e0d0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
e0e0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
e0f0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
e100: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
e110: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e120: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
e130: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
e140: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
e150: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
e160: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
e170: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
e180: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
e190: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
e1a0: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
e1b0: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
e1c0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
e1d0: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
e1e0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
e1f0: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
e200: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e210: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
e220: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
e230: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
e240: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
e250: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
e260: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
e270: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
e280: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70 72  INLINE void expr
e290: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c  ListDeleteNN(sql
e2a0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
e2b0: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
e2c0: 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  t i = pList->nEx
e2d0: 70 72 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  pr;.  struct Exp
e2e0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
e2f0: 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61 3b 0a 20  m =  pList->a;. 
e300: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
e310: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 64 6f 7b  nExpr>0 );.  do{
e320: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
e330: 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
e340: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
e350: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e360: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
e370: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e380: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
e390: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2b 2b 3b  n);.    pItem++;
e3a0: 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 69 3e 30  .  }while( --i>0
e3b0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   );.  sqlite3DbF
e3c0: 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29  reeNN(db, pList)
e3d0: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
e3e0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
e3f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
e400: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
e410: 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70 72  if( pList ) expr
e420: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ListDeleteNN(db,
e430: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
e440: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
e450: 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45  wise-OR of all E
e460: 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73  xpr.flags fields
e470: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   in the given.**
e480: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33   ExprList..*/.u3
e490: 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  2 sqlite3ExprLis
e4a0: 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70  tFlags(const Exp
e4b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
e4c0: 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20   int i;.  u32 m 
e4d0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
e4e0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72  List!=0 );.  for
e4f0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
e500: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
e510: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
e520: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
e530: 3b 0a 20 20 20 20 20 61 73 73 65 72 74 28 20 70  ;.     assert( p
e540: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
e550: 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67  m |= pExpr->flag
e560: 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  s;.  }.  return 
e570: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  m;.}../*.** This
e580: 20 69 73 20 61 20 53 45 4c 45 43 54 2d 6e 6f 64   is a SELECT-nod
e590: 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  e callback for t
e5a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61  he expression wa
e5b0: 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20 61 6c 77  lker that.** alw
e5c0: 61 79 73 20 22 66 61 69 6c 73 22 2e 20 20 42 79  ays "fails".  By
e5d0: 20 22 66 61 69 6c 22 20 69 6e 20 74 68 69 73 20   "fail" in this 
e5e0: 63 61 73 65 2c 20 77 65 20 6d 65 61 6e 20 73 65  case, we mean se
e5f0: 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43  t.** pWalker->eC
e600: 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20  ode to zero and 
e610: 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abort..**.** Thi
e620: 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 75 73  s callback is us
e630: 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 65  ed by multiple e
e640: 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72  xpression walker
e650: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
e660: 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28  3SelectWalkFail(
e670: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
e680: 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
e690: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
e6a0: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
e6b0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
e6c0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
e6d0: 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a  RC_Abort;.}../*.
e6e0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
e6f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
e700: 20 49 44 20 77 69 74 68 20 74 68 65 20 6e 61 6d   ID with the nam
e710: 65 20 22 74 72 75 65 22 20 6f 72 20 22 66 61 6c  e "true" or "fal
e720: 73 65 22 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 76  se".** then conv
e730: 65 72 74 20 69 74 20 69 6e 74 6f 20 61 6e 20 54  ert it into an T
e740: 4b 5f 54 52 55 45 46 41 4c 53 45 20 74 65 72 6d  K_TRUEFALSE term
e750: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
e760: 72 6f 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e  ro if.** the con
e770: 76 65 72 73 69 6f 6e 20 68 61 70 70 65 6e 65 64  version happened
e780: 2c 20 61 6e 64 20 7a 65 72 6f 20 69 66 20 74 68  , and zero if th
e790: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e7a0: 75 6e 61 6c 74 65 72 65 64 2e 0a 2a 2f 0a 69 6e  unaltered..*/.in
e7b0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 64 54  t sqlite3ExprIdT
e7c0: 6f 54 72 75 65 46 61 6c 73 65 28 45 78 70 72 20  oTrueFalse(Expr 
e7d0: 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72  *pExpr){.  asser
e7e0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
e7f0: 5f 49 44 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _ID || pExpr->op
e800: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20  ==TK_STRING );. 
e810: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
e820: 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
e830: 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d 3d 30 0a  ken, "true")==0.
e840: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72     || sqlite3Str
e850: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
e860: 6f 6b 65 6e 2c 20 22 66 61 6c 73 65 22 29 3d 3d  oken, "false")==
e870: 30 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70 72  0.  ){.    pExpr
e880: 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52 55 45 46 41  ->op = TK_TRUEFA
e890: 4c 53 45 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LSE;.    return 
e8a0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
e8b0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
e8c0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
e8d0: 20 61 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20   a TK_TRUEFALSE 
e8e0: 45 78 70 72 20 6e 6f 64 65 2e 20 20 52 65 74 75  Expr node.  Retu
e8f0: 72 6e 20 31 20 69 66 20 69 74 20 69 73 20 54 52  rn 1 if it is TR
e900: 55 45 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69  UE.** and 0 if i
e910: 74 20 69 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69  t is FALSE..*/.i
e920: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 54 72  nt sqlite3ExprTr
e930: 75 74 68 56 61 6c 75 65 28 63 6f 6e 73 74 20 45  uthValue(const E
e940: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61  xpr *pExpr){.  a
e950: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
e960: 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 29  ==TK_TRUEFALSE )
e970: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e980: 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
e990: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75 65  ->u.zToken,"true
e9a0: 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ")==0.       || 
e9b0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
e9c0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
e9d0: 66 61 6c 73 65 22 29 3d 3d 30 20 29 3b 0a 20 20  false")==0 );.  
e9e0: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 75 2e  return pExpr->u.
e9f0: 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a  zToken[4]==0;.}.
ea00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
ea10: 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65  utines are Walke
ea20: 72 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65 64  r callbacks used
ea30: 20 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65 73   to check expres
ea40: 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20  sions to.** see 
ea50: 69 66 20 74 68 65 79 20 61 72 65 20 22 63 6f 6e  if they are "con
ea60: 73 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20  stant" for some 
ea70: 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f  definition of co
ea80: 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20  nstant.  The.** 
ea90: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c  Walker.eCode val
eaa0: 75 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  ue determines th
eab0: 65 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73 74  e type of "const
eac0: 61 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b  ant" we are look
ead0: 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a  ing.** for..**.*
eae0: 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b  * These callback
eaf0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
eb00: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
eb10: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
eb20: 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
eb30: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29  ExprIsConstant()
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
eb60: 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ==1.**     sqlit
eb70: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
eb80: 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20  NotJoin()       
eb90: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
eba0: 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c  de==2.**     sql
ebb0: 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
ebc0: 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20  onstant()       
ebd0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
ebe0: 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73  Code==3.**     s
ebf0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
ec00: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
ec10: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
ec20: 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a  >eCode==4 or 5.*
ec30: 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65  *.** In all case
ec40: 73 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73  s, the callbacks
ec50: 20 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64   set Walker.eCod
ec60: 65 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69 66  e=0 and abort if
ec70: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
ec80: 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e  ** is found to n
ec90: 6f 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ot be a constant
eca0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ..**.** The sqli
ecb0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
ecc0: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69 73  tOrFunction() is
ecd0: 20 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75 61   used for evalua
ece0: 74 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73  ting expressions
ecf0: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
ed00: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
ed10: 20 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f    The Walker.eCo
ed20: 64 65 20 76 61 6c 75 65 20 69 73 20 35 20 77 68  de value is 5 wh
ed30: 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e  en parsing.** an
ed40: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
ed50: 20 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f 63   and 4 when proc
ed60: 65 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74 61  essing a new sta
ed70: 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64  tement.  A bound
ed80: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72 61  .** parameter ra
ed90: 69 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66 6f  ises an error fo
eda0: 72 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 73  r new statements
edb0: 2c 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74 6c  , but is silentl
edc0: 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74  y converted.** t
edd0: 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73 74  o NULL for exist
ede0: 69 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54 68  ing schemas.  Th
edf0: 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65  is allows sqlite
ee00: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 74  _master tables t
ee10: 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20  hat .** contain 
ee20: 61 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  a bound paramete
ee30: 72 20 62 65 63 61 75 73 65 20 74 68 65 79 20 77  r because they w
ee40: 65 72 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ere generated by
ee50: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 0a   older versions.
ee60: 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20  ** of SQLite to 
ee70: 62 65 20 70 61 72 73 65 64 20 62 79 20 6e 65 77  be parsed by new
ee80: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
ee90: 51 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72 61  QLite without ra
eea0: 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f  ising a.** malfo
eeb0: 72 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72 6f  rmed schema erro
eec0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
eed0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
eee0: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
eef0: 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
ef00: 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c  ){..  /* If pWal
ef10: 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32 20  ker->eCode is 2 
ef20: 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66  then any term of
ef30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ef40: 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a  that comes from.
ef50: 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55    ** the ON or U
ef60: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
ef70: 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73 71  a left join disq
ef80: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
ef90: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
efa0: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
efb0: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
efc0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65    if( pWalker->e
efd0: 43 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72 48  Code==2 && ExprH
efe0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
eff0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
f000: 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
f010: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65  Code = 0;.    re
f020: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
f030: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
f040: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
f050: 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63  /* Consider func
f060: 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73  tions to be cons
f070: 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69  tant if all thei
f080: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  r arguments are 
f090: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20  constant.    ** 
f0a0: 61 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c 6b  and either pWalk
f0b0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
f0c0: 35 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f  5 or the functio
f0d0: 6e 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  n has the.    **
f0e0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e   SQLITE_FUNC_CON
f0f0: 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20  ST flag. */.    
f100: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
f110: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
f120: 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c  ker->eCode>=4 ||
f130: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
f140: 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46  (pExpr,EP_ConstF
f150: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
f160: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
f170: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
f180: 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  {.        pWalke
f190: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
f1a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f1b0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
f1c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a      case TK_ID:.
f1d0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
f1e0: 20 22 74 72 75 65 22 20 6f 72 20 22 66 61 6c 73   "true" or "fals
f1f0: 65 22 20 69 6e 20 61 20 44 45 46 41 55 4c 54 20  e" in a DEFAULT 
f200: 63 6c 61 75 73 65 20 69 6e 74 6f 20 74 68 65 0a  clause into the.
f210: 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f 70 72        ** appropr
f220: 69 61 74 65 20 54 4b 5f 54 52 55 45 46 41 4c 53  iate TK_TRUEFALS
f230: 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  E operator */.  
f240: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
f250: 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65  xprIdToTrueFalse
f260: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
f270: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
f280: 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  une;.      }.   
f290: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
f2a0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  */.    case TK_C
f2b0: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
f2c0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
f2d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
f2e0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74  _COLUMN:.      t
f2f0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
f300: 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20  op==TK_ID );.   
f310: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
f320: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
f330: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
f340: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
f350: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
f360: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f370: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
f380: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
f390: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
f3a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f3b0: 45 50 5f 46 69 78 65 64 43 6f 6c 29 20 26 26 20  EP_FixedCol) && 
f3c0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 21 3d  pWalker->eCode!=
f3d0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  2 ){.        ret
f3e0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
f3f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f400: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
f410: 64 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e  de==3 && pExpr->
f420: 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d  iTable==pWalker-
f430: 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20  >u.iCur ){.     
f440: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
f450: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
f460: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
f470: 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
f480: 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  e TK_IF_NULL_ROW
f490: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
f4a0: 47 49 53 54 45 52 3a 0a 20 20 20 20 20 20 74 65  GISTER:.      te
f4b0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
f4c0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
f4d0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f4e0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f4f0: 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20  IF_NULL_ROW );. 
f500: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f510: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ode = 0;.      r
f520: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
f530: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
f540: 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28  IABLE:.      if(
f550: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f560: 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =5 ){.        /*
f570: 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72   Silently conver
f580: 74 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  t bound paramete
f590: 72 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  rs that appear i
f5a0: 6e 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a  nside of CREATE.
f5b0: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65          ** state
f5c0: 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c  ments into a NUL
f5d0: 4c 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74  L when parsing t
f5e0: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
f5f0: 65 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20  ent text out.   
f600: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73       ** of the s
f610: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f620: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45  le */.        pE
f630: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
f640: 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
f650: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
f660: 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  e==4 ){.        
f670: 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d  /* A bound param
f680: 65 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45  eter in a CREATE
f690: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
f6a0: 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a  originates from.
f6b0: 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
f6c0: 65 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75  e3_prepare() cau
f6d0: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ses an error */.
f6e0: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
f6f0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
f700: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
f710: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
f720: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
f730: 75 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75  ugh */.    defau
f740: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
f750: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
f760: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
f770: 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
f780: 46 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73  Fail() disallows
f790: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
f7a0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
f7b0: 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73  K_EXISTS ); /* s
f7c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
f7d0: 46 61 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73  Fail() disallows
f7e0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
f7f0: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
f800: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20   }.}.static int 
f810: 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72  exprIsConst(Expr
f820: 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61   *p, int initFla
f830: 67 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20  g, int iCur){.  
f840: 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43  Walker w;.  w.eC
f850: 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  ode = initFlag;.
f860: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
f870: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
f880: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
f890: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
f8a0: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
f8b0: 61 69 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ail;.#ifdef SQLI
f8c0: 54 45 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65  TE_DEBUG.  w.xSe
f8d0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
f8e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
f8f0: 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66  kAssert2;.#endif
f900: 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 43  .  w.u.iCur = iC
f910: 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ur;.  sqlite3Wal
f920: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
f930: 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
f940: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
f950: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
f960: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
f970: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
f980: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
f990: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
f9a0: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
f9b0: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
f9c0: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
f9d0: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
f9e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
f9f0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
fa00: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
fa10: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
fa20: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
fa30: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
fa40: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
fa50: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
fa60: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
fa70: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
fa80: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
fa90: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
faa0: 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a  st(p, 1, 0);.}..
fab0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
fac0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
fad0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
fae0: 69 66 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 74  if.**.**   (1) t
faf0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
fb00: 20 63 6f 6e 73 74 61 6e 74 2c 20 61 6e 64 0a 2a   constant, and.*
fb10: 2a 20 20 20 28 32 29 20 74 68 65 20 65 78 70 72  *   (2) the expr
fb20: 65 73 73 69 6f 6e 20 64 6f 65 73 20 6f 72 69 67  ession does orig
fb30: 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 20  inate in the ON 
fb40: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a  or USING clause.
fb50: 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45  **       of a LE
fb60: 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 0a 2a 2a 20  FT JOIN, and.** 
fb70: 20 20 28 33 29 20 74 68 65 20 65 78 70 72 65 73    (3) the expres
fb80: 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f  sion does not co
fb90: 6e 74 61 69 6e 20 61 6e 79 20 45 50 5f 46 69 78  ntain any EP_Fix
fba0: 65 64 43 6f 6c 20 54 4b 5f 43 4f 4c 55 4d 4e 0a  edCol TK_COLUMN.
fbb0: 2a 2a 20 20 20 20 20 20 20 6f 70 65 72 61 6e 64  **       operand
fbc0: 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  s created by the
fbd0: 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67   constant propag
fbe0: 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69  ation optimizati
fbf0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  on..**.** When t
fc00: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
fc10: 72 6e 73 20 74 72 75 65 2c 20 69 74 20 69 6e 64  rns true, it ind
fc20: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
fc30: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 61  expression.** ca
fc40: 6e 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  n be added to th
fc50: 65 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  e pParse->pConst
fc60: 45 78 70 72 20 6c 69 73 74 20 61 6e 64 20 65 76  Expr list and ev
fc70: 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 77 68 65  aluated once whe
fc80: 6e 0a 2a 2a 20 74 68 65 20 70 72 65 70 61 72 65  n.** the prepare
fc90: 64 20 73 74 61 74 65 6d 65 6e 74 20 73 74 61 72  d statement star
fca0: 74 73 20 75 70 2e 20 20 53 65 65 20 73 71 6c 69  ts up.  See sqli
fcb0: 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
fcc0: 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  t()..*/.int sqli
fcd0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
fce0: 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70  tNotJoin(Expr *p
fcf0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
fd00: 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29  IsConst(p, 2, 0)
fd10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
fd20: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
fd30: 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
fd40: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
fd50: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
fd60: 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69  nt.** for any si
fd70: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
fd80: 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
fd90: 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65  r iCur.  In othe
fda0: 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20  r words, the.** 
fdb0: 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20  expression must 
fdc0: 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79  not refer to any
fdd0: 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
fde0: 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20  ic function nor 
fdf0: 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68  any.** table oth
fe00: 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f  er than iCur..*/
fe10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
fe20: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
fe30: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75  Expr *p, int iCu
fe40: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  r){.  return exp
fe50: 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69  rIsConst(p, 3, i
fe60: 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Cur);.}.../*.** 
fe70: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
fe80: 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  ) callback used 
fe90: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  by sqlite3ExprIs
fea0: 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
feb0: 79 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y()..*/.static i
fec0: 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  nt exprNodeIsCon
fed0: 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 57  stantOrGroupBy(W
fee0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
fef0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
ff00: 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
ff10: 42 79 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  By = pWalker->u.
ff20: 70 47 72 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20  pGroupBy;.  int 
ff30: 69 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  i;..  /* Check i
ff40: 66 20 70 45 78 70 72 20 69 73 20 69 64 65 6e 74  f pExpr is ident
ff50: 69 63 61 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55  ical to any GROU
ff60: 50 20 42 59 20 74 65 72 6d 2e 20 49 66 20 73 6f  P BY term. If so
ff70: 2c 20 63 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20  , consider.  ** 
ff80: 69 74 20 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f  it constant.  */
ff90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47  .  for(i=0; i<pG
ffa0: 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
ffb0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
ffc0: 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69   = pGroupBy->a[i
ffd0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
ffe0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
fff0: 61 72 65 28 30 2c 20 70 45 78 70 72 2c 20 70 2c  are(0, pExpr, p,
10000 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20 20 20   -1)<2 ){.      
10010 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
10020 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f   sqlite3ExprNNCo
10030 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70  llSeq(pWalker->p
10040 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
10050 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 42 69   if( sqlite3IsBi
10060 6e 61 72 79 28 70 43 6f 6c 6c 29 20 29 7b 0a 20  nary(pColl) ){. 
10070 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
10080 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
10090 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
100a0 20 43 68 65 63 6b 20 69 66 20 70 45 78 70 72 20   Check if pExpr 
100b0 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
100c0 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72   If so, consider
100d0 20 69 74 20 76 61 72 69 61 62 6c 65 2e 20 2a 2f   it variable. */
100e0 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
100f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
10100 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
10110 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
10120 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  e = 0;.    retur
10130 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
10140 0a 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 4e  ..  return exprN
10150 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 70 57  odeIsConstant(pW
10160 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d  alker, pExpr);.}
10170 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65  ../*.** Walk the
10180 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
10190 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
101a0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 52  irst argument. R
101b0 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  eturn non-zero.*
101c0 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  * if the express
101d0 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  ion consists ent
101e0 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e  irely of constan
101f0 74 73 20 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  ts or copies of 
10200 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20 70 47 72  terms .** in pGr
10210 6f 75 70 42 79 20 74 68 61 74 20 73 6f 72 74 20  oupBy that sort 
10220 77 69 74 68 20 74 68 65 20 42 49 4e 41 52 59 20  with the BINARY 
10230 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
10240 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ce..**.** This r
10250 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
10260 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  o determine if a
10270 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56   term of the HAV
10280 49 4e 47 20 63 6c 61 75 73 65 20 63 61 6e 0a 2a  ING clause can.*
10290 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e  * be promoted in
102a0 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
102b0 75 73 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 66  use.  In order f
102c0 6f 72 20 73 75 63 68 20 61 20 70 72 6f 6d 6f 74  or such a promot
102d0 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a 2a 2a 20  ion to work,.** 
102e0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
102f0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 74   HAVING clause t
10300 65 72 6d 20 6d 75 73 74 20 62 65 20 74 68 65 20  erm must be the 
10310 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20 6d 65 6d  same for all mem
10320 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20 22 67 72  bers of.** a "gr
10330 6f 75 70 22 2e 20 20 54 68 65 20 72 65 71 75 69  oup".  The requi
10340 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  rement that the 
10350 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20 6d 75  GROUP BY term mu
10360 73 74 20 62 65 20 42 49 4e 41 52 59 0a 2a 2a 20  st be BINARY.** 
10370 61 73 73 75 6d 65 73 20 74 68 61 74 20 6e 6f 20  assumes that no 
10380 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20  other collating 
10390 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 68 61  sequence will ha
103a0 76 65 20 61 20 66 69 6e 65 72 2d 67 72 61 69 6e  ve a finer-grain
103b0 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 20 74  ed.** grouping t
103c0 68 61 6e 20 62 69 6e 61 72 79 2e 20 20 49 6e 20  han binary.  In 
103d0 6f 74 68 65 72 20 77 6f 72 64 73 20 28 41 3d 42  other words (A=B
103e0 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 29   COLLATE binary)
103f0 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41 3d 42 20   implies.** A=B 
10400 69 6e 20 65 76 65 72 79 20 6f 74 68 65 72 20 63  in every other c
10410 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10420 65 2e 20 20 54 68 65 20 72 65 71 75 69 72 65 6d  e.  The requirem
10430 65 6e 74 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ent that the.** 
10440 47 52 4f 55 50 20 42 59 20 62 65 20 42 49 4e 41  GROUP BY be BINA
10450 52 59 20 69 73 20 73 74 72 69 63 74 65 72 20 74  RY is stricter t
10460 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 20  han necessary.  
10470 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f 20 77 6f  It would also wo
10480 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d 6f 74 65  rk.** to promote
10490 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20   HAVING clauses 
104a0 74 68 61 74 20 75 73 65 20 74 68 65 20 73 61 6d  that use the sam
104b0 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  e alternative co
104c0 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
104d0 6e 63 65 20 61 73 20 74 68 65 20 47 52 4f 55 50  nce as the GROUP
104e0 20 42 59 20 74 65 72 6d 2c 20 62 75 74 20 74 68   BY term, but th
104f0 61 74 20 69 73 20 6d 75 63 68 20 68 61 72 64 65  at is much harde
10500 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a 2a 20 61  r to check,.** a
10510 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
10520 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61  ting sequences a
10530 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64  re uncommon, and
10540 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 61 6e   this is only an
10550 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
10560 2c 20 73 6f 20 77 65 20 74 61 6b 65 20 74 68 65  , so we take the
10570 20 65 61 73 79 20 77 61 79 20 6f 75 74 20 61 6e   easy way out an
10580 64 20 73 69 6d 70 6c 79 20 72 65 71 75 69 72 65  d simply require
10590 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59   the.** GROUP BY
105a0 20 74 6f 20 75 73 65 20 74 68 65 20 42 49 4e 41   to use the BINA
105b0 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  RY collating seq
105c0 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  uence..*/.int sq
105d0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
105e0 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 50 61 72  antOrGroupBy(Par
105f0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
10600 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70   *p, ExprList *p
10610 47 72 6f 75 70 42 79 29 7b 0a 20 20 57 61 6c 6b  GroupBy){.  Walk
10620 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
10630 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  = 1;.  w.xExprCa
10640 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
10650 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  eIsConstantOrGro
10660 75 70 42 79 3b 0a 20 20 77 2e 78 53 65 6c 65 63  upBy;.  w.xSelec
10670 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  tCallback = 0;. 
10680 20 77 2e 75 2e 70 47 72 6f 75 70 42 79 20 3d 20   w.u.pGroupBy = 
10690 70 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 70 50  pGroupBy;.  w.pP
106a0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
106b0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
106c0 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
106d0 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
106e0 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
106f0 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
10700 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
10710 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10720 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
10730 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
10740 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
10750 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
10760 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
10770 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
10780 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
10790 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
107a0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
107b0 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
107c0 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
107d0 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
107e0 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
107f0 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
10800 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
10810 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
10820 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
10830 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
10840 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
10850 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e  Expr *p, u8 isIn
10860 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  it){.  assert( i
10870 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e  sInit==0 || isIn
10880 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72  it==1 );.  retur
10890 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
108a0 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d   4+isInit, 0);.}
108b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
108c0 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
108d0 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  NTS./*.** Walk a
108e0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
108f0 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
10900 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
10910 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62  ontains a.** sub
10920 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69  query of some ki
10930 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  nd.  Return 0 if
10940 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73 75   there are no su
10950 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74  bqueries..*/.int
10960 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e 74   sqlite3ExprCont
10970 61 69 6e 73 53 75 62 71 75 65 72 79 28 45 78 70  ainsSubquery(Exp
10980 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20  r *p){.  Walker 
10990 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31  w;.  w.eCode = 1
109a0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
109b0 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
109c0 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78  rWalkNoop;.  w.x
109d0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
109e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
109f0 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20 53  lkFail;.#ifdef S
10a00 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77 2e  QLITE_DEBUG.  w.
10a10 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
10a20 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
10a30 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e  WalkAssert2;.#en
10a40 64 69 66 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  dif.  sqlite3Wal
10a50 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
10a60 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d  return w.eCode==
10a70 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
10a80 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
10a90 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
10aa0 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
10ab0 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
10ac0 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
10ad0 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
10ae0 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
10af0 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
10b00 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
10b10 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
10b20 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10b30 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
10b40 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
10b50 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
10b60 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
10b70 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
10b80 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
10b90 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
10ba0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10bb0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
10bc0 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
10bd0 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
10be0 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  0;.  if( p==0 ) 
10bf0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61  return 0;  /* Ca
10c00 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f  n only happen fo
10c10 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a  llowing on OOM *
10c20 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78  /..  /* If an ex
10c30 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
10c40 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74  nteger literal t
10c50 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69  hat fits in a si
10c60 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a  gned 32-bit.  **
10c70 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
10c80 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
10c90 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  lag will have al
10ca0 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a  ready been set *
10cb0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
10cc0 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
10cd0 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   (p->flags & EP_
10ce0 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20  IntValue)!=0.   
10cf0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
10d00 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e  e3GetInt32(p->u.
10d10 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20  zToken, &rc)==0 
10d20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  );..  if( p->fla
10d30 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
10d40 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
10d50 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  = p->u.iValue;. 
10d60 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
10d70 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
10d80 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
10d90 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
10da0 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  c = sqlite3ExprI
10db0 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
10dc0 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
10dd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10de0 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
10df0 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
10e00 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
10e10 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
10e20 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
10e30 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
10e40 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34  ( v!=(-214748364
10e50 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  7-1) );.        
10e60 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
10e70 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
10e80 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
10e90 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
10ea0 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
10eb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10ec0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
10ed0 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
10ee0 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
10ef0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
10f00 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
10f10 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
10f20 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
10f30 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
10f40 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
10f50 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
10f60 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
10f70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10f80 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
10f90 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
10fa0 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
10fb0 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
10fc0 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
10fd0 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
10fe0 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
10ff0 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
11000 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
11010 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
11020 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
11030 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
11040 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
11050 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
11060 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
11070 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
11080 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
11090 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
110a0 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
110b0 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
110c0 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
110d0 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
110e0 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
110f0 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
11100 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
11110 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
11120 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
11130 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
11140 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
11150 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
11160 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
11170 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
11180 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
11190 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
111a0 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
111b0 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
111c0 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
111d0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
111e0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
111f0 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
11200 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
11210 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
11220 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
11230 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
11240 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
11250 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 45  :.      return E
11260 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
11270 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20  , EP_CanBeNull) 
11280 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
11290 70 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f  p->pTab==0 ||  /
112a0 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63  * Reference to c
112b0 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f  olumn of index o
112c0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  n expression */.
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d               (p-
112e0 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
112f0 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e  ->pTab->aCol[p->
11300 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
11310 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c  ==0);.    defaul
11320 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
11330 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
11340 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
11350 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
11360 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
11370 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
11380 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
11390 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
113a0 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
113b0 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
113c0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
113d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
113e0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
113f0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
11400 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
11410 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
11420 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
11430 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
11440 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
11450 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
11460 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
11470 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
11480 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
11490 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
114a0 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
114b0 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
114c0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
114d0 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
114e0 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
114f0 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
11500 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65  TE_AFF_BLOB ) re
11510 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
11520 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
11530 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
11540 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
11550 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
11560 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
11570 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
11580 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
11590 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
115a0 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
115b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
115c0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
115d0 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
115e0 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
115f0 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
11600 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
11610 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
11620 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
11630 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
11640 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
11650 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
11660 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
11670 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
11680 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
11690 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
116a0 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
116b0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
116c0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
116d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
116e0 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
116f0 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
11700 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
11710 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
11720 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
11730 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
11740 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
11750 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
11760 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11770 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
11780 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
11790 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
117a0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
117b0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
117c0 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
117d0 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
117e0 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
117f0 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
11800 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
11810 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
11820 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
11830 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
11840 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
11850 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
11860 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
11870 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
11880 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
11890 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
118a0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
118b0 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20  /*.** pX is the 
118c0 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
118d0 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73  rator.  If pX is
118e0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
118f0 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e  ent .** that can
11900 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74   be simplified t
11910 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  o a direct table
11920 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65   access, then re
11930 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
11940 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20  r to the SELECT 
11950 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70  statement.  If p
11960 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43  X is not a SELEC
11970 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
11980 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  or if the SELECT
11990 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73   statement needs
119a0 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65   to be manifeste
119b0 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65  d into a transie
119c0 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  nt.** table, the
119d0 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
119e0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
119f0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
11a00 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73  tatic Select *is
11a10 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
11a20 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53  t(Expr *pX){.  S
11a30 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c  elect *p;.  SrcL
11a40 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
11a50 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
11a60 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
11a70 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78  int i;.  if( !Ex
11a80 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
11a90 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
11aa0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
11ab0 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a  Not a subquery *
11ac0 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  /.  if( ExprHasP
11ad0 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56  roperty(pX, EP_V
11ae0 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74  arSelect)  ) ret
11af0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65  urn 0;  /* Corre
11b00 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20  lated subq */.  
11b10 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  p = pX->x.pSelec
11b20 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
11b30 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
11b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11b50 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
11b60 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
11b70 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
11b80 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
11b90 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
11ba0 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
11bb0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
11bc0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
11bd0 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
11be0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
11bf0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
11c00 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
11c10 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
11c20 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
11c30 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
11c40 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
11c50 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
11c60 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
11c70 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
11c80 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ca0 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
11cb0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
11cc0 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
11cd0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
11ce0 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
11cf0 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  IT clause */.  i
11d00 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
11d10 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
11d20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
11d30 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
11d40 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
11d50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
11d60 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
11d70 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
11d80 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
11d90 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
11da0 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
11db0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
11dc0 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
11dd0 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
11de0 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
11df0 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
11e00 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
11e10 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72  0].pTab;.  asser
11e20 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
11e30 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
11e40 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20  elect==0 );     
11e50 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
11e60 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76  lause is not a v
11e70 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  iew */.  if( IsV
11e80 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
11e90 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
11ea0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e  /* FROM clause n
11eb0 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
11ec0 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  le */.  pEList =
11ed0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73   p->pEList;.  as
11ee0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
11ef0 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45  );.  /* All SELE
11f00 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20  CT results must 
11f10 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20  be columns. */. 
11f20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
11f30 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
11f40 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73 20  .    Expr *pRes 
11f50 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
11f60 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52  Expr;.    if( pR
11f70 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  es->op!=TK_COLUM
11f80 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
11f90 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
11fa0 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
11fb0 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  0].iCursor );  /
11fc0 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
11fd0 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
11fe0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
11ff0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12000 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
12010 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
12020 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12030 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12040 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b 73  code that checks
12050 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
12060 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
12070 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65  able iCur to see
12080 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69   if.** it contai
12090 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72  ns any NULL entr
120a0 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65 20  ies.  Cause the 
120b0 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67 48  register at regH
120c0 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74  asNull to be set
120d0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  .** to a non-NUL
120e0 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72 20  L value if iCur 
120f0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
12100 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73 74  s.  Cause regist
12110 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a  er regHasNull.**
12120 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55   to be set to NU
12130 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  LL if iCur conta
12140 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
12150 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
12160 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
12170 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
12180 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  g(Vdbe *v, int i
12190 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e  Cur, int regHasN
121a0 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ull){.  int addr
121b0 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  1;.  sqlite3Vdbe
121c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
121d0 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  eger, 0, regHasN
121e0 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ull);.  addr1 = 
121f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12200 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
12210 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
12220 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
12230 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12240 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
12250 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
12260 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12270 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
12280 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
12290 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
122a0 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
122b0 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
122c0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
122d0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23  e(v, addr1);.}.#
122e0 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
122f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
12300 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  UERY./*.** The a
12310 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e  rgument is an IN
12320 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 61   operator with a
12330 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
12340 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a  query) on the .*
12350 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
12360 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
12370 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  if that list is 
12380 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61  constant..*/.sta
12390 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
123a0 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45  nRhsIsConstant(E
123b0 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70  xpr *pIn){.  Exp
123c0 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72  r *pLHS;.  int r
123d0 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  es;.  assert( !E
123e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
123f0 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  In, EP_xIsSelect
12400 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49  ) );.  pLHS = pI
12410 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d  n->pLeft;.  pIn-
12420 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65  >pLeft = 0;.  re
12430 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  s = sqlite3ExprI
12440 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a  sConstant(pIn);.
12450 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70    pIn->pLeft = p
12460 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  LHS;.  return re
12470 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s;.}.#endif../*.
12480 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12490 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
124a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
124b0 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f  f the IN (...) o
124c0 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20  perator..** The 
124d0 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pX parameter is 
124e0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  the expression o
124f0 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
12500 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68   IN operator, wh
12510 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
12520 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66  either a list of
12530 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
12540 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  a subquery..**.*
12550 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
12560 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
12570 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
12580 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
12590 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  hat can.** be us
125a0 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ed either to tes
125b0 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
125c0 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74 20   in the RHS set 
125d0 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
125e0 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d  rough.** all mem
125f0 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53 20  bers of the RHS 
12600 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  set, skipping du
12610 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
12620 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  A cursor is open
12630 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65  ed on the b-tree
12640 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
12650 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12660 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e  N operator.** an
12670 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20  d pX->iTable is 
12680 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
12690 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e   of that cursor.
126a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
126b0 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ned value of thi
126c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63  s function indic
126d0 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 20  ates the b-tree 
126e0 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  type, as follows
126f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  :.**.**   IN_IND
12700 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20  EX_ROWID      - 
12710 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
12720 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
12730 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ase table..**   
12740 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
12750 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72  SC  - The cursor
12760 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12770 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
12780 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
12790 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68  _INDEX_DESC - Th
127a0 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
127b0 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  ned on a descend
127c0 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
127d0 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20  IN_INDEX_EPH    
127e0 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
127f0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12800 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74   specially creat
12810 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ed and.**       
12820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12830 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
12840 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  remal table..** 
12850 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20    IN_INDEX_NOOP 
12860 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f        - No curso
12870 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e  r was allocated.
12880 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f    The IN operato
12890 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20  r must be.**    
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64       implemented
128c0 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   as a sequence o
128d0 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a  f comparisons..*
128e0 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
128f0 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65   b-tree might be
12900 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48 53   used if the RHS
12910 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69   expression pX i
12920 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75  s a simple.** su
12930 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a  bquery such as:.
12940 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
12950 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c   <column1>, <col
12960 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74  umn2>... FROM <t
12970 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
12980 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
12990 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
129a0 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f  ist or a more co
129b0 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20  mplex subquery, 
129c0 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d  then.** an ephem
129d0 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  eral table might
129e0 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65   need to be gene
129f0 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52  rated from the R
12a00 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70  HS and then.** p
12a10 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74  X->iTable made t
12a20 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65  o point to the e
12a30 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
12a40 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20  nstead of an.** 
12a50 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a  existing table..
12a60 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67  **.** The inFlag
12a70 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  s parameter must
12a80 20 63 6f 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d   contain, at a m
12a90 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74  inimum, one of t
12aa0 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e  he bits.** IN_IN
12ab0 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f  DEX_MEMBERSHIP o
12ac0 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  r IN_INDEX_LOOP 
12ad0 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49  but not both.  I
12ae0 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69  f inFlags contai
12af0 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ns.** IN_INDEX_M
12b00 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20  EMBERSHIP, then 
12b10 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61  the generated ta
12b20 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ble will be used
12b30 20 66 6f 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d   for a fast.** m
12b40 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20  embership test. 
12b50 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44   When the IN_IND
12b60 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73  EX_LOOP bit is s
12b70 65 74 2c 20 74 68 65 20 49 4e 20 69 6e 64 65 78  et, the IN index
12b80 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64   will.** be used
12b90 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c   to loop over al
12ba0 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  l values of the 
12bb0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
12bc0 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  erator..**.** Wh
12bd0 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  en IN_INDEX_LOOP
12be0 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
12bf0 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
12c00 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
12c10 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20  .** through the 
12c20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65  set members) the
12c30 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73  n the b-tree mus
12c40 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75  t not contain du
12c50 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20  plicates..** An 
12c60 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
12c70 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
12c80 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
12c90 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
12ca0 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
12cb0 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
12cc0 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
12cd0 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
12ce0 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20  MARY KEY or due 
12cf0 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63  to.** a UNIQUE c
12d00 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64  onstraint or ind
12d10 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  ex..**.** When I
12d20 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
12d30 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  IP is used (and 
12d40 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
12d50 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
12d60 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
12d70 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20  hip tests) then 
12d80 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
12d90 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
12da0 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
12db0 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65  mns> is a single
12dc0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
12dd0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61   KEY column or a
12de0 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20  n .** index can 
12df0 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68  be found with th
12e00 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c  e specified <col
12e10 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66  umns> as its lef
12e20 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t-most..**.** If
12e30 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   the IN_INDEX_NO
12e40 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44  OP_OK and IN_IND
12e50 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72  EX_MEMBERSHIP ar
12e60 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a  e both set and.*
12e70 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
12e80 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
12e90 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  is a list (not a
12ea0 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
12eb0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
12ec0 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61  might decide tha
12ed0 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  t creating an ep
12ee0 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66  hemeral b-tree f
12ef0 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a  or membership.**
12f00 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20   testing is too 
12f10 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65  expensive and re
12f20 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
12f30 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  OP.  In that cas
12f40 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  e, the.** callin
12f50 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  g routine should
12f60 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
12f70 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67  N operator using
12f80 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f   a sequence.** o
12f90 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61  f Eq or Ne compa
12fa0 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
12fb0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
12fc0 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
12fd0 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
12fe0 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
12ff0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
13000 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74  .** might need t
13010 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
13020 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69  r not the RHS si
13030 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
13040 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  rator.** contain
13050 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72  s a NULL.  If pr
13060 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f  RhsHasNull is no
13070 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
13080 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
13090 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
130a0 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
130b0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
130c0 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
130d0 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
130e0 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
130f0 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
13100 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
13110 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52  itten.** to *prR
13120 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68  hsHasNull. If th
13130 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
13140 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
13150 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
13160 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
13170 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
13180 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
13190 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
131a0 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
131b0 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
131c0 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52  n stored in *prR
131d0 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a  hsHasNull, then.
131e0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ** the value in 
131f0 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69  that register wi
13200 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
13210 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
13220 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  s one or more.**
13230 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e   NULL values, an
13240 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d  d it will be som
13250 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  e non-NULL value
13260 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
13270 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55  ontains no.** NU
13280 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
13290 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61   If the aiMap pa
132a0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e  rameter is not N
132b0 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69  ULL, it must poi
132c0 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63  nt to an array c
132d0 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65  ontaining.** one
132e0 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63   element for eac
132f0 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
13300 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
13310 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65  statement on the
13320 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49   RHS.** of the I
13330 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e  N(...) operator.
13340 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20   The i'th entry 
13350 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  of the array is 
13360 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
13370 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20  he.** offset of 
13380 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
13390 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
133a0 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65  e i'th column re
133b0 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
133c0 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61   SELECT. For exa
133d0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70  mple, if the exp
133e0 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65  ression and sele
133f0 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a  cted index are:.
13400 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20  **.**   (?,?,?) 
13410 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c  IN (SELECT a, b,
13420 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20   c FROM t1).**  
13430 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
13440 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b   ON t1(b, c, a);
13450 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61  .**.** then aiMa
13460 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64  p[] is populated
13470 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e   with {2, 0, 1}.
13480 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
13490 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
134a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
134b0 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  InIndex(.  Parse
134c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
134d0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
134e0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
134f0 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20  pr *pX,         
13500 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13510 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
13520 28 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20  (RHS) of the IN 
13530 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33  operator */.  u3
13540 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20  2 inFlags,      
13550 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49           /* IN_I
13560 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42  NDEX_LOOP, _MEMB
13570 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f  ERSHIP, and/or _
13580 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74  NOOP_OK */.  int
13590 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
135a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
135b0 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c  ter holding NULL
135c0 20 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f   status.  See no
135d0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  tes */.  int *ai
135e0 4d 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Map             
135f0 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
13600 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73  rom Index fields
13610 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a   to RHS fields *
13620 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
13630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13650 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69  SELECT to the ri
13660 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ght of IN operat
13670 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  or */.  int eTyp
13680 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
136a0 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62   Type of RHS tab
136b0 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a  le. IN_INDEX_* *
136c0 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
136d0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
136e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
136f0 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74  sor of the RHS t
13700 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
13710 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20  stBeUnique;     
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13730 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d  /* True if RHS m
13740 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f  ust be unique */
13750 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
13760 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13770 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74  se);     /* Virt
13780 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
13790 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73  g coded */..  as
137a0 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
137b0 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55  _IN );.  mustBeU
137c0 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73  nique = (inFlags
137d0 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
137e0 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  )!=0;..  /* If t
137f0 68 65 20 52 48 53 20 6f 66 20 74 68 69 73 20 49  he RHS of this I
13800 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20  N(...) operator 
13810 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64  is a SELECT, and
13820 20 69 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a   if it matters .
13830 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
13840 6e 6f 74 20 74 68 65 20 53 45 4c 45 43 54 20 72  not the SELECT r
13850 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e  esult contains N
13860 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63  ULL values, chec
13870 6b 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f  k whether.  ** o
13880 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63  r not NULL is ac
13890 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  tually possible 
138a0 28 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20  (it may not be, 
138b0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65  for example, due
138c0 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55   .  ** to NOT NU
138d0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  LL constraints i
138e0 6e 20 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49  n the schema). I
138f0 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73  f no NULL values
13900 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20   are possible,. 
13910 20 2a 2a 20 73 65 74 20 70 72 52 68 73 48 61 73   ** set prRhsHas
13920 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65  Null to 0 before
13930 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f   continuing.  */
13940 0a 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e  .  if( prRhsHasN
13950 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67  ull && (pX->flag
13960 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
13970 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
13980 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
13990 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65  List = pX->x.pSe
139a0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
139b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
139c0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
139d0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
139e0 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
139f0 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
13a00 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  xpr) ) break;.  
13a10 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70    }.    if( i==p
13a20 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
13a30 20 20 20 20 20 20 70 72 52 68 73 48 61 73 4e 75        prRhsHasNu
13a40 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ll = 0;.    }.  
13a50 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
13a60 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74   see if an exist
13a70 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
13a80 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ex can be used t
13a90 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74  o.  ** satisfy t
13aa0 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
13ab0 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f  is preferable to
13ac0 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65   generating a ne
13ad0 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61  w .  ** ephemera
13ae0 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69  l table.  */.  i
13af0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
13b00 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e  =0 && (p = isCan
13b10 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
13b20 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  X))!=0 ){.    sq
13b30 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
13b40 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
13b50 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
13b60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
13b70 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
13ba0 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
13bb0 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20     i16 iDb;     
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
13be0 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54  abase idx for pT
13bf0 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  ab */.    ExprLi
13c00 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e  st *pEList = p->
13c10 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  pEList;.    int 
13c20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
13c30 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65  nExpr;..    asse
13c40 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
13c50 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
13c60 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
13c70 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
13c80 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
13c90 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  rt( p->pEList->a
13ca0 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20  [0].pExpr!=0 ); 
13cb0 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
13cc0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
13cd0 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
13ce0 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
13cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13d00 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
13d10 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
13d20 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62  t(p) */.    pTab
13d30 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
13d40 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43  .pTab;..    /* C
13d50 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61  ode an OP_Transa
13d60 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62  ction and OP_Tab
13d70 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c  leLock for <tabl
13d80 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  e>. */.    iDb =
13d90 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
13da0 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
13db0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
13dc0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
13dd0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
13de0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  b);.    sqlite3T
13df0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
13e00 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
13e10 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
13e20 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 76  );..    assert(v
13e30 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 47 65  );  /* sqlite3Ge
13e40 74 56 64 62 65 28 29 20 68 61 73 20 61 6c 77 61  tVdbe() has alwa
13e50 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ys been previous
13e60 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20  ly called */.   
13e70 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26   if( nExpr==1 &&
13e80 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
13e90 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
13ea0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  {.      /* The "
13eb0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77  x IN (SELECT row
13ec0 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 20  id FROM table)" 
13ed0 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  case */.      in
13ee0 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
13ef0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
13f00 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 56  P_Once);.      V
13f10 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
13f30 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
13f40 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
13f50 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
13f60 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
13f70 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20  INDEX_ROWID;.   
13f80 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
13f90 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 0a  lan((pParse, 0,.
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 22 55 53 49              "USI
13fb0 4e 47 20 52 4f 57 49 44 20 53 45 41 52 43 48 20  NG ROWID SEARCH 
13fc0 4f 4e 20 54 41 42 4c 45 20 25 73 20 46 4f 52 20  ON TABLE %s FOR 
13fd0 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 54 61  IN-OPERATOR",pTa
13fe0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
13ff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
14000 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
14010 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14020 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
14050 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
14060 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74       int affinit
14070 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  y_ok = 1;.      
14080 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a  int i;..      /*
14090 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
140a0 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69  affinity that wi
140b0 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65  ll be used to pe
140c0 72 66 6f 72 6d 20 65 61 63 68 20 0a 20 20 20 20  rform each .    
140d0 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
140e0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
140f0 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 65  he affinity of e
14100 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  ach column in ta
14110 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ble.      ** on 
14120 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
14130 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  N operator.  If 
14140 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f  it not, it is no
14150 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 0a 20 20  t possible to.  
14160 20 20 20 20 2a 2a 20 75 73 65 20 61 6e 79 20 69      ** use any i
14170 6e 64 65 78 20 6f 66 20 74 68 65 20 52 48 53 20  ndex of the RHS 
14180 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20  table.  */.     
14190 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
141a0 72 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b  r && affinity_ok
141b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
141c0 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c  Expr *pLhs = sql
141d0 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
141e0 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74  ubexpr(pX->pLeft
141f0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  , i);.        in
14200 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  t iCol = pEList-
14210 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[i].pExpr->iCo
14220 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63 68  lumn;.        ch
14230 61 72 20 69 64 78 61 66 66 20 3d 20 73 71 6c 69  ar idxaff = sqli
14240 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66  te3TableColumnAf
14250 66 69 6e 69 74 79 28 70 54 61 62 2c 69 43 6f 6c  finity(pTab,iCol
14260 29 3b 20 2f 2a 20 52 48 53 20 74 61 62 6c 65 20  ); /* RHS table 
14270 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
14280 63 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65 33  cmpaff = sqlite3
14290 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
142a0 70 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a 20  pLhs, idxaff);. 
142b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
142c0 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f   cmpaff==SQLITE_
142d0 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  AFF_BLOB );.    
142e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d      testcase( cm
142f0 70 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  paff==SQLITE_AFF
14300 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20  _TEXT );.       
14310 20 73 77 69 74 63 68 28 20 63 6d 70 61 66 66 20   switch( cmpaff 
14320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ){.          cas
14330 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  e SQLITE_AFF_BLO
14340 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  B:.            b
14350 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14360 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
14370 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20 20  TEXT:.          
14380 20 20 2f 2a 20 73 71 6c 69 74 65 33 43 6f 6d 70    /* sqlite3Comp
14390 61 72 65 41 66 66 69 6e 69 74 79 28 29 20 6f 6e  areAffinity() on
143a0 6c 79 20 72 65 74 75 72 6e 73 20 54 45 58 54 20  ly returns TEXT 
143b0 69 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  if one side or t
143c0 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
143d0 2a 20 6f 74 68 65 72 20 68 61 73 20 6e 6f 20 61  * other has no a
143e0 66 66 69 6e 69 74 79 20 61 6e 64 20 74 68 65 20  ffinity and the 
143f0 6f 74 68 65 72 20 73 69 64 65 20 69 73 20 54 45  other side is TE
14400 58 54 2e 20 20 48 65 6e 63 65 2c 0a 20 20 20 20  XT.  Hence,.    
14410 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f          ** the o
14420 6e 6c 79 20 77 61 79 20 66 6f 72 20 63 6d 70 61  nly way for cmpa
14430 66 66 20 74 6f 20 62 65 20 54 45 58 54 20 69 73  ff to be TEXT is
14440 20 66 6f 72 20 69 64 78 61 66 66 20 74 6f 20 62   for idxaff to b
14450 65 20 54 45 58 54 0a 20 20 20 20 20 20 20 20 20  e TEXT.         
14460 20 20 20 2a 2a 20 61 6e 64 20 66 6f 72 20 74 68     ** and for th
14470 65 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 4c 48  e term on the LH
14480 53 20 6f 66 20 74 68 65 20 49 4e 20 74 6f 20 68  S of the IN to h
14490 61 76 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e  ave no affinity.
144a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
144b0 61 73 73 65 72 74 28 20 69 64 78 61 66 66 3d 3d  assert( idxaff==
144c0 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
144d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
144e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
144f0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
14500 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b       affinity_ok
14510 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65   = sqlite3IsNume
14520 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 61  ricAffinity(idxa
14530 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ff);.        }. 
14540 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
14550 28 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 7b  ( affinity_ok ){
14560 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72  .        /* Sear
14570 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
14580 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 69  ng index that wi
14590 6c 6c 20 77 6f 72 6b 20 66 6f 72 20 74 68 69 73  ll work for this
145a0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
145b0 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
145c0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
145d0 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 3b  Idx && eType==0;
145e0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
145f0 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42 69  t){.          Bi
14600 74 6d 61 73 6b 20 63 6f 6c 55 73 65 64 3b 20 20  tmask colUsed;  
14610 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f      /* Columns o
14620 66 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64  f the index used
14630 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 42 69   */.          Bi
14640 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20 20 20 20 20  tmask mCol;     
14650 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20      /* Mask for 
14660 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
14670 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  mn */.          
14680 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  if( pIdx->nColum
14690 6e 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69 6e  n<nExpr ) contin
146a0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ue;.          /*
146b0 20 4d 61 78 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e   Maximum nColumn
146c0 20 69 73 20 42 4d 53 2d 32 2c 20 6e 6f 74 20 42   is BMS-2, not B
146d0 4d 53 2d 31 2c 20 73 6f 20 74 68 61 74 20 77 65  MS-1, so that we
146e0 20 63 61 6e 20 63 6f 6d 70 75 74 65 0a 20 20 20   can compute.   
146f0 20 20 20 20 20 20 20 2a 2a 20 42 49 54 4d 41 53         ** BITMAS
14700 4b 28 6e 45 78 70 72 29 20 77 69 74 68 6f 75 74  K(nExpr) without
14710 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a   overflowing */.
14720 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
14730 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  se( pIdx->nColum
14740 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  n==BMS-2 );.    
14750 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14760 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42  pIdx->nColumn==B
14770 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  MS-1 );.        
14780 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
14790 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29 20 63 6f 6e  umn>=BMS-1 ) con
147a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
147b0 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71 75   if( mustBeUniqu
147c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
147d0 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43   if( pIdx->nKeyC
147e0 6f 6c 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20  ol>nExpr.       
147f0 20 20 20 20 20 20 7c 7c 28 70 49 64 78 2d 3e 6e        ||(pIdx->n
14800 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72 20 26 26 20  Column>nExpr && 
14810 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
14820 49 64 78 29 29 0a 20 20 20 20 20 20 20 20 20 20  Idx)).          
14830 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
14840 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
14850 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e   This index is n
14860 6f 74 20 75 6e 69 71 75 65 20 6f 76 65 72 20 74  ot unique over t
14870 68 65 20 49 4e 20 52 48 53 20 63 6f 6c 75 6d 6e  he IN RHS column
14880 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
14890 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
148a0 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55   .          colU
148b0 73 65 64 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  sed = 0;   /* Co
148c0 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 20 75  lumns of index u
148d0 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  sed so far */.  
148e0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
148f0 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
14900 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
14910 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33   *pLhs = sqlite3
14920 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
14930 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29  pr(pX->pLeft, i)
14940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  ;.            Ex
14950 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73  pr *pRhs = pELis
14960 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
14970 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53             CollS
14980 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74  eq *pReq = sqlit
14990 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
149a0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
149b0 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20  Lhs, pRhs);.    
149c0 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
149d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73   .            as
149e0 73 65 72 74 28 20 70 52 65 71 21 3d 30 20 7c 7c  sert( pReq!=0 ||
149f0 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   pRhs->iColumn==
14a00 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 61 72  XN_ROWID || pPar
14a10 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20  se->nErr );.    
14a20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
14a30 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a   j<nExpr; j++){.
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
14a50 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
14a60 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75  [j]!=pRhs->iColu
14a70 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
14a90 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ert( pIdx->azCol
14aa0 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  l[j] );.        
14ab0 20 20 20 20 20 20 69 66 28 20 70 52 65 71 21 3d        if( pReq!=
14ac0 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
14ad0 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c  Cmp(pReq->zName,
14ae0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
14af0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
14b00 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
14b10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14b20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
14b30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
14b40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
14b50 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20   if( j==nExpr ) 
14b60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
14b70 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42 49     mCol = MASKBI
14b80 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  T(j);.          
14b90 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63 6f 6c    if( mCol & col
14ba0 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20 2f 2a  Used ) break; /*
14bb0 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75 73 65   Each column use
14bc0 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20  d only once */. 
14bd0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73             colUs
14be0 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20  ed |= mCol;.    
14bf0 20 20 20 20 20 20 20 20 69 66 28 20 61 69 4d 61          if( aiMa
14c00 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a  p ) aiMap[i] = j
14c10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14c20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
14c30 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c 20 63  t( i==nExpr || c
14c40 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42 49 54  olUsed!=(MASKBIT
14c50 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a 20 20  (nExpr)-1) );.  
14c60 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 55          if( colU
14c70 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28 6e 45  sed==(MASKBIT(nE
14c80 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20 20 20  xpr)-1) ){.     
14c90 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
14ca0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
14cb0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
14cc0 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20 75   index pIdx is u
14cd0 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  sable */.       
14ce0 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
14cf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14d00 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
14d10 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
14d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
14d30 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
14d40 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20  Parse, 0,.      
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d60 20 20 20 20 20 20 20 20 22 55 53 49 4e 47 20 49          "USING I
14d70 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f  NDEX %s FOR IN-O
14d80 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a  PERATOR",pIdx->z
14d90 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
14da0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14db0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
14dc0 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78  Read, iTab, pIdx
14dd0 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
14de0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14df0 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
14e00 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
14e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
14e20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
14e30 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
14e40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
14e50 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49  sert( IN_INDEX_I
14e60 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f  NDEX_DESC == IN_
14e70 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b  INDEX_INDEX_ASC+
14e80 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
14e90 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
14ea0 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49  X_INDEX_ASC + pI
14eb0 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  dx->aSortOrder[0
14ec0 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  ];.  .          
14ed0 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75    if( prRhsHasNu
14ee0 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ll ){.#ifdef SQL
14ef0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
14f00 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20  N_USED_MASK.    
14f10 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61            i64 ma
14f20 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d  sk = (1<<nExpr)-
14f30 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
14f40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f50 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
14f60 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20  umnsUsed, .     
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
14f80 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d  b, 0, 0, (u8*)&m
14f90 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  ask, P4_INT64);.
14fa0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
14fb0 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75       *prRhsHasNu
14fc0 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
14fd0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
14fe0 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20     if( nExpr==1 
14ff0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
15000 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73     sqlite3SetHas
15010 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62  NullFlag(v, iTab
15020 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29  , *prRhsHasNull)
15030 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15040 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
15050 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15060 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
15070 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  v, iAddr);.     
15080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15090 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* End loop ove
150a0 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 20  r indexes */.   
150b0 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20     } /* End if( 
150c0 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a 2f  affinity_ok ) */
150d0 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66  .    } /* End if
150e0 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69 6e   not an rowid in
150f0 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45 6e  dex */.  } /* En
15100 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 74  d attempt to opt
15110 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20 69  imize using an i
15120 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  ndex */..  /* If
15130 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20   no preexisting 
15140 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62  index is availab
15150 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c  le for the IN cl
15160 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  ause.  ** and IN
15170 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61  _INDEX_NOOP is a
15180 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a  n allowed reply.
15190 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53    ** and the RHS
151a0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
151b0 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e  tor is a list, n
151c0 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20  ot a subquery.  
151d0 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69  ** and the RHS i
151e0 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f  s not constant o
151f0 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77  r has two or few
15200 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74  er terms,.  ** t
15210 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f  hen it is not wo
15220 72 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20  rth creating an 
15230 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
15240 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a  to evaluate.  **
15250 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
15260 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e   so return IN_IN
15270 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20  DEX_NOOP..  */. 
15280 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20   if( eType==0.  
15290 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49   && (inFlags & I
152a0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29  N_INDEX_NOOP_OK)
152b0 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50  .   && !ExprHasP
152c0 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
152d0 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20  IsSelect).   && 
152e0 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  (!sqlite3InRhsIs
152f0 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20  Constant(pX) || 
15300 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pX->x.pList->nEx
15310 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20  pr<=2).  ){.    
15320 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
15330 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
15340 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
15350 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66    /* Could not f
15360 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ind an existing 
15370 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
15380 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53  o use as the RHS
15390 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20   b-tree..    ** 
153a0 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  We will have to 
153b0 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65  generate an ephe
153c0 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64  meral table to d
153d0 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a  o the job..    *
153e0 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e  /.    u32 savedN
153f0 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
15400 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
15410 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65      int rMayHave
15420 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54  Null = 0;.    eT
15430 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45  ype = IN_INDEX_E
15440 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c  PH;.    if( inFl
15450 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c  ags & IN_INDEX_L
15460 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OOP ){.      pPa
15470 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
15480 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
15490 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  X->pLeft->iColum
154a0 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50  n<0 && !ExprHasP
154b0 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
154c0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
154d0 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
154e0 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20  INDEX_ROWID;.   
154f0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
15500 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
15510 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48  ){.      *prRhsH
15520 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76  asNull = rMayHav
15530 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  eNull = ++pParse
15540 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  ->nMem;.    }.  
15550 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
15560 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
15570 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  X, rMayHaveNull,
15580 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
15590 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61  _ROWID);.    pPa
155a0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
155b0 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  = savedNQueryLoo
155c0 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  p;.  }else{.    
155d0 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pX->iTable = iTa
155e0 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69  b;.  }..  if( ai
155f0 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e  Map && eType!=IN
15600 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
15610 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e   && eType!=IN_IN
15620 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29  DEX_INDEX_DESC )
15630 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  {.    int i, n;.
15640 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45      n = sqlite3E
15650 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58  xprVectorSize(pX
15660 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f  ->pLeft);.    fo
15670 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
15680 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20   aiMap[i] = i;. 
15690 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70   }.  return eTyp
156a0 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  e;.}.#endif..#if
156b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
156c0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
156d0 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69  Argument pExpr i
156e0 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49  s an (?, ?...) I
156f0 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  N(...) expressio
15700 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  n. This .** func
15710 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
15720 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  nd returns a nul
15730 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
15740 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a  ng containing .*
15750 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73  * the affinities
15760 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
15770 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  each column of t
15780 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a  he comparison..*
15790 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  *.** It is the r
157a0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
157b0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
157c0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72  nsure that the r
157d0 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e  eturned.** strin
157e0 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20  g is eventually 
157f0 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69  freed using sqli
15800 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a  te3DbFree()..*/.
15810 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70  static char *exp
15820 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73  rINAffinity(Pars
15830 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
15840 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20  *pExpr){.  Expr 
15850 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
15860 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61  pLeft;.  int nVa
15870 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  l = sqlite3ExprV
15880 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29  ectorSize(pLeft)
15890 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  ;.  Select *pSel
158a0 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66 6c  ect = (pExpr->fl
158b0 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
158c0 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ct) ? pExpr->x.p
158d0 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63 68  Select : 0;.  ch
158e0 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73 73  ar *zRet;..  ass
158f0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
15900 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74 20  TK_IN );.  zRet 
15910 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
15920 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c  cRaw(pParse->db,
15930 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20   nVal+1);.  if( 
15940 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  zRet ){.    int 
15950 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
15960 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVal; i++){.  
15970 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20 73      Expr *pA = s
15980 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
15990 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
159a0 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61  i);.      char a
159b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
159c0 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20 20  finity(pA);.    
159d0 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
159e0 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d  .        zRet[i]
159f0 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
15a00 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65 63  eAffinity(pSelec
15a10 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
15a20 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20 20  pExpr, a);.     
15a30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15a40 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20 20  zRet[i] = a;.   
15a50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
15a60 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27  Ret[nVal] = '\0'
15a70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
15a80 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Ret;.}.#endif..#
15a90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15aa0 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
15ab0 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73 65  * Load the Parse
15ac0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
15ad0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
15ae0 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72 72  ment with an err
15af0 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f  or .** message o
15b00 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
15b10 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20  *   "sub-select 
15b20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e  returns N column
15b30 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22 0a  s - expected M".
15b40 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74  */   .void sqlit
15b50 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
15b60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15b70 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e 74  int nActual, int
15b80 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f 6e   nExpect){.  con
15b90 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20  st char *zFmt = 
15ba0 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
15bb0 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 2d  rns %d columns -
15bc0 20 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a 20   expected %d";. 
15bd0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15be0 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20 6e  (pParse, zFmt, n
15bf0 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74 29  Actual, nExpect)
15c00 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
15c10 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * Expression pEx
15c20 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 20 74  pr is a vector t
15c30 68 61 74 20 68 61 73 20 62 65 65 6e 20 75 73 65  hat has been use
15c40 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20 77  d in a context w
15c50 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  here.** it is no
15c60 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66 20  t permitted. If 
15c70 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73  pExpr is a sub-s
15c80 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74 68  elect vector, th
15c90 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 6c  is routine .** l
15ca0 6f 61 64 73 20 74 68 65 20 50 61 72 73 65 20 6f  oads the Parse o
15cb0 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65 73  bject with a mes
15cc0 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  sage of the form
15cd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73  :.**.**   "sub-s
15ce0 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20  elect returns N 
15cf0 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
15d00 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ed 1".**.** Or, 
15d10 69 66 20 69 74 20 69 73 20 61 20 72 65 67 75 6c  if it is a regul
15d20 61 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f 72  ar scalar vector
15d30 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20 76  :.**.**   "row v
15d40 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a 2f  alue misused".*/
15d50 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33     .void sqlite3
15d60 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 50  VectorErrorMsg(P
15d70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
15d80 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66 6e  pr *pExpr){.#ifn
15d90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15da0 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70  SUBQUERY.  if( p
15db0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
15dc0 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20  _xIsSelect ){.  
15dd0 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
15de0 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
15df0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
15e00 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
15e10 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e   1);.  }else.#en
15e20 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
15e30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15e40 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
15e50 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a  isused");.  }.}.
15e60 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15e70 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
15e80 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
15e90 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78  as a subquery ex
15ea0 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53  pression, EXISTS
15eb0 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61  ,.** or IN opera
15ec0 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a  tors.  Examples:
15ed0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45  .**.**     (SELE
15ee0 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
15ef0 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72        -- subquer
15f00 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20  y.**     EXISTS 
15f10 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
15f20 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75  )   -- EXISTS su
15f30 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20  bquery.**     x 
15f40 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
15f50 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
15f60 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
15f70 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
15f80 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
15f90 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
15fa0 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
15fb0 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
15fc0 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
15fd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
15fe0 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72   parameter descr
15ff0 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ibes the express
16000 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
16010 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72  s the IN.** oper
16020 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79  ator or subquery
16030 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
16040 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20  eter isRowid is 
16050 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65  non-zero, then e
16060 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
16070 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
16080 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f   to be of the fo
16090 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28  rm "<rowid> IN (
160a0 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65  ?, ?, ?)", where
160b0 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65   <rowid> is a re
160c0 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f  ference.** to so
160d0 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63  me integer key c
160e0 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
160f0 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73   B-Tree. In this
16100 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a   case, use an.**
16110 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74   intkey B-Tree t
16120 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
16130 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65  of IN(...) value
16140 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  s instead of the
16150 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65   usual.** (slowe
16160 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  r) variable leng
16170 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a  th keys B-Tree..
16180 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76  **.** If rMayHav
16190 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72  eNull is non-zer
161a0 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
161b0 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  at the operation
161c0 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f   is an IN.** (no
161d0 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  t a SELECT or EX
161e0 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74  ISTS) and that t
161f0 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e  he RHS might con
16200 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20  tains NULLs..** 
16210 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
16220 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c   does is initial
16230 69 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72  ize the register
16240 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61   given by rMayHa
16250 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c  veNull.** to NUL
16260 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74  L.  Calling rout
16270 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63  ines will take c
16280 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20  are of changing 
16290 74 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a  this register.**
162a0 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55   value to non-NU
162b0 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73  LL if the RHS is
162c0 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a   NULL-free..**.*
162d0 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f  * For a SELECT o
162e0 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
162f0 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  r, return the re
16300 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
16310 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e  s the.** result.
16320 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f    For a multi-co
16330 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65  lumn SELECT, the
16340 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
16350 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75  d in a contiguou
16360 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65  s.** array of re
16370 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
16380 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
16390 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
163a0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
163b0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20   result column. 
163c0 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e   Return 0 for IN
163d0 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66   operators or if
163e0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
163f0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
16400 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16410 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  Y.int sqlite3Cod
16420 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61  eSubselect(.  Pa
16430 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
16440 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16450 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
16460 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
16470 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c        /* The IN,
16480 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53   SELECT, or EXIS
16490 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  TS operator */. 
164a0 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61   int rHasNullFla
164b0 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  g,       /* Regi
164c0 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64  ster that record
164d0 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20  s whether NULLs 
164e0 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a  exist in RHS */.
164f0 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20    int isRowid   
16500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
16510 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20  true, LHS of IN 
16520 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f  operator is a ro
16530 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  wid */.){.  int 
16540 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
16550 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
16560 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
16570 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
16580 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d   */.  int rReg =
16590 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
165b0 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e   Register storin
165c0 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20  g resulting */. 
165d0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
165e0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
165f0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
16600 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
16610 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75  ..  /* The evalu
16620 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f  ation of the IN/
16630 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75  EXISTS/SELECT mu
16640 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65  st be repeated e
16650 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a  very time it.  *
16660 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
16670 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
16680 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
16690 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
166a0 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
166b0 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
166c0 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
166d0 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
166e0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
166f0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
16700 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
16710 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
16720 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
16730 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
16740 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
16750 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
16760 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
16770 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
16780 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
16790 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
167a0 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
167b0 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
167c0 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
167d0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
167e0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
167f0 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
16800 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70  lect) ){.    jmp
16810 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69  IfDynamic = sqli
16820 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
16830 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
16840 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
16850 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
16860 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
16870 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
16880 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
16890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
168a0 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65  ddress of OP_Ope
168b0 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
168c0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uction */.      
168d0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
168e0 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74  xpr->pLeft; /* t
168f0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
16900 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
16910 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
16920 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f  Info = 0;      /
16930 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f  * Key informatio
16940 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  n */.      int n
16950 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Val;            
16960 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
16970 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a  f vector pLeft *
16980 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e  /.      .      n
16990 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Val = sqlite3Exp
169a0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66  rVectorSize(pLef
169b0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
169c0 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56  ( !isRowid || nV
169d0 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20  al==1 );..      
169e0 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20  /* Whether this 
169f0 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45  is an 'x IN(SELE
16a00 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78  CT...)' or an 'x
16a10 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27   IN(<exprlist>)'
16a20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
16a30 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c  sion it is handl
16a40 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e  ed the same way.
16a50 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74    An ephemeral t
16a60 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a  able is .      *
16a70 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e  * filled with in
16a80 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
16a90 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
16aa0 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
16ab0 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74    ** SELECT or t
16ac0 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20  he <exprlist>.. 
16ad0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16ae0 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72   If the 'x' expr
16af0 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
16b00 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65  mn value, or the
16b10 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20   SELECT....     
16b20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
16b30 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76  turns a column v
16b40 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61  alue, then the a
16b50 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a  ffinity of that.
16b60 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20        ** column 
16b70 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
16b80 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e   the index keys.
16b90 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64   If both 'x' and
16ba0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45   the.      ** SE
16bb0 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
16bc0 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
16bd0 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
16be0 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20  nity is used.   
16bf0 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20     ** if either 
16c00 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52  column has NUMER
16c10 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66  IC or INTEGER af
16c20 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68  finity. If neith
16c30 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20  er.      ** 'x' 
16c40 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  nor the SELECT..
16c50 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
16c60 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
16c70 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20  meric affinity. 
16c80 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e       ** is used.
16c90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16ca0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
16cb0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
16cc0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
16cd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16ce0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
16cf0 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  al, .          p
16d00 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69  Expr->iTable, (i
16d10 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b  sRowid?0:nVal));
16d20 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
16d30 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20  = isRowid ? 0 : 
16d40 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
16d50 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
16d60 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20  nVal, 1);..     
16d70 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16d80 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
16d90 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
16da0 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20       /* Case 1: 
16db0 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
16dc0 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20  ECT ...).       
16dd0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47   **.        ** G
16de0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
16df0 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  write the result
16e00 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  s of the select 
16e10 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  into the tempora
16e20 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ry.        ** ta
16e30 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  ble allocated an
16e40 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a  d opened above..
16e50 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16e60 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65     Select *pSele
16e70 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  ct = pExpr->x.pS
16e80 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 45  elect;.        E
16e90 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
16ea0 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
16eb0 74 3b 0a 0a 20 20 20 20 20 20 20 20 45 78 70 6c  t;..        Expl
16ec0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
16ed0 61 72 73 65 2c 20 31 2c 20 22 25 73 4c 49 53 54  arse, 1, "%sLIST
16ee0 20 53 55 42 51 55 45 52 59 22 2c 0a 20 20 20 20   SUBQUERY",.    
16ef0 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e          jmpIfDyn
16f00 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52  amic>=0?"":"CORR
16f10 45 4c 41 54 45 44 20 22 0a 20 20 20 20 20 20 20  ELATED ".       
16f20 20 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ));.        ass
16f30 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b  ert( !isRowid );
16f40 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
16f50 68 65 20 4c 48 53 20 61 6e 64 20 52 48 53 20 6f  he LHS and RHS o
16f60 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
16f70 72 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20  r do not match, 
16f80 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
16f90 65 72 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20  error will have 
16fa0 62 65 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67  been caught long
16fb0 20 62 65 66 6f 72 65 20 77 65 20 72 65 61 63 68   before we reach
16fc0 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a   this point. */.
16fd0 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41          if( ALWA
16fe0 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  YS(pEList->nExpr
16ff0 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  ==nVal) ){.     
17000 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
17010 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dest;.          
17020 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
17030 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
17040 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
17050 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
17060 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  able);.         
17070 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d   dest.zAffSdst =
17080 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28   exprINAffinity(
17090 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
170a0 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 65 63            pSelec
170b0 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  t->iLimit = 0;. 
170c0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
170d0 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  e( pSelect->selF
170e0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
170f0 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ct );.          
17100 74 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e  testcase( pKeyIn
17110 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73  fo==0 ); /* Caus
17120 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c  ed by OOM in sql
17130 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
17140 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  () */.          
17150 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
17160 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
17170 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  t, &dest) ){.   
17180 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17190 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
171a0 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74  b, dest.zAffSdst
171b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
171c0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
171d0 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ef(pKeyInfo);.  
171e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
171f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
17200 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17210 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
17220 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73  db, dest.zAffSds
17230 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
17240 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d  sert( pKeyInfo!=
17250 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c  0 ); /* OOM will
17260 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74 65   cause exit afte
17270 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  r sqlite3Select(
17280 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  ) */.          a
17290 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
172a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
172b0 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45  sert( pEList->nE
172c0 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  xpr>0 );.       
172d0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
172e0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
172f0 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
17300 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
17310 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  i=0; i<nVal; i++
17320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
17330 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
17340 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
17350 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  pr(pLeft, i);.  
17360 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
17370 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  fo->aColl[i] = s
17380 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
17390 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20  areCollSeq(.    
173a0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
173b0 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61  se, p, pEList->a
173c0 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20  [i].pExpr.      
173d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
173e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
173f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
17400 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
17410 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
17420 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
17430 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
17440 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a  list).        **
17450 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  .        ** For 
17460 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c  each expression,
17470 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20   build an index 
17480 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61  key from the eva
17490 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  luation and.    
174a0 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
174b0 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
174c0 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72   table. If <expr
174d0 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  > is a column, t
174e0 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20  hen use.        
174f0 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
17500 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
17510 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
17520 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
17530 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
17540 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d   column, use num
17550 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20  eric affinity.. 
17560 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17570 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
17580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
17590 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c  ffinity of the L
175a0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a  HS of the IN */.
175b0 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
175c0 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
175d0 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
175e0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  x.pList;.       
175f0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
17600 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
17610 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
17620 2c 20 72 33 3b 0a 20 20 20 20 20 20 20 20 61 66  , r3;.        af
17630 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
17640 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
17650 66 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ft);.        if(
17660 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   !affinity ){.  
17670 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
17680 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
17690 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OB;.        }.  
176a0 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
176b0 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
176c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
176d0 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
176e0 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
176f0 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
17700 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  o->aColl[0] = sq
17710 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
17720 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
17730 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
17740 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  }..        /* Lo
17750 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
17760 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65  expression in <e
17770 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20  xprlist>. */.   
17780 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
17790 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
177a0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  se);.        r2 
177b0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
177c0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
177d0 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
177e0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
177f0 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
17800 20 30 2c 20 72 32 2c 20 30 2c 20 22 22 2c 20 50   0, r2, 0, "", P
17810 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
17820 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e     for(i=pList->
17830 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69  nExpr, pItem=pLi
17840 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  st->a; i>0; i--,
17850 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
17860 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
17870 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
17880 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61           int iVa
17890 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20  lToIns;..       
178a0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70     /* If the exp
178b0 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63  ression is not c
178c0 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20  onstant then we 
178d0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20  will need to.   
178e0 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c         ** disabl
178f0 65 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20  e the test that 
17900 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62  was generated ab
17910 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ove that makes s
17920 75 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ure.          **
17930 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20   this code only 
17940 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20  executes once.  
17950 42 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f  Because for a no
17960 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20  n-constant.     
17970 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
17980 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  on we need to re
17990 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61  run this code ea
179a0 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  ch time..       
179b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
179c0 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  if( jmpIfDynamic
179d0 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  >=0 && !sqlite3E
179e0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
179f0 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
17a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
17a10 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70  ngeToNoop(v, jmp
17a20 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20  IfDynamic);.    
17a30 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e          jmpIfDyn
17a40 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20  amic = -1;.     
17a50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
17a60 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
17a70 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
17a80 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
17a90 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  the temp table *
17aa0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
17ab0 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74  isRowid && sqlit
17ac0 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
17ad0 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29  pE2, &iValToIns)
17ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17af0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17b00 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e  3(v, OP_InsertIn
17b10 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
17b20 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29  , r2, iValToIns)
17b30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
17b40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
17b50 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  3 = sqlite3ExprC
17b60 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
17b70 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20  , pE2, r1);.    
17b80 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
17b90 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
17ba0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17bb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
17bc0 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20  tBeInt, r3,.    
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17be0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
17bf0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
17c00 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20  dr(v)+2);.      
17c10 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
17c20 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
17c30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17c40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
17c50 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
17c60 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20  able, r2, r3);. 
17c70 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
17c80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
17c90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17ca0 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
17cb0 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26  rd, r3, 1, r2, &
17cc0 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
17cd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
17ce0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
17cf0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
17d00 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
17d10 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20   r2, r3, 1);.   
17d20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
17d40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17d50 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
17d60 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
17d70 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17d80 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17d90 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
17da0 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
17db0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  o ){.        sql
17dc0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
17dd0 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
17de0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
17df0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d  EYINFO);.      }
17e00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17e10 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
17e20 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
17e30 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
17e40 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
17e50 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 20 20    /* Case 3:    
17e60 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
17e70 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20   ...).      **  
17e80 20 20 20 6f 72 3a 20 20 20 20 45 58 49 53 54 53     or:    EXISTS
17e90 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
17ea0 20 2e 2e 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20   ...).      **. 
17eb0 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 53 45       ** For a SE
17ec0 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63  LECT, generate c
17ed0 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 20 76  ode to put the v
17ee0 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  alues for all co
17ef0 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a  lumns of.      *
17f00 2a 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  * the first row 
17f10 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
17f20 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 72   registers and r
17f30 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
17f40 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
17f50 66 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a  first register..
17f60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17f70 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
17f80 45 58 49 53 54 53 2c 20 77 72 69 74 65 20 61 6e  EXISTS, write an
17f90 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20   integer 0 (not 
17fa0 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78  exists) or 1 (ex
17fb0 69 73 74 73 29 0a 20 20 20 20 20 20 2a 2a 20 69  ists).      ** i
17fc0 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61  nto a register a
17fd0 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 20 72  nd return that r
17fe0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a  egister number..
17ff0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
18000 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 2c  * In both cases,
18010 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 75   the query is au
18020 67 6d 65 6e 74 65 64 20 77 69 74 68 20 22 4c 49  gmented with "LI
18030 4d 49 54 20 31 22 2e 20 20 41 6e 79 20 0a 20 20  MIT 1".  Any .  
18040 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69      ** preexisti
18050 6e 67 20 6c 69 6d 69 74 20 69 73 20 64 69 73 63  ng limit is disc
18060 61 72 64 65 64 20 69 6e 20 70 6c 61 63 65 20 6f  arded in place o
18070 66 20 74 68 65 20 6e 65 77 20 4c 49 4d 49 54 20  f the new LIMIT 
18080 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  1..      */.    
18090 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180b0 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
180c0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  T statement to e
180d0 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53  ncode */.      S
180e0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
180f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18100 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
18110 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 54 20  eal with SELECT 
18120 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
18130 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20  int nReg;       
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
18160 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
18170 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
18180 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  imit;           
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
181a0 20 4e 65 77 20 6c 69 6d 69 74 20 65 78 70 72 65   New limit expre
181b0 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  ssion */..      
181c0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
181d0 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
181e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
181f0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
18200 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
18210 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
18220 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20  p==TK_EXISTS || 
18230 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
18240 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73  LECT );.      as
18250 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
18260 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18270 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 0a 20  xIsSelect) );.. 
18280 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70       pSel = pExp
18290 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
182a0 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
182b0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
182c0 20 22 25 73 53 43 41 4c 41 52 20 53 55 42 51 55   "%sSCALAR SUBQU
182d0 45 52 59 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ERY",.          
182e0 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d    jmpIfDynamic>=
182f0 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44  0?"":"CORRELATED
18300 20 22 29 29 3b 0a 20 20 20 20 20 20 6e 52 65 67   "));.      nReg
18310 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
18320 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e  _SELECT ? pSel->
18330 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  pEList->nExpr : 
18340 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
18350 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
18360 64 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d  dest, 0, pParse-
18370 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20  >nMem+1);.      
18380 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
18390 6e 52 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20  nReg;.      if( 
183a0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
183b0 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
183c0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
183d0 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65  _Mem;.        de
183e0 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  st.iSdst = dest.
183f0 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20  iSDParm;.       
18400 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52   dest.nSdst = nR
18410 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  eg;.        sqli
18420 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
18430 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73   OP_Null, 0, des
18440 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e  t.iSDParm, dest.
18450 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b  iSDParm+nReg-1);
18460 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
18470 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
18480 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
18490 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
184a0 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
184b0 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
184c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
184d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
184e0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
184f0 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
18500 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
18510 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
18520 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
18530 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 6d 69 74    }.      pLimit
18540 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
18550 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
18560 54 4b 5f 49 4e 54 45 47 45 52 2c 26 73 71 6c 69  TK_INTEGER,&sqli
18570 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c  te3IntTokens[1],
18580 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
18590 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sel->pLimit ){. 
185a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
185b0 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
185c0 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69  >db, pSel->pLimi
185d0 74 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  t->pLeft);.     
185e0 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d     pSel->pLimit-
185f0 3e 70 4c 65 66 74 20 3d 20 70 4c 69 6d 69 74 3b  >pLeft = pLimit;
18600 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18610 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d        pSel->pLim
18620 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  it = sqlite3PExp
18630 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 49 4d  r(pParse, TK_LIM
18640 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a  IT, pLimit, 0);.
18650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
18660 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  el->iLimit = 0;.
18670 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
18680 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
18690 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a  pSel, &dest) ){.
186a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
186b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
186c0 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50  rReg = dest.iSDP
186d0 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53  arm;.      ExprS
186e0 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
186f0 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
18700 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18710 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
18720 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b   rHasNullFlag ){
18730 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48  .    sqlite3SetH
18740 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45  asNullFlag(v, pE
18750 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61  xpr->iTable, rHa
18760 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a  sNullFlag);.  }.
18770 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61  .  if( jmpIfDyna
18780 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  mic>=0 ){.    sq
18790 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
187a0 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69  e(v, jmpIfDynami
187b0 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c);.  }..  retur
187c0 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66  n rReg;.}.#endif
187d0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
187e0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
187f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18800 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
18810 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49  Expr pIn is an I
18820 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  N(...) expressio
18830 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  n. This function
18840 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
18850 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
18860 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
18870 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20  e IN() operator 
18880 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  has the same num
18890 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d  ber of .** colum
188a0 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f 72  ns as the vector
188b0 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c   on the LHS. Or,
188c0 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   if the RHS of t
188d0 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a  he IN() is not .
188e0 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20  ** a sub-query, 
188f0 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73 20  that the LHS is 
18900 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65  a vector of size
18910 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   1..*/.int sqlit
18920 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61  e3ExprCheckIN(Pa
18930 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
18940 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e  r *pIn){.  int n
18950 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Vector = sqlite3
18960 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
18970 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  In->pLeft);.  if
18980 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20  ( (pIn->flags & 
18990 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
189a0 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72  .    if( nVector
189b0 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74  !=pIn->x.pSelect
189c0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
189d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
189e0 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
189f0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53  Parse, pIn->x.pS
18a00 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
18a10 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a  Expr, nVector);.
18a20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
18a30 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
18a40 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a  ( nVector!=1 ){.
18a50 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f      sqlite3Vecto
18a60 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  rErrorMsg(pParse
18a70 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20  , pIn->pLeft);. 
18a80 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
18a90 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
18aa0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
18ab0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
18ac0 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
18ad0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49  te code for an I
18ae0 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  N expression..**
18af0 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53  .**      x IN (S
18b00 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20  ELECT ...).**   
18b10 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20     x IN (value, 
18b20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a  value, ...).**.*
18b30 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  * The left-hand 
18b40 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20  side (LHS) is a 
18b50 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f 72  scalar or vector
18b60 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
18b70 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
18b80 20 73 69 64 65 20 28 52 48 53 29 20 69 73 20 61   side (RHS) is a
18b90 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20  n array of zero 
18ba0 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20 76  or more scalar v
18bb0 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73  alues, or a.** s
18bc0 75 62 71 75 65 72 79 2e 20 20 49 66 20 74 68 65  ubquery.  If the
18bd0 20 52 48 53 20 69 73 20 61 20 73 75 62 71 75 65   RHS is a subque
18be0 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ry, the number o
18bf0 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
18c00 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74   must.** match t
18c10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
18c20 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74  umns in the vect
18c30 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20  or on the LHS.  
18c40 49 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a 2a  If the RHS is.**
18c50 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
18c60 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20  s, the LHS must 
18c70 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a  be a scalar. .**
18c80 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61  .** The IN opera
18c90 74 6f 72 20 69 73 20 74 72 75 65 20 69 66 20 74  tor is true if t
18ca0 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73 20  he LHS value is 
18cb0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
18cc0 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65   the RHS..** The
18cd0 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65   result is false
18ce0 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 64   if the LHS is d
18cf0 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e  efinitely not in
18d00 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 0a   the RHS.  The .
18d10 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  ** result is NUL
18d20 4c 20 69 66 20 74 68 65 20 70 72 65 73 65 6e 63  L if the presenc
18d30 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20  e of the LHS in 
18d40 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20 62  the RHS cannot b
18d50 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  e .** determined
18d60 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a   due to NULLs..*
18d70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18d80 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
18d90 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64   that jumps to d
18da0 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68  estIfFalse if th
18db0 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a  e LHS is not .**
18dc0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
18dd0 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64  n the RHS.  If d
18de0 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63  ue to NULLs we c
18df0 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
18e00 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73  if the LHS.** is
18e10 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
18e20 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20  e RHS then jump 
18e30 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20  to destIfNull.  
18e40 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f  If the LHS is co
18e50 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69  ntained.** withi
18e60 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66  n the RHS then f
18e70 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a  all through..**.
18e80 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70 61 72  ** See the separ
18e90 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e  ate in-operator.
18ea0 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  md documentation
18eb0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61 6e   file in the can
18ec0 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65  onical.** SQLite
18ed0 20 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f 72   source tree for
18ee0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
18ef0 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
18f00 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  ic void sqlite3E
18f10 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72  xprCodeIN(.  Par
18f20 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
18f30 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
18f40 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
18f50 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
18f60 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
18f70 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65       /* The IN e
18f80 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
18f90 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  nt destIfFalse, 
18fa0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
18fb0 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20  e if LHS is not 
18fc0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
18fd0 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65   RHS */.  int de
18fe0 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20  stIfNull        
18ff0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
19000 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  the results are 
19010 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e  unknown due to N
19020 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ULLs */.){.  int
19030 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30   rRhsHasNull = 0
19040 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  ;  /* Register t
19050 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52  hat is true if R
19060 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  HS contains NULL
19070 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
19080 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20   eType;         
19090 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
190a0 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72  e RHS */.  int r
190b0 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lhs;            
190c0 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29 20   /* Register(s) 
190d0 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53 20  holding the LHS 
190e0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
190f0 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20 20  rLhsOrig;       
19100 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73 20    /* LHS values 
19110 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65 72  prior to reorder
19120 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a  ing by aiMap[] *
19130 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
19140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
19150 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
19160 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
19170 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20  nt *aiMap = 0;  
19180 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d       /* Map from
19190 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f   vector field to
191a0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f   index column */
191b0 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20  .  char *zAff = 
191c0 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69  0;       /* Affi
191d0 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20  nity string for 
191e0 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20  comparisons */. 
191f0 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20   int nVector;   
19200 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
19210 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68  f vectors for th
19220 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  is IN operator *
19230 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20  /.  int iDummy; 
19240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d            /* Dum
19250 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  my parameter to 
19260 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 29  exprCodeVector()
19270 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
19280 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
19290 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
192a0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
192b0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
192c0 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75       /* loop cou
192d0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65  nter */.  int de
192e0 73 74 53 74 65 70 32 3b 20 20 20 20 20 20 20 20  stStep2;        
192f0 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
19300 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e   when NULLs seen
19310 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20 20   in step 2 */.  
19320 69 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d 20  int destStep6 = 
19330 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f  0;    /* Start o
19340 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70 20  f code for Step 
19350 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  6 */.  int addrT
19360 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20  ruthOp;      /* 
19370 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f 64  Address of opcod
19380 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  e that determine
19390 73 20 74 68 65 20 49 4e 20 69 73 20 74 72 75 65  s the IN is true
193a0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f   */.  int destNo
193b0 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a  tNull;      /* J
193c0 75 6d 70 20 68 65 72 65 20 69 66 20 61 20 63 6f  ump here if a co
193d0 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20  mparison is not 
193e0 74 72 75 65 20 69 6e 20 73 74 65 70 20 36 20 2a  true in step 6 *
193f0 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
19400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
19410 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20 6c   of the step-6 l
19420 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66 74  oop */ ..  pLeft
19430 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
19440 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
19450 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73 65  prCheckIN(pParse
19460 2c 20 70 45 78 70 72 29 20 29 20 72 65 74 75 72  , pExpr) ) retur
19470 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70 72  n;.  zAff = expr
19480 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  INAffinity(pPars
19490 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56 65  e, pExpr);.  nVe
194a0 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78  ctor = sqlite3Ex
194b0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
194c0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69  pr->pLeft);.  ai
194d0 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  Map = (int*)sqli
194e0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
194f0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
19500 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65  b, nVector*(size
19510 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66  of(int) + sizeof
19520 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b  (char)) + 1.  );
19530 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
19540 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19550 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78  ) goto sqlite3Ex
19560 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72  prCodeIN_oom_err
19570 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70  or;..  /* Attemp
19580 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  t to compute the
19590 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73   RHS. After this
195a0 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69   step, if anythi
195b0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20  ng other than.  
195c0 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  ** IN_INDEX_NOOP
195d0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
195e0 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69  e table opened i
195f0 74 68 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d  th cursor pExpr-
19600 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  >iTable .  ** co
19610 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
19620 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
19630 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e  he RHS. If IN_IN
19640 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75  DEX_NOOP is retu
19650 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52  rned,.  ** the R
19660 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  HS has not yet b
19670 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20  een coded.  */. 
19680 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
19690 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
196a0 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f  =0 );       /* O
196b0 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f  OM detected prio
196c0 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
196d0 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43  e */.  VdbeNoopC
196e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
196f0 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20  n IN expr"));.  
19700 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
19710 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
19720 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20  e, pExpr,.      
19730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19740 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f         IN_INDEX_
19750 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f  MEMBERSHIP | IN_
19760 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20  INDEX_NOOP_OK,. 
19770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19780 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74              dest
19790 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
197a0 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48  ull ? 0 : &rRhsH
197b0 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a  asNull, aiMap);.
197c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
197d0 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74  e->nErr || nVect
197e0 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d  or==1 || eType==
197f0 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20  IN_INDEX_EPH.   
19800 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e      || eType==IN
19810 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
19820 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
19830 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a  DEX_INDEX_DESC .
19840 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49    );.#ifdef SQLI
19850 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f  TE_DEBUG.  /* Co
19860 6e 66 69 72 6d 20 74 68 61 74 20 61 69 4d 61 70  nfirm that aiMap
19870 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63  [] contains nVec
19880 74 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c 75  tor integer valu
19890 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  es between 0 and
198a0 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e  .  ** nVector-1.
198b0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
198c0 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
198d0 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a      int j, cnt;.
198e0 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b      for(cnt=j=0;
198f0 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29   j<nVector; j++)
19900 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69   if( aiMap[j]==i
19910 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73   ) cnt++;.    as
19920 73 65 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a  sert( cnt==1 );.
19930 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
19940 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74   Code the LHS, t
19950 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
19960 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
19970 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20  . If the LHS is 
19980 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20  a .  ** vector, 
19990 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72 65  then it is store
199a0 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  d in an array of
199b0 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74 65   nVector registe
199c0 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20 2a  rs starting .  *
199d0 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20  * at r1..  **.  
199e0 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  ** sqlite3FindIn
199f0 49 6e 64 65 78 28 29 20 6d 69 67 68 74 20 68 61  Index() might ha
19a00 76 65 20 72 65 6f 72 64 65 72 65 64 20 74 68 65  ve reordered the
19a10 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4c   fields of the L
19a20 48 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73  HS vector.  ** s
19a30 6f 20 74 68 61 74 20 74 68 65 20 66 69 65 6c 64  o that the field
19a40 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d  s are in the sam
19a50 65 20 6f 72 64 65 72 20 61 73 20 61 6e 20 65 78  e order as an ex
19a60 69 73 74 69 6e 67 20 69 6e 64 65 78 2e 20 20 20  isting index.   
19a70 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d  The.  ** aiMap[]
19a80 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
19a90 61 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  a mapping from t
19aa0 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20  he original LHS 
19ab0 66 69 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20  field order to. 
19ac0 20 2a 2a 20 74 68 65 20 66 69 65 6c 64 20 6f 72   ** the field or
19ad0 64 65 72 20 74 68 61 74 20 6d 61 74 63 68 65 73  der that matches
19ae0 20 74 68 65 20 52 48 53 20 69 6e 64 65 78 2e 0a   the RHS index..
19af0 20 20 2a 2f 0a 20 20 72 4c 68 73 4f 72 69 67 20    */.  rLhsOrig 
19b00 3d 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  = exprCodeVector
19b10 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
19b20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28  &iDummy);.  for(
19b30 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26  i=0; i<nVector &
19b40 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69  & aiMap[i]==i; i
19b50 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53  ++){} /* Are LHS
19b60 20 66 69 65 6c 64 73 20 72 65 6f 72 64 65 72 65   fields reordere
19b70 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e  d? */.  if( i==n
19b80 56 65 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a  Vector ){.    /*
19b90 20 4c 48 53 20 66 69 65 6c 64 73 20 61 72 65 20   LHS fields are 
19ba0 6e 6f 74 20 72 65 6f 72 64 65 72 65 64 20 2a 2f  not reordered */
19bb0 0a 20 20 20 20 72 4c 68 73 20 3d 20 72 4c 68 73  .    rLhs = rLhs
19bc0 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Orig;.  }else{. 
19bd0 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
19be0 6f 72 64 65 72 20 74 68 65 20 4c 48 53 20 66 69  order the LHS fi
19bf0 65 6c 64 73 20 61 63 63 6f 72 64 69 6e 67 20 74  elds according t
19c00 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72  o aiMap */.    r
19c10 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Lhs = sqlite3Get
19c20 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
19c30 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
19c40 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
19c50 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
19c60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19c70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c  3(v, OP_Copy, rL
19c80 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61  hsOrig+i, rLhs+a
19c90 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20  iMap[i], 0);.   
19ca0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
19cb0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
19cc0 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e  ex() did not fin
19cd0 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69  d or create an i
19ce0 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a  ndex that is.  *
19cf0 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65  * suitable for e
19d00 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e  valuating the IN
19d10 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20   operator, then 
19d20 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61  evaluate using a
19d30 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f  .  ** sequence o
19d40 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20  f comparisons.. 
19d50 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
19d60 20 73 74 65 70 20 28 31 29 20 69 6e 20 74 68 65   step (1) in the
19d70 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20   in-operator.md 
19d80 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69  optimized algori
19d90 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  thm..  */.  if( 
19da0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
19db0 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72  NOOP ){.    Expr
19dc0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
19dd0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
19de0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
19df0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
19e00 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
19e10 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
19e20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73   int labelOk = s
19e30 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
19e40 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  bel(v);.    int 
19e50 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20  r2, regToFree;. 
19e60 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c     int regCkNull
19e70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
19e80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
19e90 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
19ea0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
19eb0 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ct) );.    if( d
19ec0 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
19ed0 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
19ee0 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69  regCkNull = sqli
19ef0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
19f00 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
19f10 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19f20 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68  , OP_BitAnd, rLh
19f30 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75  s, rLhs, regCkNu
19f40 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ll);.    }.    f
19f50 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73  or(ii=0; ii<pLis
19f60 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  t->nExpr; ii++){
19f70 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
19f80 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
19f90 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
19fa0 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67  [ii].pExpr, &reg
19fb0 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69  ToFree);.      i
19fc0 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20  f( regCkNull && 
19fd0 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
19fe0 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69  Null(pList->a[ii
19ff0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
1a000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a010 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41  ddOp3(v, OP_BitA
1a020 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72  nd, regCkNull, r
1a030 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  2, regCkNull);. 
1a040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1a050 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
1a060 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c  -1 || destIfNull
1a070 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  !=destIfFalse ){
1a080 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a090 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1a0a0 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c  _Eq, rLhs, label
1a0b0 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20  Ok, r2,.        
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0d0 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
1a0e0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
1a0f0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1a100 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d  eIf(v, ii<pList-
1a110 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
1a120 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1a130 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e  f(v, ii==pList->
1a140 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20  nExpr-1);.      
1a150 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1a160 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d  ngeP5(v, zAff[0]
1a170 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1a180 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a190 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
1a1a0 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20  IfFalse );.     
1a1b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a1c0 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp4(v, OP_Ne, r
1a1d0 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73 65  Lhs, destIfFalse
1a1e0 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20  , r2,.          
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
1a210 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43  _COLLSEQ); VdbeC
1a220 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1a230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1a240 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b  hangeP5(v, zAff[
1a250 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  0] | SQLITE_JUMP
1a260 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d  IFNULL);.      }
1a270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1a280 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1a290 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b  rse, regToFree);
1a2a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1a2b0 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  egCkNull ){.    
1a2c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a2d0 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
1a2e0 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73  , regCkNull, des
1a2f0 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f  tIfNull); VdbeCo
1a300 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1a310 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1a320 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
1a330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1a340 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1a350 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b  bel(v, labelOk);
1a360 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1a370 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1a380 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  e, regCkNull);. 
1a390 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45     goto sqlite3E
1a3a0 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1a3b0 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  ed;.  }..  /* St
1a3c0 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20 73  ep 2: Check to s
1a3d0 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 63 6f  ee if the LHS co
1a3e0 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
1a3f0 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68 65  columns.  If the
1a400 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63  .  ** LHS does c
1a410 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65  ontain NULLs the
1a420 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73  n the result mus
1a430 74 20 62 65 20 65 69 74 68 65 72 20 46 41 4c 53  t be either FALS
1a440 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20  E or NULL..  ** 
1a450 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69  We will then ski
1a460 70 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  p the binary sea
1a470 72 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e 0a  rch of the RHS..
1a480 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49    */.  if( destI
1a490 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c  fNull==destIfFal
1a4a0 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53 74  se ){.    destSt
1a4b0 65 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c 73  ep2 = destIfFals
1a4c0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
1a4d0 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74  destStep2 = dest
1a4e0 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33 56  Step6 = sqlite3V
1a4f0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1a500 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1a510 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
1a520 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73  .    Expr *p = s
1a530 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
1a540 64 53 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e  dSubexpr(pExpr->
1a550 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 69  pLeft, i);.    i
1a560 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  f( sqlite3ExprCa
1a570 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20  nBeNull(p) ){.  
1a580 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a590 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
1a5a0 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74  ll, rLhs+i, dest
1a5b0 53 74 65 70 32 29 3b 0a 20 20 20 20 20 20 56 64  Step2);.      Vd
1a5c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a5d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
1a5e0 74 65 70 20 33 2e 20 20 54 68 65 20 4c 48 53 20  tep 3.  The LHS 
1a5f0 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20  is now known to 
1a600 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f  be non-NULL.  Do
1a610 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72   the binary sear
1a620 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52  ch.  ** of the R
1a630 48 53 20 75 73 69 6e 67 20 74 68 65 20 4c 48 53  HS using the LHS
1a640 20 61 73 20 61 20 70 72 6f 62 65 2e 20 20 49 66   as a probe.  If
1a650 20 66 6f 75 6e 64 2c 20 74 68 65 20 72 65 73 75   found, the resu
1a660 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e  lt is.  ** true.
1a670 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1a680 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
1a690 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  D ){.    /* In t
1a6a0 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
1a6b0 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f  S is the ROWID o
1a6c0 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61  f table b-tree a
1a6d0 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20  nd so we also.  
1a6e0 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74    ** know that t
1a6f0 68 65 20 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55  he RHS is non-NU
1a700 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77 65 20 63  LL.  Hence, we c
1a710 6f 6d 62 69 6e 65 20 73 74 65 70 73 20 33 20 61  ombine steps 3 a
1a720 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  nd 4.    ** into
1a730 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
1a740 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
1a750 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1a760 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70 45 78 70  _SeekRowid, pExp
1a770 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
1a780 66 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20  fFalse, rLhs);. 
1a790 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1a7a0 76 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74  v);.    addrTrut
1a7b0 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  hOp = sqlite3Vdb
1a7c0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
1a7d0 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20  to);  /* Return 
1a7e0 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  True */.  }else{
1a7f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a800 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
1a810 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65  inity, rLhs, nVe
1a820 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e  ctor, 0, zAff, n
1a830 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28  Vector);.    if(
1a840 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
1a850 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  stIfNull ){.    
1a860 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65    /* Combine Ste
1a870 70 20 33 20 61 6e 64 20 53 74 65 70 20 35 20 69  p 3 and Step 5 i
1a880 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  nto a single opc
1a890 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ode */.      sql
1a8a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1a8b0 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
1a8c0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1a8d0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a 20 20   destIfFalse,.  
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8f0 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e           rLhs, n
1a900 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76  Vector); VdbeCov
1a910 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1a920 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  goto sqlite3Expr
1a930 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b  CodeIN_finished;
1a940 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72  .    }.    /* Or
1a950 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c 20 66  dinary Step 3, f
1a960 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72  or the case wher
1a970 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c  e FALSE and NULL
1a980 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f   are distinct */
1a990 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70  .    addrTruthOp
1a9a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a9b0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
1a9c0 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
1a9d0 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  le, 0,.         
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68               rLh
1aa00 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62  s, nVector); Vdb
1aa10 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1aa20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 34 2e 20  }..  /* Step 4. 
1aa30 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 6b   If the RHS is k
1aa40 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e  nown to be non-N
1aa50 55 4c 4c 20 61 6e 64 20 77 65 20 64 69 64 20 6e  ULL and we did n
1aa60 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20  ot find.  ** an 
1aa70 6d 61 74 63 68 20 6f 6e 20 74 68 65 20 73 65 61  match on the sea
1aa80 72 63 68 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  rch above, then 
1aa90 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20  the result must 
1aaa0 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20  be FALSE..  */. 
1aab0 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c   if( rRhsHasNull
1aac0 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29   && nVector==1 )
1aad0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1aae0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f  eAddOp2(v, OP_No
1aaf0 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75  tNull, rRhsHasNu
1ab00 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  ll, destIfFalse)
1ab10 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1ab20 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
1ab30 20 53 74 65 70 20 35 2e 20 20 49 66 20 77 65 20   Step 5.  If we 
1ab40 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
1ab50 74 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  t the difference
1ab60 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e   between NULL an
1ab70 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68  d.  ** FALSE, th
1ab80 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 66  en just return f
1ab90 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  alse. .  */.  if
1aba0 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64  ( destIfFalse==d
1abb0 65 73 74 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69  estIfNull ) sqli
1abc0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
1abd0 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20  estIfFalse);..  
1abe0 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20  /* Step 6: Loop 
1abf0 74 68 72 6f 75 67 68 20 72 6f 77 73 20 6f 66 20  through rows of 
1ac00 74 68 65 20 52 48 53 2e 20 20 43 6f 6d 70 61 72  the RHS.  Compar
1ac10 65 20 65 61 63 68 20 72 6f 77 20 74 6f 20 74 68  e each row to th
1ac20 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61  e LHS..  ** If a
1ac30 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  ny comparison is
1ac40 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
1ac50 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20  result is NULL. 
1ac60 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d   If all.  ** com
1ac70 70 61 72 69 73 6f 6e 73 20 61 72 65 20 46 41 4c  parisons are FAL
1ac80 53 45 20 74 68 65 6e 20 74 68 65 20 66 69 6e 61  SE then the fina
1ac90 6c 20 72 65 73 75 6c 74 20 69 73 20 46 41 4c 53  l result is FALS
1aca0 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  E..  **.  ** For
1acb0 20 61 20 73 63 61 6c 61 72 20 4c 48 53 2c 20 69   a scalar LHS, i
1acc0 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
1acd0 74 6f 20 63 68 65 63 6b 20 6a 75 73 74 20 74 68  to check just th
1ace0 65 20 66 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a  e first row.  **
1acf0 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   of the RHS..  *
1ad00 2f 0a 20 20 69 66 28 20 64 65 73 74 53 74 65 70  /.  if( destStep
1ad10 36 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 52  6 ) sqlite3VdbeR
1ad20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1ad30 65 73 74 53 74 65 70 36 29 3b 0a 20 20 61 64 64  estStep6);.  add
1ad40 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
1ad50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1ad60 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  ewind, pExpr->iT
1ad70 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
1ad80 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  e);.  VdbeCovera
1ad90 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56 65  ge(v);.  if( nVe
1ada0 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64 65  ctor>1 ){.    de
1adb0 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69  stNotNull = sqli
1adc0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1add0 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
1ade0 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72    /* For nVector
1adf0 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65  ==1, combine ste
1ae00 70 73 20 36 20 61 6e 64 20 37 20 62 79 20 69 6d  ps 6 and 7 by im
1ae10 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
1ae20 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45  ing.    ** FALSE
1ae30 20 69 66 20 74 68 65 20 66 69 72 73 74 20 63 6f   if the first co
1ae40 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20  mparison is not 
1ae50 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74  NULL */.    dest
1ae60 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66  NotNull = destIf
1ae70 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72  False;.  }.  for
1ae80 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1ae90 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
1aea0 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  *p;.    CollSeq 
1aeb0 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pColl;.    int 
1aec0 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r3 = sqlite3GetT
1aed0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
1aee0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 56      p = sqlite3V
1aef0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
1af00 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
1af10 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1af20 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1af30 73 65 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  se, p);.    sqli
1af40 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1af50 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70   OP_Column, pExp
1af60 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c 20 72 33  r->iTable, i, r3
1af70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1af80 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e  beAddOp4(v, OP_N
1af90 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e  e, rLhs+i, destN
1afa0 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20  otNull, r3,.    
1afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afc0 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
1afd0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
1afe0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1aff0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1b000 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1b010 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73  se, r3);.  }.  s
1b020 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b030 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1b040 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69  destIfNull);.  i
1b050 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a  f( nVector>1 ){.
1b060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1b070 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1b080 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20  estNotNull);.   
1b090 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b0a0 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
1b0b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64  Expr->iTable, ad
1b0c0 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64  drTop+1);.    Vd
1b0d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
1b0e0 20 20 20 20 2f 2a 20 53 74 65 70 20 37 3a 20 20      /* Step 7:  
1b0f0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
1b100 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20   point, we know 
1b110 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
1b120 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 66  must.    ** be f
1b130 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  alse. */.    sql
1b140 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b150 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
1b160 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a  stIfFalse);.  }.
1b170 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65  .  /* Jumps here
1b180 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 74   in order to ret
1b190 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73  urn true. */.  s
1b1a0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1b1b0 72 65 28 76 2c 20 61 64 64 72 54 72 75 74 68 4f  re(v, addrTruthO
1b1c0 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45 78 70 72  p);..sqlite3Expr
1b1d0 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a  CodeIN_finished:
1b1e0 0a 20 20 69 66 28 20 72 4c 68 73 21 3d 72 4c 68  .  if( rLhs!=rLh
1b1f0 73 4f 72 69 67 20 29 20 73 71 6c 69 74 65 33 52  sOrig ) sqlite3R
1b200 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1b210 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 56  arse, rLhs);.  V
1b220 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1b230 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  end IN expr"));.
1b240 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1b250 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73  N_oom_error:.  s
1b260 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
1b270 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b  rse->db, aiMap);
1b280 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1b290 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66  (pParse->db, zAf
1b2a0 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  f);.}.#endif /* 
1b2b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1b2c0 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
1b2d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1b2e0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a  ATING_POINT./*.*
1b2f0 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
1b300 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
1b310 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61  ill put the floa
1b320 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
1b330 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79  lue described by
1b340 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
1b350 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
1b360 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
1b370 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
1b380 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
1b390 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
1b3a0 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
1b3b0 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
1b3c0 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
1b3d0 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
1b3e0 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
1b3f0 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
1b400 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
1b410 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
1b420 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20  deReal(Vdbe *v, 
1b430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
1b440 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69  nt negateFlag, i
1b450 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20  nt iMem){.  if( 
1b460 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a  ALWAYS(z!=0) ){.
1b470 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
1b480 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
1b490 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c  F(z, &value, sql
1b4a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
1b4b0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
1b4c0 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69     assert( !sqli
1b4d0 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20  te3IsNaN(value) 
1b4e0 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74  ); /* The new At
1b4f0 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  oF never returns
1b500 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20   NaN */.    if( 
1b510 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c  negateFlag ) val
1b520 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
1b530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b540 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61  p4Dup8(v, OP_Rea
1b550 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  l, 0, iMem, 0, (
1b560 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52  u8*)&value, P4_R
1b570 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  EAL);.  }.}.#end
1b580 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  if.../*.** Gener
1b590 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
1b5a0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
1b5b0 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
1b5c0 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
1b5d0 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
1b5e0 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
1b5f0 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  *.** Expr.u.zTok
1b600 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46  en is always UTF
1b610 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69  8 and zero-termi
1b620 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nated..*/.static
1b630 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
1b640 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1b650 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1b660 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
1b670 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Mem){.  Vdbe *v 
1b680 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1b690 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
1b6a0 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
1b6b0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  e ){.    int i =
1b6c0 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
1b6d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
1b6e0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  =0 );.    if( ne
1b6f0 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a  gFlag ) i = -i;.
1b700 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b710 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1b720 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20  ger, i, iMem);. 
1b730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1b740 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65  c;.    i64 value
1b750 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1b760 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a   *z = pExpr->u.z
1b770 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  Token;.    asser
1b780 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63  t( z!=0 );.    c
1b790 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48   = sqlite3DecOrH
1b7a0 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75  exToI64(z, &valu
1b7b0 65 29 3b 0a 20 20 20 20 69 66 28 20 28 63 3d 3d  e);.    if( (c==
1b7c0 33 20 26 26 20 21 6e 65 67 46 6c 61 67 29 20 7c  3 && !negFlag) |
1b7d0 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e 65 67  | (c==2) || (neg
1b7e0 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d 3d 53  Flag && value==S
1b7f0 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b  MALLEST_INT64)){
1b800 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1b810 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1b820 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  NT.      sqlite3
1b830 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1b840 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65   "oversized inte
1b850 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  ger: %s%s", negF
1b860 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  lag ? "-" : "", 
1b870 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65  z);.#else.#ifnde
1b880 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45  f SQLITE_OMIT_HE
1b890 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20  X_INTEGER.      
1b8a0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
1b8b0 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d  icmp(z,"0x",2)==
1b8c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1b8d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b8e0 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61  rse, "hex litera
1b8f0 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25 73 22  l too big: %s%s"
1b900 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22  , negFlag?"-":""
1b910 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,z);.      }else
1b920 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
1b930 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
1b940 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20  (v, z, negFlag, 
1b950 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  iMem);.      }.#
1b960 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
1b970 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
1b980 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d  ag ){ value = c=
1b990 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e  =3 ? SMALLEST_IN
1b9a0 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a  T64 : -value; }.
1b9b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b9c0 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
1b9d0 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d  P_Int64, 0, iMem
1b9e0 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65  , 0, (u8*)&value
1b9f0 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
1ba00 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65   }.  }.}.../* Ge
1ba10 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1ba20 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20   will load into 
1ba30 72 65 67 69 73 74 65 72 20 72 65 67 4f 75 74 20  register regOut 
1ba40 61 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a  a value that is.
1ba50 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ** appropriate f
1ba60 6f 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74  or the iIdxCol-t
1ba70 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  h column of inde
1ba80 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20  x pIdx..*/.void 
1ba90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c  sqlite3ExprCodeL
1baa0 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a  oadIndexColumn(.
1bab0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1bac0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1bad0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
1bae0 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a  dex *pIdx,    /*
1baf0 20 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65   The index whose
1bb00 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65   column is to be
1bb10 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74   loaded */.  int
1bb20 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20   iTabCur,    /* 
1bb30 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1bb40 74 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a  to a table row *
1bb50 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c  /.  int iIdxCol,
1bb60 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d      /* The colum
1bb70 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  n of the index t
1bb80 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  o be loaded */. 
1bb90 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20   int regOut     
1bba0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e   /* Store the in
1bbb0 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  dex column value
1bbc0 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
1bbd0 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54  r */.){.  i16 iT
1bbe0 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69  abCol = pIdx->ai
1bbf0 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b  Column[iIdxCol];
1bc00 0a 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d  .  if( iTabCol==
1bc10 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61  XN_EXPR ){.    a
1bc20 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f  ssert( pIdx->aCo
1bc30 6c 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73  lExpr );.    ass
1bc40 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45  ert( pIdx->aColE
1bc50 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43  xpr->nExpr>iIdxC
1bc60 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ol );.    pParse
1bc70 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61  ->iSelfTab = iTa
1bc80 62 43 75 72 20 2b 20 31 3b 0a 20 20 20 20 73 71  bCur + 1;.    sq
1bc90 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
1bca0 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  y(pParse, pIdx->
1bcb0 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78  aColExpr->a[iIdx
1bcc0 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f  Col].pExpr, regO
1bcd0 75 74 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ut);.    pParse-
1bce0 3e 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20  >iSelfTab = 0;. 
1bcf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1bd00 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1bd10 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72  lumnOfTable(pPar
1bd20 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d  se->pVdbe, pIdx-
1bd30 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72  >pTable, iTabCur
1bd40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1bd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd60 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72        iTabCol, r
1bd70 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  egOut);.  }.}../
1bd80 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1bd90 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
1bda0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
1bdb0 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
1bdc0 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
1bdd0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1bde0 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1bdf0 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  e(.  Vdbe *v,   
1be00 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
1be10 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1be20 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ion */.  Table *
1be30 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20  pTab,    /* The 
1be40 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1be50 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20   the value */.  
1be60 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
1be70 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75 72  /* The table cur
1be80 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20  sor.  Or the PK 
1be90 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f  cursor for WITHO
1bea0 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e  UT ROWID */.  in
1beb0 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a  t iCol,       /*
1bec0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   Index of the co
1bed0 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20  lumn to extract 
1bee0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
1bef0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
1bf00 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  the value into t
1bf10 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1bf20 29 7b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ){.  if( pTab==0
1bf30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1bf40 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1bf50 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c  Column, iTabCur,
1bf60 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
1bf70 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1bf80 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
1bf90 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  iCol==pTab->iPKe
1bfa0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
1bfb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1bfc0 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c  _Rowid, iTabCur,
1bfd0 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73   regOut);.  }els
1bfe0 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
1bff0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
1c000 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
1c010 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e  P_Column;.    in
1c020 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  t x = iCol;.    
1c030 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
1c040 61 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61  ab) && !IsVirtua
1c050 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
1c060 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
1c070 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65  mnOfIndex(sqlite
1c080 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
1c090 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20  (pTab), iCol);. 
1c0a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1c0b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
1c0c0 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65  , iTabCur, x, re
1c0d0 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  gOut);.  }.  if(
1c0e0 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
1c0f0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
1c100 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43  ault(v, pTab, iC
1c110 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
1c120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1c130 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1c140 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43  l extract the iC
1c150 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
1c160 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54  from.** table pT
1c170 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ab and store the
1c180 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
1c190 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20   register iReg. 
1c1a0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
1c1b0 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
1c1c0 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
1c1d0 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
1c1e0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
1c1f0 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
1c200 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
1c210 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
1c220 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
1c230 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
1c240 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1c250 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
1c260 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
1c270 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
1c280 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
1c290 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1c2a0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1c2b0 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
1c2c0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
1c2d0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
1c2e0 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
1c2f0 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
1c300 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
1c310 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
1c320 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
1c330 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
1c340 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c  e */.  int iReg,
1c350 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
1c360 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
1c370 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
1c380 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20      /* P5 value 
1c390 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20  for OP_Column + 
1c3a0 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64  FLAGS */.){.  Vd
1c3b0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1c3c0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
1c3d0 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
1c3e0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1c3f0 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
1c400 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  ab, iTable, iCol
1c410 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66  umn, iReg);.  if
1c420 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( p5 ){.    sqli
1c430 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1c440 76 2c 20 70 35 29 3b 0a 20 20 7d 0a 20 20 72 65  v, p5);.  }.  re
1c450 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
1c460 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1c470 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e  e to move conten
1c480 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73  t from registers
1c490 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e   iFrom...iFrom+n
1c4a0 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f  Reg-1.** over to
1c4b0 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31   iTo..iTo+nReg-1
1c4c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c4d0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
1c4e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1c4f0 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
1c500 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73   int nReg){.  as
1c510 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f  sert( iFrom>=iTo
1c520 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e  +nReg || iFrom+n
1c530 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71  Reg<=iTo );.  sq
1c540 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1c550 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1c560 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
1c570 54 6f 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 2f 2a  To, nReg);.}../*
1c580 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 63  .** Convert a sc
1c590 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  alar expression 
1c5a0 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47  node to a TK_REG
1c5b0 49 53 54 45 52 20 72 65 66 65 72 65 6e 63 69 6e  ISTER referencin
1c5c0 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 52  g.** register iR
1c5d0 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  eg.  The caller 
1c5e0 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
1c5f0 20 69 52 65 67 20 61 6c 72 65 61 64 79 20 63 6f   iReg already co
1c600 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f  ntains.** the co
1c610 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
1c620 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
1c630 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1c640 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78  xprToRegister(Ex
1c650 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29  pr *p, int iReg)
1c660 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e  {.  p->op2 = p->
1c670 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  op;.  p->op = TK
1c680 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e  _REGISTER;.  p->
1c690 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20  iTable = iReg;. 
1c6a0 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
1c6b0 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a  ty(p, EP_Skip);.
1c6c0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74  }../*.** Evaluat
1c6d0 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1c6e0 28 65 69 74 68 65 72 20 61 20 76 65 63 74 6f 72  (either a vector
1c6f0 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65 78 70   or a scalar exp
1c700 72 65 73 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f  ression) and sto
1c710 72 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  re.** the result
1c720 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20   in continguous 
1c730 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1c740 65 72 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ers.  Return the
1c750 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
1c760 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
1c770 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
1c780 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
1c790 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
1c7a0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
1c7b0 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 73  is a temporary s
1c7c0 63 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f  calar, then also
1c7d0 20 77 72 69 74 65 0a 2a 2a 20 74 68 61 74 20 72   write.** that r
1c7e0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69  egister number i
1c7f0 6e 74 6f 20 2a 70 69 46 72 65 65 61 62 6c 65 2e  nto *piFreeable.
1c800 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65    If the returne
1c810 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  d result registe
1c820 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 74 65  r.** is not a te
1c830 6d 70 6f 72 61 72 79 20 6f 72 20 69 66 20 74 68  mporary or if th
1c840 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1c850 61 20 76 65 63 74 6f 72 20 73 65 74 20 2a 70 69  a vector set *pi
1c860 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30  Freeable.** to 0
1c870 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c880 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 50  exprCodeVector(P
1c890 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1c8a0 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72  pr *p, int *piFr
1c8b0 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  eeable){.  int i
1c8c0 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52  Result;.  int nR
1c8d0 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  esult = sqlite3E
1c8e0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 29  xprVectorSize(p)
1c8f0 3b 0a 20 20 69 66 28 20 6e 52 65 73 75 6c 74 3d  ;.  if( nResult=
1c900 3d 31 20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c  =1 ){.    iResul
1c910 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
1c920 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1c930 70 2c 20 70 69 46 72 65 65 61 62 6c 65 29 3b 0a  p, piFreeable);.
1c940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69    }else{.    *pi
1c950 46 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20  Freeable = 0;.  
1c960 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
1c970 53 45 4c 45 43 54 20 29 7b 0a 23 69 66 20 53 51  SELECT ){.#if SQ
1c980 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1c990 52 59 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74  RY.      iResult
1c9a0 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20   = 0;.#else.    
1c9b0 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69    iResult = sqli
1c9c0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
1c9d0 28 70 50 61 72 73 65 2c 20 70 2c 20 30 2c 20 30  (pParse, p, 0, 0
1c9e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  );.#endif.    }e
1c9f0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
1ca00 3b 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  ;.      iResult 
1ca10 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
1ca20 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1ca30 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b  nMem += nResult;
1ca40 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1ca50 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b  i<nResult; i++){
1ca60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ca70 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62  ExprCodeFactorab
1ca80 6c 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e  le(pParse, p->x.
1ca90 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1caa0 72 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20  r, i+iResult);. 
1cab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1cac0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73 75 6c  .  return iResul
1cad0 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t;.}.../*.** Gen
1cae0 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
1caf0 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
1cb00 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
1cb10 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
1cb20 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
1cb30 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
1cb40 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
1cb50 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
1cb60 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
1cb70 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
1cb80 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
1cb90 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
1cba0 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
1cbb0 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72  guarantee that r
1cbc0 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62  esults will.** b
1cbd0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67  e stored in targ
1cbe0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  et.  The result 
1cbf0 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20  might be stored 
1cc00 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  in some other.**
1cc10 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20   register if it 
1cc20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
1cc30 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c   do so.  The cal
1cc40 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
1cc50 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
1cc60 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
1cc70 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  move the results
1cc80 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a   to the desired.
1cc90 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ** register..*/.
1cca0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1ccb0 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20  odeTarget(Parse 
1ccc0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1ccd0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1cce0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1ccf0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f  Parse->pVdbe;  /
1cd00 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63  * The VM under c
1cd10 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1cd20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
1cd30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1cd40 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
1cd50 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  oded */.  int in
1cd60 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20  Reg = target;   
1cd70 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73      /* Results s
1cd80 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
1cd90 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74  r inReg */.  int
1cda0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20   regFree1 = 0;  
1cdb0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
1cdc0 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
1cdd0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1cde0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  er */.  int regF
1cdf0 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ree2 = 0;       
1ce00 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
1ce10 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
1ce20 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
1ce30 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20 20  .  int r1, r2;  
1ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ce50 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72  Various register
1ce60 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78   numbers */.  Ex
1ce70 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20  pr tempX;       
1ce80 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
1ce90 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  rary expression 
1cea0 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35  node */.  int p5
1ceb0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1cec0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
1ced0 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
1cee0 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
1cef0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1cf00 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1cf10 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
1cf20 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 65 78  eturn 0;.  }..ex
1cf30 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3a 0a  pr_code_doover:.
1cf40 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1cf50 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
1cf60 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
1cf70 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
1cf80 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
1cf90 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1cfa0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
1cfb0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
1cfc0 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
1cfd0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1cfe0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1cff0 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
1d000 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
1d010 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
1d020 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
1d030 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
1d040 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
1d050 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
1d060 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d      return pCol-
1d070 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  >iMem;.      }el
1d080 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
1d090 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
1d0a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d0b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1d0c0 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
1d0d0 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54  fo->sortingIdxPT
1d0e0 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d100 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1d110 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
1d120 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1d130 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
1d140 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
1d150 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
1d160 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
1d170 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
1d180 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
1d190 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  : {.      int iT
1d1a0 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  ab = pExpr->iTab
1d1b0 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  le;.      if( Ex
1d1c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1d1d0 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  xpr, EP_FixedCol
1d1e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1d1f0 54 68 69 73 20 43 4f 4c 55 4d 4e 20 65 78 70 72  This COLUMN expr
1d200 65 73 73 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79  ession is really
1d210 20 61 20 63 6f 6e 73 74 61 6e 74 20 64 75 65 20   a constant due 
1d220 74 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  to WHERE clause.
1d230 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
1d240 72 61 69 6e 74 73 2c 20 61 6e 64 20 74 68 61 74  raints, and that
1d250 20 63 6f 6e 73 74 61 6e 74 20 69 73 20 63 6f 64   constant is cod
1d260 65 64 20 62 79 20 74 68 65 20 70 45 78 70 72 2d  ed by the pExpr-
1d270 3e 70 4c 65 66 74 0a 20 20 20 20 20 20 20 20 2a  >pLeft.        *
1d280 2a 20 65 78 70 72 65 73 73 73 69 6f 6e 2e 20 20  * expresssion.  
1d290 48 6f 77 65 76 65 72 2c 20 6d 61 6b 65 20 73 75  However, make su
1d2a0 72 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  re the constant 
1d2b0 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 0a  has the correct.
1d2c0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 74          ** datat
1d2d0 79 70 65 20 62 79 20 61 70 70 6c 79 69 6e 67 20  ype by applying 
1d2e0 74 68 65 20 41 66 66 69 6e 69 74 79 20 6f 66 20  the Affinity of 
1d2f0 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
1d300 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
1d310 2a 2a 20 63 6f 6e 73 74 61 6e 74 2e 0a 20 20 20  ** constant..   
1d320 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d330 69 6e 74 20 69 52 65 67 20 3d 20 73 71 6c 69 74  int iReg = sqlit
1d340 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1d350 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1d360 70 4c 65 66 74 2c 74 61 72 67 65 74 29 3b 0a 20  pLeft,target);. 
1d370 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 20 3d         int aff =
1d380 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
1d390 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  umnAffinity(pExp
1d3a0 72 2d 3e 70 54 61 62 2c 20 70 45 78 70 72 2d 3e  r->pTab, pExpr->
1d3b0 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1d3c0 20 20 69 66 28 20 61 66 66 21 3d 53 51 4c 49 54    if( aff!=SQLIT
1d3d0 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20 20  E_AFF_BLOB ){.  
1d3e0 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
1d3f0 6f 6e 73 74 20 63 68 61 72 20 7a 41 66 66 5b 5d  onst char zAff[]
1d400 20 3d 20 22 42 5c 30 30 30 43 5c 30 30 30 44 5c   = "B\000C\000D\
1d410 30 30 30 45 22 3b 0a 20 20 20 20 20 20 20 20 20  000E";.         
1d420 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
1d430 41 46 46 5f 42 4c 4f 42 3d 3d 27 41 27 20 29 3b  AFF_BLOB=='A' );
1d440 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1d450 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  t( SQLITE_AFF_TE
1d460 58 54 3d 3d 27 42 27 20 29 3b 0a 20 20 20 20 20  XT=='B' );.     
1d470 20 20 20 20 20 69 66 28 20 69 52 65 67 21 3d 74       if( iReg!=t
1d480 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20  arget ){.       
1d490 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d4a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
1d4b0 70 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74  py, iReg, target
1d4c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1d4d0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
1d4e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d4f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d500 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
1d510 6e 69 74 79 2c 20 69 52 65 67 2c 20 31 2c 20 30  nity, iReg, 1, 0
1d520 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
1d540 41 66 66 5b 28 61 66 66 2d 27 42 27 29 2a 32 5d  Aff[(aff-'B')*2]
1d550 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
1d560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d570 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 20 20 20  return iReg;.   
1d580 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
1d590 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Tab<0 ){.       
1d5a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 53 65   if( pParse->iSe
1d5b0 6c 66 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20  lfTab<0 ){.     
1d5c0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69       /* Generati
1d5d0 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ng CHECK constra
1d5e0 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e  ints or insertin
1d5f0 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69  g into partial i
1d600 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
1d610 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
1d620 69 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72 73 65  iColumn - pParse
1d630 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20  ->iSelfTab;.    
1d640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d650 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61       /* Coding a
1d660 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
1d670 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
1d680 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75  index where colu
1d690 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20  mn names.       
1d6a0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64     ** in the ind
1d6b0 65 78 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ex refer to the 
1d6c0 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74  table to which t
1d6d0 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73  he index belongs
1d6e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54   */.          iT
1d6f0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  ab = pParse->iSe
1d700 6c 66 54 61 62 20 2d 20 31 3b 0a 20 20 20 20 20  lfTab - 1;.     
1d710 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d720 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1d730 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1d740 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mn(pParse, pExpr
1d750 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d770 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
1d780 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72  olumn, iTab, tar
1d790 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7b0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b      pExpr->op2);
1d7c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1d7d0 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
1d7e0 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
1d7f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
1d800 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1d810 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1d820 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1d830 4b 5f 54 52 55 45 46 41 4c 53 45 3a 20 7b 0a 20  K_TRUEFALSE: {. 
1d840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d850 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1d860 65 67 65 72 2c 20 73 71 6c 69 74 65 33 45 78 70  eger, sqlite3Exp
1d870 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
1d880 72 29 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r), target);.   
1d890 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1d8a0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1d8b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1d8c0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63  TING_POINT.    c
1d8d0 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
1d8e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1d8f0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d900 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1d910 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  e) );.      code
1d920 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75  Real(v, pExpr->u
1d930 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67  .zToken, 0, targ
1d940 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1d950 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1d960 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1d970 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
1d980 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1d990 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1d9a0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1d9b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d9c0 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
1d9d0 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70 72 2d  , target, pExpr-
1d9e0 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1d9f0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1da00 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1da10 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
1da20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1da30 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1da40 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1da50 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1da60 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1da70 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
1da80 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
1da90 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
1daa0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
1dab0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
1dac0 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a     char *zBlob;.
1dad0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1dae0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1daf0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1db00 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
1db10 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1db20 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  ken[0]=='x' || p
1db30 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1db40 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
1db50 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1db60 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27  .zToken[1]=='\''
1db70 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70   );.      z = &p
1db80 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32  Expr->u.zToken[2
1db90 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ];.      n = sql
1dba0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
1dbb0 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
1dbc0 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b  t( z[n]=='\'' );
1dbd0 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73  .      zBlob = s
1dbe0 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
1dbf0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
1dc00 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
1dc10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1dc20 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32  (v, OP_Blob, n/2
1dc30 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c  , target, 0, zBl
1dc40 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ob, P4_DYNAMIC);
1dc50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1dc60 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
1dc70 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
1dc80 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
1dc90 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1dca0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1dcb0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1dcc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1dcd0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  Expr->u.zToken!=
1dce0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1dcf0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1dd00 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  en[0]!=0 );.    
1dd10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dd20 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62  Op2(v, OP_Variab
1dd30 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
1dd40 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
1dd50 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e     if( pExpr->u.
1dd60 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a  zToken[1]!=0 ){.
1dd70 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1dd80 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 56  ar *z = sqlite3V
1dd90 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50  ListNumToName(pP
1dda0 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 70 45  arse->pVList, pE
1ddb0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1ddc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1ddd0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1dde0 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63 6d 70  ]=='?' || strcmp
1ddf0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1de00 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  , z)==0 );.     
1de10 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73     pParse->pVLis
1de20 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e 64  t[0] = 0; /* Ind
1de30 69 63 61 74 65 20 56 4c 69 73 74 20 6d 61 79 20  icate VList may 
1de40 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65 6e 6c  no longer be enl
1de50 61 72 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  arged */.       
1de60 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
1de70 6e 64 50 34 28 76 2c 20 28 63 68 61 72 2a 29 7a  ndP4(v, (char*)z
1de80 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
1de90 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1dea0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1deb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
1dec0 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ISTER: {.      r
1ded0 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54 61  eturn pExpr->iTa
1dee0 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  ble;.    }.#ifnd
1def0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1df00 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
1df10 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
1df20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
1df30 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
1df40 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
1df50 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20   */.      inReg 
1df60 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1df70 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1df80 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
1df90 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1dfa0 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29   inReg!=target )
1dfb0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1dfc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1dfd0 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
1dfe0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1dff0 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
1e000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1e010 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e020 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72  (v, OP_Cast, tar
1e030 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1e050 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
1e060 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1e070 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 72 65 74  , 0));.      ret
1e080 75 72 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d  urn inReg;.    }
1e090 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1e0a0 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
1e0b0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
1e0c0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
1e0d0 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  :.      op = (op
1e0e0 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
1e0f0 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
1e100 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  p5 = SQLITE_NULL
1e110 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c  EQ;.      /* fal
1e120 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l-through */.   
1e130 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1e140 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1e150 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1e160 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1e170 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1e180 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1e190 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1e1a0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
1e1b0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1e1c0 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
1e1d0 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
1e1e0 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61   codeVectorCompa
1e1f0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1e200 2c 20 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35  , target, op, p5
1e210 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1e220 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1e230 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e240 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1e250 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1e260 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1e270 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e280 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1e290 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1e2a0 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70          codeComp
1e2b0 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
1e2c0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1e2d0 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1e2e0 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
1e2f0 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
1e300 7c 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61  | p5);.        a
1e310 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
1e320 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
1e330 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
1e340 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e350 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Lt);.        a
1e360 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
1e370 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
1e380 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
1e390 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e3a0 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Le);.        a
1e3b0 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
1e3c0 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
1e3d0 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
1e3e0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e3f0 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Gt);.        a
1e400 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
1e410 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
1e420 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
1e430 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e440 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Ge);.        a
1e450 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
1e460 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
1e470 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f  ==OP_Eq); VdbeCo
1e480 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e490 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Eq);.        a
1e4a0 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
1e4b0 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
1e4c0 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
1e4d0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e4e0 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74  P_Ne);.        t
1e4f0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1e500 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
1e510 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1e520 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
1e530 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e540 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e550 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
1e560 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
1e570 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
1e580 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
1e590 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
1e5a0 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
1e5b0 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
1e5c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1e5d0 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
1e5e0 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
1e5f0 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
1e600 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a  ase TK_RSHIFT: .
1e610 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
1e620 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
1e630 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41  rt( TK_AND==OP_A
1e640 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  nd );           
1e650 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1e660 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  K_AND );.      a
1e670 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
1e680 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20  _Or );          
1e690 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e6a0 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20  ==TK_OR );.     
1e6b0 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
1e6c0 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20  ==OP_Add );     
1e6d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e6e0 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20  op==TK_PLUS );. 
1e6f0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e700 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
1e710 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61  ct );     testca
1e720 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53  se( op==TK_MINUS
1e730 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e740 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
1e750 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74  ainder );      t
1e760 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1e770 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  REM );.      ass
1e780 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
1e790 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20  OP_BitAnd );    
1e7a0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e7b0 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20  TK_BITAND );.   
1e7c0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1e7d0 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
1e7e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e7f0 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
1e800 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e810 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76  TK_SLASH==OP_Div
1e820 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73  ide );       tes
1e830 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c  tcase( op==TK_SL
1e840 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ASH );.      ass
1e850 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d  ert( TK_LSHIFT==
1e860 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20  OP_ShiftLeft ); 
1e870 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e880 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_LSHIFT );.   
1e890 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
1e8a0 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
1e8b0 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65  ght );  testcase
1e8c0 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20  ( op==TK_RSHIFT 
1e8d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e8e0 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
1e8f0 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65  oncat );      te
1e900 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43  stcase( op==TK_C
1e910 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72  ONCAT );.      r
1e920 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1e930 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e940 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1e950 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1e960 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1e970 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e980 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1e990 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1e9a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e9b0 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72  Op3(v, op, r2, r
1e9c0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1e9d0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1e9e0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1e9f0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ea00 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1ea10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ea20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
1ea30 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1ea40 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
1ea50 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eft;.      asser
1ea60 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  t( pLeft );.    
1ea70 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
1ea80 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
1ea90 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
1eaa0 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  er(pParse, pLeft
1eab0 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
1eac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1ead0 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  get;.#ifndef SQL
1eae0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1eaf0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65  G_POINT.      }e
1eb00 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  lse if( pLeft->o
1eb10 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
1eb20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1eb30 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1eb40 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1eb50 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ue) );.        c
1eb60 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74  odeReal(v, pLeft
1eb70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74  ->u.zToken, 1, t
1eb80 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1eb90 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23  return target;.#
1eba0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
1ebb0 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  e{.        tempX
1ebc0 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52  .op = TK_INTEGER
1ebd0 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
1ebe0 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61  flags = EP_IntVa
1ebf0 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  lue|EP_TokenOnly
1ec00 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
1ec10 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  u.iValue = 0;.  
1ec20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1ec30 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1ec40 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
1ec50 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1ec60 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1ec70 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ec80 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ec90 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1eca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ecb0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
1ecc0 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20  btract, r2, r1, 
1ecd0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1ece0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ecf0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1ed00 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1ed10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ed20 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
1ed30 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1ed40 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1ed50 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
1ed60 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1ed70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20  ==TK_BITNOT );. 
1ed80 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ed90 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20  NOT==OP_Not );  
1eda0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1edb0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20   op==TK_NOT );. 
1edc0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1edd0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1ede0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1edf0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1ee00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ee10 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1ee20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ee30 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
1ee40 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
1ee50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ee60 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
1ee70 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72  {.      int isTr
1ee80 75 65 3b 20 20 20 20 2f 2a 20 49 53 20 54 52 55  ue;    /* IS TRU
1ee90 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45  E or IS NOT TRUE
1eea0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 4e   */.      int bN
1eeb0 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54  ormal;   /* IS T
1eec0 52 55 45 20 6f 72 20 49 53 20 46 41 4c 53 45 20  RUE or IS FALSE 
1eed0 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  */.      r1 = sq
1eee0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1eef0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1ef00 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1ef10 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
1ef20 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1ef30 29 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20  );.      isTrue 
1ef40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  = sqlite3ExprTru
1ef50 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70  thValue(pExpr->p
1ef60 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 62 4e  Right);.      bN
1ef70 6f 72 6d 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f  ormal = pExpr->o
1ef80 70 32 3d 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20  p2==TK_IS;.     
1ef90 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75   testcase( isTru
1efa0 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20  e && bNormal);. 
1efb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21       testcase( !
1efc0 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61  isTrue && bNorma
1efd0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1efe0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1eff0 2c 20 4f 50 5f 49 73 54 72 75 65 2c 20 72 31 2c  , OP_IsTrue, r1,
1f000 20 69 6e 52 65 67 2c 20 21 69 73 54 72 75 65 2c   inReg, !isTrue,
1f010 20 69 73 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61   isTrue ^ bNorma
1f020 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1f030 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f040 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
1f050 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
1f060 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
1f070 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f080 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
1f090 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
1f0a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
1f0b0 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
1f0c0 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
1f0d0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
1f0e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1f0f0 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  TNULL );.      s
1f100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f110 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1f120 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1f130 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1f140 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f150 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f160 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1f170 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f180 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f190 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
1f1a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70  VdbeAddOp1(v, op
1f1b0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
1f1c0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1f1d0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
1f1e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1f1f0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
1f200 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  TNULL);.      sq
1f210 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f220 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1f230 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f240 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1f250 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
1f260 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f270 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
1f280 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
1f290 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
1f2a0 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
1f2b0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
1f2c0 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
1f2d0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1f2e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1f2f0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1f300 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1f310 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1f320 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
1f330 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c  ggregate: %s()",
1f340 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1f350 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1f360 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1f370 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
1f380 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
1f390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1f3a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f3b0 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
1f3c0 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
1f3d0 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
1f3e0 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
1f3f0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1f400 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b        int nFarg;
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f420 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69  Number of functi
1f430 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1f440 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
1f450 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Def;         /* 
1f460 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  The function def
1f470 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  inition object *
1f480 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
1f490 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f  ar *zId;       /
1f4a0 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
1f4b0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  ame */.      u32
1f4c0 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20   constMask = 0; 
1f4d0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66      /* Mask of f
1f4e0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1f4f0 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74  s that are const
1f500 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ant */.      int
1f510 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1f520 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1f530 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ter */.      sql
1f540 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1f550 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
1f560 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1f570 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65  on */.      u8 e
1f580 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20  nc = ENC(db);   
1f590 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
1f5a0 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20  ncoding used by 
1f5b0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
1f5c0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
1f5d0 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a  pColl = 0;    /*
1f5e0 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   A collating seq
1f5f0 75 65 6e 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65  uence */..#ifnde
1f600 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
1f610 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69  NDOWFUNC.      i
1f620 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
1f630 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
1f640 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1f650 65 64 29 20 26 26 20 70 45 78 70 72 2d 3e 70 57  ed) && pExpr->pW
1f660 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  in ){.        re
1f670 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 57 69 6e  turn pExpr->pWin
1f680 2d 3e 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20  ->regResult;.   
1f690 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1f6a0 20 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74     if( ConstFact
1f6b0 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 26 26 20  orOk(pParse) && 
1f6c0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
1f6d0 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78  stantNotJoin(pEx
1f6e0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
1f6f0 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  * SQL functions 
1f700 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65  can be expensive
1f710 2e 20 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65  . So try to move
1f720 20 63 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74 69   constant functi
1f730 6f 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ons.        ** o
1f740 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  ut of the inner 
1f750 6c 6f 6f 70 2c 20 65 76 65 6e 20 69 66 20 74 68  loop, even if th
1f760 61 74 20 6d 65 61 6e 73 20 61 6e 20 65 78 74 72  at means an extr
1f770 61 20 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20  a OP_Copy. */.  
1f780 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1f790 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
1f7a0 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
1f7b0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , -1);.      }. 
1f7c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1f7d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1f7e0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1f7f0 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
1f800 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1f810 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
1f820 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
1f830 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20  pFarg = 0;.     
1f840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f850 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78  pFarg = pExpr->x
1f860 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  .pList;.      }.
1f870 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46        nFarg = pF
1f880 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78  arg ? pFarg->nEx
1f890 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73  pr : 0;.      as
1f8a0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1f8b0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1f8c0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1f8d0 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d      zId = pExpr-
1f8e0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1f8f0 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
1f900 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
1f910 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  zId, nFarg, enc,
1f920 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
1f930 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57  TE_ENABLE_UNKNOW
1f940 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20  N_SQL_FUNCTION. 
1f950 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
1f960 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c   && pParse->expl
1f970 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ain ){.        p
1f980 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
1f990 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75  dFunction(db, "u
1f9a0 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20  nknown", nFarg, 
1f9b0 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  enc, 0);.      }
1f9c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
1f9d0 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65  ( pDef==0 || pDe
1f9e0 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20  f->xFinalize!=0 
1f9f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1fa00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1fa10 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63  e, "unknown func
1fa20 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64  tion: %s()", zId
1fa30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1fa40 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1fa50 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69   /* Attempt a di
1fa60 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rect implementat
1fa70 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74  ion of the built
1fa80 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61  -in COALESCE() a
1fa90 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55  nd.      ** IFNU
1faa0 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  LL() functions. 
1fab0 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e   This avoids unn
1fac0 65 63 65 73 73 61 72 79 20 65 76 61 6c 75 61 74  ecessary evaluat
1fad0 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ion of.      ** 
1fae0 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74  arguments past t
1faf0 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c  he first non-NUL
1fb00 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  L argument..    
1fb10 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1fb20 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
1fb30 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41   SQLITE_FUNC_COA
1fb40 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20  LESCE ){.       
1fb50 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65   int endCoalesce
1fb60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1fb70 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1fb80 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
1fb90 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  g>=2 );.        
1fba0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1fbb0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1fbc0 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
1fbd0 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  t);.        for(
1fbe0 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=1; i<nFarg; i+
1fbf0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
1fc00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1fc10 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74  v, OP_NotNull, t
1fc20 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73  arget, endCoales
1fc30 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  ce);.          V
1fc40 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1fc50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1fc60 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1fc70 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
1fc80 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1fc90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fca0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1fcb0 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f  veLabel(v, endCo
1fcc0 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20  alesce);.       
1fcd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1fce0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e  .      /* The UN
1fcf0 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f  LIKELY() functio
1fd00 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54  n is a no-op.  T
1fd10 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65  he result is the
1fd20 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20   value.      ** 
1fd30 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  of the first arg
1fd40 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ument..      */.
1fd50 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
1fd60 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1fd70 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59  TE_FUNC_UNLIKELY
1fd80 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1fd90 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a  rt( nFarg>=1 );.
1fda0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
1fdb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1fdc0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 46 61  rget(pParse, pFa
1fdd0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
1fde0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
1fdf0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1fe00 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 54  DEBUG.      /* T
1fe10 68 65 20 41 46 46 49 4e 49 54 59 28 29 20 66 75  he AFFINITY() fu
1fe20 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  nction evaluates
1fe30 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61   to a string tha
1fe40 74 20 64 65 73 63 72 69 62 65 73 0a 20 20 20 20  t describes.    
1fe50 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20 61 66    ** the type af
1fe60 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 61 72  finity of the ar
1fe70 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 73  gument.  This is
1fe80 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
1fe90 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  g of.      ** th
1fea0 65 20 53 51 4c 69 74 65 20 74 79 70 65 20 6c 6f  e SQLite type lo
1feb0 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  gic..      */.  
1fec0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
1fed0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
1fee0 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 20 29  _FUNC_AFFINITY )
1fef0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1ff00 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20  char *azAff[] = 
1ff10 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78 74 22  { "blob", "text"
1ff20 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e  , "numeric", "in
1ff30 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22 20 7d  teger", "real" }
1ff40 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61  ;.        char a
1ff50 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ff;.        asse
1ff60 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a  rt( nFarg==1 );.
1ff70 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71          aff = sq
1ff80 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1ff90 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  y(pFarg->a[0].pE
1ffa0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
1ffb0 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
1ffc0 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 0a  ing(v, target, .
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
1fff0 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53 51  f ? azAff[aff-SQ
20000 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a  LITE_AFF_BLOB] :
20010 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20   "none");.      
20020 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
20030 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
20040 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
20050 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
20060 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20         if( i<32 
20070 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
20080 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e  Constant(pFarg->
20090 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
200a0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
200b0 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20  e( i==31 );.    
200c0 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
200d0 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b  |= MASKBIT32(i);
200e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
200f0 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75     if( (pDef->fu
20100 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
20110 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21  _FUNC_NEEDCOLL)!
20120 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  =0 && !pColl ){.
20130 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
20140 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
20150 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46 61  lSeq(pParse, pFa
20160 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  rg->a[i].pExpr);
20170 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20180 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61   }.      if( pFa
20190 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rg ){.        if
201a0 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20  ( constMask ){. 
201b0 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70 50           r1 = pP
201c0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
201d0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
201e0 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20  nMem += nFarg;. 
201f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20200 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
20210 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
20220 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b  (pParse, nFarg);
20230 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
20240 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74      /* For lengt
20250 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29  h() and typeof()
20260 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20   functions with 
20270 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e  a column argumen
20280 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  t,.        ** se
20290 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74  t the P5 paramet
202a0 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c  er to the OP_Col
202b0 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50  umn opcode to OP
202c0 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20  FLAG_LENGTHARG. 
202d0 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46         ** or OPF
202e0 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65  LAG_TYPEOFARG re
202f0 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61  spectively, to a
20300 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
20310 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a   data.        **
20320 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   loading..      
20330 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
20340 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
20350 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43  s & (SQLITE_FUNC
20360 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46  _LENGTH|SQLITE_F
20370 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20  UNC_TYPEOF))!=0 
20380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
20390 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20  exprOp;.        
203a0 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d    assert( nFarg=
203b0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =1 );.          
203c0 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61  assert( pFarg->a
203d0 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a  [0].pExpr!=0 );.
203e0 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70            exprOp
203f0 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70   = pFarg->a[0].p
20400 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  Expr->op;.      
20410 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d      if( exprOp==
20420 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70  TK_COLUMN || exp
20430 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  rOp==TK_AGG_COLU
20440 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
20450 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
20460 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50  _FUNC_LENGTH==OP
20470 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
20480 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
20490 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
204a0 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47  C_TYPEOF==OPFLAG
204b0 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20  _TYPEOFARG );.  
204c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
204d0 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  se( pDef->funcFl
204e0 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e  ags & OPFLAG_LEN
204f0 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
20500 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30        pFarg->a[0
20510 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a  ].pExpr->op2 = .
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20530 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67    pDef->funcFlag
20540 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47  s & (OPFLAG_LENG
20550 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50  THARG|OPFLAG_TYP
20560 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20  EOFARG);.       
20570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
20580 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20590 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
205a0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72  pParse, pFarg, r
205b0 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
205e0 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45  L_DUP|SQLITE_ECE
205f0 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20  L_FACTOR);.     
20600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20610 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  r1 = 0;.      }.
20620 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20630 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
20640 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62  .      /* Possib
20650 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20  ly overload the 
20660 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20  function if the 
20670 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
20680 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72  s.      ** a vir
20690 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d  tual table colum
206a0 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
206b0 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66    ** For infix f
206c0 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20  unctions (LIKE, 
206d0 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e  GLOB, REGEXP, an
206e0 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65  d MATCH) use the
206f0 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64  .      ** second
20700 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74   argument, not t
20710 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65  he first, as the
20720 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73   argument to tes
20730 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  t to.      ** se
20740 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c  e if it is a col
20750 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c  umn in a virtual
20760 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
20770 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20   done because.  
20780 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20      ** the left 
20790 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78  operand of infix
207a0 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20   functions (the 
207b0 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20  operand we want 
207c0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  to.      ** cont
207d0 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29  rol overloading)
207e0 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20   ends up as the 
207f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
20800 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
20810 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65  function.  The e
20820 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f  xpression "A glo
20830 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65  b B" is equivale
20840 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  nt to .      ** 
20850 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20  "glob(B,A).  We 
20860 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20  want to use the 
20870 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  A in "A glob B" 
20880 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a  to test.      **
20890 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76   for function ov
208a0 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20  erloading.  But 
208b0 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72  we use the B ter
208c0 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22  m in "glob(B,A)"
208d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
208e0 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26   if( nFarg>=2 &&
208f0 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
20900 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29   EP_InfixFunc) )
20910 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
20920 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
20930 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
20940 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
20950 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  arg->a[1].pExpr)
20960 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
20970 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20  ( nFarg>0 ){.   
20980 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
20990 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
209a0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
209b0 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
209c0 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
209d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
209e0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
209f0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
20a00 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
20a10 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
20a20 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
20a30 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
20a40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20a50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
20a60 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
20a70 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
20a80 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
20a90 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
20aa0 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53  _ENABLE_OFFSET_S
20ab0 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20 69 66  QL_FUNC.      if
20ac0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
20ad0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
20ae0 4f 46 46 53 45 54 20 29 7b 0a 20 20 20 20 20 20  OFFSET ){.      
20af0 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d 20 70    Expr *pArg = p
20b00 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
20b10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
20b20 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  rg->op==TK_COLUM
20b30 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  N ){.          s
20b40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
20b50 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c 20 70  (v, OP_Offset, p
20b60 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70 41 72  Arg->iTable, pAr
20b70 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  g->iColumn, targ
20b80 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  et);.        }el
20b90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
20ba0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20bb0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
20bc0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
20bd0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  }.      }else.#e
20be0 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
20bf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20c00 41 64 64 4f 70 34 28 76 2c 20 70 50 61 72 73 65  AddOp4(v, pParse
20c10 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f 50 5f  ->iSelfTab ? OP_
20c20 50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50 5f 46  PureFunc0 : OP_F
20c30 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20 20 20  unction0,.      
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c50 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72      constMask, r
20c60 31 2c 20 74 61 72 67 65 74 2c 20 28 63 68 61 72  1, target, (char
20c70 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44  *)pDef, P4_FUNCD
20c80 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  EF);.        sql
20c90 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
20ca0 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a  (v, (u8)nFarg);.
20cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20cc0 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74  ( nFarg && const
20cd0 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Mask==0 ){.     
20ce0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
20cf0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
20d00 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20  e, r1, nFarg);. 
20d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
20d20 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
20d30 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
20d40 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
20d50 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
20d60 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
20d70 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  ELECT: {.      i
20d80 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74  nt nCol;.      t
20d90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
20da0 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
20db0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
20dc0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
20dd0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45   if( op==TK_SELE
20de0 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45  CT && (nCol = pE
20df0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
20e00 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d  pEList->nExpr)!=
20e10 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
20e20 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
20e30 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c  or(pParse, nCol,
20e40 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
20e50 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
20e60 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
20e70 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
20e80 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  xpr, 0, 0);.    
20e90 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
20ea0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20eb0 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
20ec0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
20ed0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
20ee0 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d  ->pLeft->iTable=
20ef0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  =0 ){.        pE
20f00 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62  xpr->pLeft->iTab
20f10 6c 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  le = sqlite3Code
20f20 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
20f30 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
20f40 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
20f50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
20f60 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c  pr->iTable==0 ||
20f70 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f   pExpr->pLeft->o
20f80 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
20f90 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
20fa0 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 26  >iTable.       &
20fb0 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  & pExpr->iTable!
20fc0 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  =(n = sqlite3Exp
20fd0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
20fe0 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20 20 20 20  r->pLeft)) .    
20ff0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
21000 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
21010 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73  rse, "%d columns
21020 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c   assigned %d val
21030 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ues",.          
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21050 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
21060 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ble, n);.      }
21070 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45  .      return pE
21080 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62  xpr->pLeft->iTab
21090 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c  le + pExpr->iCol
210a0 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  umn;.    }.    c
210b0 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
210c0 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
210d0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
210e0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
210f0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
21100 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
21110 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
21120 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21130 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
21140 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
21150 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21160 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
21170 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
21180 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
21190 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
211a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
211b0 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
211c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
211d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
211e0 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
211f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21200 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
21210 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30  ddImm, target, 0
21220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21230 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
21240 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
21250 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
21260 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
21270 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
21280 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
21290 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
212a0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
212b0 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
212c0 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
212d0 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
212e0 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
212f0 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
21300 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
21310 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
21320 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
21330 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
21340 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
21350 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
21360 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
21370 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
21380 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
21390 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
213a0 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
213b0 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
213c0 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30  pr, target, 0, 0
213d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
213e0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
213f0 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a    case TK_SPAN:.
21400 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
21410 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
21420 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
21430 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e   pExpr = pExpr->
21440 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 67 6f 74  pLeft;.      got
21450 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76  o expr_code_doov
21460 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30 34 2d 32  er; /* 2018-04-2
21470 38 3a 20 50 72 65 76 65 6e 74 20 64 65 65 70 20  8: Prevent deep 
21480 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53 53 46 75  recursion. OSSFu
21490 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  zz. */.    }..  
214a0 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
214b0 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
214c0 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
214d0 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
214e0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
214f0 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
21500 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
21510 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
21520 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
21530 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
21540 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
21550 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
21560 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
21570 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
21580 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
21590 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
215a0 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
215b0 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
215c0 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
215d0 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
215e0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
215f0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
21600 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
21610 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
21620 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
21630 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
21640 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
21650 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
21660 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
21670 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f  ng an OP_Param o
21680 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20  pcode. The p1.  
21690 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
216a0 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72   is set to 0 for
216b0 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65   an old.rowid re
216c0 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28  ference, or to (
216d0 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  i+1).      ** to
216e0 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68   reference anoth
216f0 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  er column of the
21700 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
21710 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ble, where .    
21720 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
21730 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
21740 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77  n. For a new.row
21750 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31  id reference, p1
21760 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74   is.      ** set
21770 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65   to (n+1), where
21780 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   n is the number
21790 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65   of columns in e
217a0 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  ach pseudo-table
217b0 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  ..      ** For a
217c0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
217d0 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69  y other column i
217e0 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75  n the new.* pseu
217f0 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20  do-table, p1.   
21800 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
21810 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e  (n+2+i), where n
21820 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65   and i are as de
21830 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79  fined previously
21840 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65  . For.      ** e
21850 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
21860 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72  able on which tr
21870 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67  iggers are being
21880 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20   fired is.      
21890 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a  ** declared as:.
218a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
218b0 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
218c0 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
218d0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
218e0 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65  n p1 is interpre
218f0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
21900 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21910 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20  *   p1==0   ->  
21920 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20    old.rowid     
21930 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65  p1==3   ->    ne
21940 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  w.rowid.      **
21950 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20     p1==1   ->   
21960 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70   old.a         p
21970 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==4   ->    new
21980 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  .a.      **   p1
21990 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==2   ->    old.
219a0 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20  b         p1==5 
219b0 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20    ->    new.b   
219c0 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20      .      */.  
219d0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
219e0 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
219f0 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45       int p1 = pE
21a00 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70  xpr->iTable * (p
21a10 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31  Tab->nCol+1) + 1
21a20 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   + pExpr->iColum
21a30 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  n;..      assert
21a40 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
21a50 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  =0 || pExpr->iTa
21a60 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
21a70 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
21a80 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45  Column>=-1 && pE
21a90 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61  xpr->iColumn<pTa
21aa0 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
21ab0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69   assert( pTab->i
21ac0 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d  PKey<0 || pExpr-
21ad0 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e  >iColumn!=pTab->
21ae0 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61  iPKey );.      a
21af0 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
21b00 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32  p1<(pTab->nCol*2
21b10 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71  +2) );..      sq
21b20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21b30 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c  v, OP_Param, p1,
21b40 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21b50 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
21b60 22 72 5b 25 64 5d 3d 25 73 2e 25 73 22 2c 20 74  "r[%d]=%s.%s", t
21b70 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 28  arget,.        (
21b80 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20  pExpr->iTable ? 
21b90 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a  "new" : "old"),.
21ba0 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
21bb0 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77  iColumn<0 ? "row
21bc0 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61  id" : pExpr->pTa
21bd0 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
21be0 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 0a 20  Column].zName). 
21bf0 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65       ));..#ifnde
21c00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
21c10 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
21c20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
21c30 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66  umn has REAL aff
21c40 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75  inity, it may cu
21c50 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
21c60 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a  d as an.      **
21c70 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50   integer. Use OP
21c80 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f  _RealAffinity to
21c90 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
21ca0 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20   really real..  
21cb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21cc0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
21cd0 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74  0985-57662 SQLit
21ce0 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74  e will convert t
21cf0 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f  he value back to
21d00 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69  .      ** floati
21d10 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78  ng point when ex
21d20 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d  tracting it from
21d30 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f   the record.  */
21d40 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
21d50 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20  ->iColumn>=0 .  
21d60 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43       && pTab->aC
21d70 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
21d80 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  n].affinity==SQL
21d90 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20  ITE_AFF_REAL.   
21da0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
21db0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
21dc0 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  v, OP_RealAffini
21dd0 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ty, target);.   
21de0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
21df0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
21e00 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54      case TK_VECT
21e10 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OR: {.      sqli
21e20 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
21e30 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
21e40 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20  isused");.      
21e50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
21e60 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c    case TK_IF_NUL
21e70 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 69  L_ROW: {.      i
21e80 6e 74 20 61 64 64 72 49 4e 52 3b 0a 20 20 20 20  nt addrINR;.    
21e90 20 20 61 64 64 72 49 4e 52 20 3d 20 73 71 6c 69    addrINR = sqli
21ea0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
21eb0 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 2c 20 70   OP_IfNullRow, p
21ec0 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
21ed0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
21ee0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
21ef0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
21f00 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
21f10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21f20 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
21f30 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20 73  ddrINR);.      s
21f40 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
21f50 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20 69  P3(v, addrINR, i
21f60 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
21f70 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
21f80 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
21f90 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
21fa0 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
21fb0 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
21fc0 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
21fd0 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
21fe0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
21ff0 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
22000 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
22010 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
22020 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
22030 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
22040 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
22050 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
22060 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
22070 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
22080 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
22090 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
220a0 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
220b0 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
220c0 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
220d0 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
220e0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
220f0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
22100 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
22110 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
22120 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
22130 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74  Y is in the last
22140 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70   element of pExp
22150 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45  r->x.pList if pE
22160 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
22170 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64  xpr is.    ** od
22180 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73  d.  The Y is als
22190 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20  o optional.  If 
221a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
221b0 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73  ements in x.pLis
221c0 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e  t.    ** is even
221d0 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74  , then Y is omit
221e0 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68  ted and the "oth
221f0 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69  erwise" result i
22200 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
22210 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
22220 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
22230 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
22240 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
22250 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
22260 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
22270 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
22280 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
22290 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
222a0 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
222b0 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
222c0 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
222d0 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
222e0 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
222f0 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
22300 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
22310 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
22320 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
22330 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22350 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
22360 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
22370 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
22380 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223a0 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
223b0 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
223c0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
223d0 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223f0 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
22400 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
22410 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
22420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22430 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
22440 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
22450 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
22460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22470 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
22480 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
22490 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
224a0 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
224b0 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
224c0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
224d0 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
224e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
224f0 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
22500 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
22510 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
22520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22530 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
22540 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
22550 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74       Expr *pTest
22560 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22570 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20         /* X==Ei 
22580 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74  (form A) or just
22590 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a   Ei (form B) */.
225a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
225b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
225c0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
225d0 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78  ect) && pExpr->x
225e0 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  .pList );.      
225f0 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e  assert(pExpr->x.
22600 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
22610 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  );.      pEList 
22620 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
22630 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65  ;.      aListele
22640 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  m = pEList->a;. 
22650 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c       nExpr = pEL
22660 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
22670 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c    endLabel = sql
22680 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
22690 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l(v);.      if( 
226a0 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  (pX = pExpr->pLe
226b0 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ft)!=0 ){.      
226c0 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20    tempX = *pX;. 
226d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
226e0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pX->op==TK_COLU
226f0 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78  MN );.        ex
22700 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74 65  prToRegister(&te
22710 6d 70 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63  mpX, exprCodeVec
22720 74 6f 72 28 70 50 61 72 73 65 2c 20 26 74 65 6d  tor(pParse, &tem
22730 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  pX, &regFree1));
22740 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
22750 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
22760 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
22770 28 26 6f 70 43 6f 6d 70 61 72 65 2c 20 30 2c 20  (&opCompare, 0, 
22780 73 69 7a 65 6f 66 28 6f 70 43 6f 6d 70 61 72 65  sizeof(opCompare
22790 29 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  ));.        opCo
227a0 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51  mpare.op = TK_EQ
227b0 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
227c0 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d  are.pLeft = &tem
227d0 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73  pX;.        pTes
227e0 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a  t = &opCompare;.
227f0 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65          /* Ticke
22800 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66  t b351d95f9cd5ef
22810 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61  17e9d9dbae18f5ca
22820 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20  8611190001:.    
22830 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65      ** The value
22840 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67   in regFree1 mig
22850 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20  ht get SCopy-ed 
22860 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65  into the file re
22870 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  sult..        **
22880 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   So make sure th
22890 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20  at the regFree1 
228a0 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20  register is not 
228b0 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72  reused for other
228c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70  .        ** purp
228d0 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c  oses and possibl
228e0 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  y overwritten.  
228f0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  */.        regFr
22900 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ee1 = 0;.      }
22910 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
22920 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32  i<nExpr-1; i=i+2
22930 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
22940 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  X ){.          a
22950 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20  ssert( pTest!=0 
22960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43  );.          opC
22970 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20  ompare.pRight = 
22980 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
22990 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pr;.        }els
229a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e{.          pTe
229b0 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  st = aListelem[i
229c0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
229d0 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43   }.        nextC
229e0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
229f0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22a00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
22a10 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pTest->op==TK_C
22a20 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
22a30 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
22a40 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73  lse(pParse, pTes
22a50 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c  t, nextCase, SQL
22a60 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
22a70 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
22a80 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e( aListelem[i+1
22a90 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
22aa0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
22ab0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
22ac0 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
22ad0 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20  lem[i+1].pExpr, 
22ae0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
22af0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
22b00 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
22b10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22b20 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
22b30 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
22b40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
22b50 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20  nExpr&1)!=0 ){. 
22b60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
22b70 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
22b80 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31  EList->a[nExpr-1
22b90 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
22ba0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22bb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22bc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
22bd0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
22be0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
22bf0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
22c00 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62  eLabel(v, endLab
22c10 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  el);.      break
22c20 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
22c30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
22c40 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GER.    case TK_
22c50 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61  RAISE: {.      a
22c60 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66  ssert( pExpr->af
22c70 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62  finity==OE_Rollb
22c80 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ack .           
22c90 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
22ca0 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20  ty==OE_Abort.   
22cb0 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
22cc0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46  ->affinity==OE_F
22cd0 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ail.           |
22ce0 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
22cf0 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20  y==OE_Ignore.   
22d00 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
22d10 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65  !pParse->pTrigge
22d20 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  rTab ){.        
22d30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
22d40 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22d60 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
22d70 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
22d80 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
22d90 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  m");.        ret
22da0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
22db0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
22dc0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
22dd0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
22de0 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
22df0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
22e00 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
22e10 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
22e20 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
22e30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
22e40 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
22e50 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
22e60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22e70 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
22e80 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20      v, OP_Halt, 
22e90 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67  SQLITE_OK, OE_Ig
22ea0 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e  nore, 0, pExpr->
22eb0 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20  u.zToken,0);.   
22ec0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
22ed0 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
22ee0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
22ef0 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
22f00 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
22f10 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
22f20 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
22f50 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  y, pExpr->u.zTok
22f60 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  en, 0, 0);.     
22f70 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   }..      break;
22f80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
22f90 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
22fa0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
22fb0 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
22fc0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
22fd0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
22fe0 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e  Free2);.  return
22ff0 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   inReg;.}../*.**
23000 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20   Factor out the 
23010 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65  code of the give
23020 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
23030 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
23040 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ime..**.** If re
23050 67 44 65 73 74 3e 3d 30 20 74 68 65 6e 20 74 68  gDest>=0 then th
23060 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61  e result is alwa
23070 79 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 61  ys stored in tha
23080 74 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 74  t register and t
23090 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  he.** result is 
230a0 6e 6f 74 20 72 65 75 73 61 62 6c 65 2e 20 20 49  not reusable.  I
230b0 66 20 72 65 67 44 65 73 74 3c 30 20 74 68 65 6e  f regDest<0 then
230c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
230d0 20 66 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f   free to .** sto
230e0 72 65 20 74 68 65 20 76 61 6c 75 65 20 77 68 65  re the value whe
230f0 72 65 65 76 65 72 20 69 74 20 77 61 6e 74 73 2e  reever it wants.
23100 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 77    The register w
23110 68 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73  here the express
23120 69 6f 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65  ion .** is store
23130 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  d is returned.  
23140 57 68 65 6e 20 72 65 67 44 65 73 74 3c 30 2c 20  When regDest<0, 
23150 74 77 6f 20 69 64 65 6e 74 69 63 61 6c 20 65 78  two identical ex
23160 70 72 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a  pressions will.*
23170 2a 20 63 6f 64 65 20 74 6f 20 74 68 65 20 73 61  * code to the sa
23180 6d 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  me register..*/.
23190 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
231a0 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72  odeAtInit(.  Par
231b0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
231c0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
231d0 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
231e0 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  pr,      /* The 
231f0 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f  expression to co
23200 64 65 20 77 68 65 6e 20 74 68 65 20 56 44 42 45  de when the VDBE
23210 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a   initializes */.
23220 20 20 69 6e 74 20 72 65 67 44 65 73 74 20 20 20    int regDest   
23230 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
23240 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
23250 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
23260 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61  ExprList *p;.  a
23270 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74  ssert( ConstFact
23280 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a  orOk(pParse) );.
23290 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43    p = pParse->pC
232a0 6f 6e 73 74 45 78 70 72 3b 0a 20 20 69 66 28 20  onstExpr;.  if( 
232b0 72 65 67 44 65 73 74 3c 30 20 26 26 20 70 20 29  regDest<0 && p )
232c0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
232d0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
232e0 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  m;.    int i;.  
232f0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61    for(pItem=p->a
23300 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e  , i=p->nExpr; i>
23310 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29  0; pItem++, i--)
23320 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
23330 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73  m->reusable && s
23340 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
23350 65 28 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72  e(0,pItem->pExpr
23360 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b  ,pExpr,-1)==0 ){
23370 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
23380 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
23390 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a  xprReg;.      }.
233a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70      }.  }.  pExp
233b0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
233c0 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
233d0 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20  Expr, 0);.  p = 
233e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
233f0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c  ppend(pParse, p,
23400 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70   pExpr);.  if( p
23410 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20   ){.     struct 
23420 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
23430 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
23440 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70  nExpr-1];.     p
23450 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d  Item->reusable =
23460 20 72 65 67 44 65 73 74 3c 30 3b 0a 20 20 20 20   regDest<0;.    
23470 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20 29   if( regDest<0 )
23480 20 72 65 67 44 65 73 74 20 3d 20 2b 2b 70 50 61   regDest = ++pPa
23490 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
234a0 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
234b0 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74  xprReg = regDest
234c0 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
234d0 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a  pConstExpr = p;.
234e0 20 20 72 65 74 75 72 6e 20 72 65 67 44 65 73 74    return regDest
234f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
23500 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
23510 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
23520 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  on and store the
23530 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
23540 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65   a register.  Re
23550 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
23560 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  r number where t
23570 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72  he results.** ar
23580 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
23590 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  If the register 
235a0 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  is a temporary r
235b0 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e  egister that can
235c0 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   be deallocated,
235d0 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69  .** then write i
235e0 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ts number into *
235f0 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65  pReg.  If the re
23600 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
23610 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72   not.** a tempor
23620 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ary, then set *p
23630 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a  Reg to zero..**.
23640 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
23650 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
23660 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
23670 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73  ht generate this
23680 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c  .** code to fill
23690 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
236a0 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
236b0 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  ion section of t
236c0 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72  he.** VDBE progr
236d0 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  am, in order to 
236e0 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66  factor it out of
236f0 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
23700 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  loop..*/.int sql
23710 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
23720 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23730 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
23740 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72   *pReg){.  int r
23750 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c  2;.  pExpr = sql
23760 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
23770 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ate(pExpr);.  if
23780 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
23790 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45  pParse).   && pE
237a0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
237b0 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74  STER.   && sqlit
237c0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
237d0 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20  NotJoin(pExpr). 
237e0 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d   ){.    *pReg  =
237f0 20 30 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c   0;.    r2 = sql
23800 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
23810 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
23820 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , -1);.  }else{.
23830 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
23840 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
23850 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d  Parse);.    r2 =
23860 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23870 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
23880 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69  Expr, r1);.    i
23890 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20  f( r2==r1 ){.   
238a0 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20     *pReg = r1;. 
238b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
238c0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
238d0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
238e0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  );.      *pReg =
238f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
23900 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a  return r2;.}../*
23910 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
23920 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
23930 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
23940 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
23950 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
23960 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
23970 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
23980 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
23990 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
239a0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
239b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
239c0 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
239d0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
239e0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
239f0 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20  .  int inReg;.. 
23a00 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
23a10 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
23a20 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
23a30 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70  f( pExpr && pExp
23a40 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
23a50 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ER ){.    sqlite
23a60 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
23a70 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f  se->pVdbe, OP_Co
23a80 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  py, pExpr->iTabl
23a90 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65  e, target);.  }e
23aa0 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d  lse{.    inReg =
23ab0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23ac0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
23ad0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
23ae0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
23af0 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70  e->pVdbe!=0 || p
23b00 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
23b10 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
23b20 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
23b30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62   && pParse->pVdb
23b40 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
23b50 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
23b60 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
23b70 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
23b80 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  get);.    }.  }.
23b90 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
23ba0 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f  transient copy o
23bb0 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
23bc0 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65  pr and then code
23bd0 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c   it using.** sql
23be0 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20  ite3ExprCode(). 
23bf0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
23c00 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71  rks just like sq
23c10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a  lite3ExprCode().
23c20 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 74  ** except that t
23c30 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73  he input express
23c40 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65  ion is guarantee
23c50 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65  d to be unchange
23c60 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
23c70 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50  e3ExprCodeCopy(P
23c80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
23c90 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
23ca0 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65  arget){.  sqlite
23cb0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
23cc0 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  db;.  pExpr = sq
23cd0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
23ce0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66   pExpr, 0);.  if
23cf0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
23d00 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78 70  led ) sqlite3Exp
23d10 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
23d20 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
23d30 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
23d40 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  e(db, pExpr);.}.
23d50 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
23d60 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
23d70 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
23d80 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
23d90 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
23da0 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
23db0 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
23dc0 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
23dd0 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
23de0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
23df0 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  t.  If the expre
23e00 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
23e10 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
23e20 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68  tine.** might ch
23e30 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65  oose to code the
23e40 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69   expression at i
23e50 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
23e60 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
23e70 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
23e80 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  rable(Parse *pPa
23e90 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
23ea0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
23eb0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43   if( pParse->okC
23ec0 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73 71  onstFactor && sq
23ed0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
23ee0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
23ef0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
23f00 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
23f10 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
23f20 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
23f30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
23f40 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
23f50 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a  r, target);.  }.
23f60 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
23f70 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
23f80 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  uates the given 
23f90 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
23fa0 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  uts the result.*
23fb0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
23fc0 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rget..**.** Also
23fd0 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
23fe0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
23ff0 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74  esults into anot
24000 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69  her "cache" regi
24010 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69  ster.** and modi
24020 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
24030 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  n so that the ne
24040 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76  xt time it is ev
24050 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20  aluated,.** the 
24060 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79  result is a copy
24070 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65   of the cache re
24080 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  gister..**.** Th
24090 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
240a0 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ed for expressio
240b0 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ns that are used
240c0 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
240d0 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65  mes.  They are e
240e0 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e  valuated once an
240f0 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
24100 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
24110 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a  ** are reused..*
24120 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
24130 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
24140 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
24150 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
24160 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
24170 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
24180 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a  e;.  int iMem;..
24190 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
241a0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
241b0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
241c0 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69  GISTER );.  sqli
241d0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
241e0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
241f0 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  t);.  iMem = ++p
24200 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
24210 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24220 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72  (v, OP_Copy, tar
24230 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78  get, iMem);.  ex
24240 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45 78  prToRegister(pEx
24250 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a  pr, iMem);.}../*
24260 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
24270 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
24280 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
24290 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
242a0 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
242b0 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  ion list into a 
242c0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
242d0 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
242e0 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  at target..**.**
242f0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
24300 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65  er of elements e
24310 76 61 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e  valuated.  The n
24320 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 77  umber returned w
24330 69 6c 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62  ill.** usually b
24340 65 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62  e pList->nExpr b
24350 75 74 20 6d 69 67 68 74 20 62 65 20 72 65 64 75  ut might be redu
24360 63 65 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43  ced if SQLITE_EC
24370 45 4c 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73  EL_OMITREF.** is
24380 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
24390 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
243a0 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74  DUP flag prevent
243b0 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s the arguments 
243c0 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69  from being.** fi
243d0 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43  lled using OP_SC
243e0 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75  opy.  OP_Copy mu
243f0 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  st be used inste
24400 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ad..**.** The SQ
24410 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
24420 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73   argument allows
24430 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
24440 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63  nts to be.** fac
24450 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69  tored out into i
24460 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f  nitialization co
24470 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  de..**.** The SQ
24480 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c  LITE_ECEL_REF fl
24490 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78  ag means that ex
244a0 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
244b0 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78   list with.** Ex
244c0 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69  prList.a[].u.x.i
244d0 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76  OrderByCol>0 hav
244e0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
244f0 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f  valuated and sto
24500 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  red.** in regist
24510 65 72 73 20 61 74 20 73 72 63 52 65 67 2c 20 61  ers at srcReg, a
24520 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20  nd so the value 
24530 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72  can be copied fr
24540 6f 6d 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20  om there..** If 
24550 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
24560 52 45 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c  REF is also set,
24570 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
24580 20 77 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72   with u.x.iOrder
24590 42 79 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73  ByCol>0.** are s
245a0 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61  imply omitted ra
245b0 74 68 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20  ther than being 
245c0 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52  copied from srcR
245d0 65 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  eg..*/.int sqlit
245e0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
245f0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
24600 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
24610 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24620 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
24630 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
24640 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
24650 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
24660 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
24670 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
24680 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
24690 74 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20  t srcReg,       
246a0 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73   /* Source regis
246b0 74 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45  ters if SQLITE_E
246c0 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20  CEL_REF */.  u8 
246d0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
246e0 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a  /* SQLITE_ECEL_*
246f0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73   flags */.){.  s
24700 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
24710 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
24720 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20  t i, j, n;.  u8 
24730 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20  copyOp = (flags 
24740 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  & SQLITE_ECEL_DU
24750 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f  P) ? OP_Copy : O
24760 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20  P_SCopy;.  Vdbe 
24770 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
24780 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  be;.  assert( pL
24790 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ist!=0 );.  asse
247a0 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
247b0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
247c0 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f  ->pVdbe!=0 );  /
247d0 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69  * Never gets thi
247e0 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20  s far otherwise 
247f0 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  */.  n = pList->
24800 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f  nExpr;.  if( !Co
24810 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
24820 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e  se) ) flags &= ~
24830 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
24840 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  OR;.  for(pItem=
24850 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
24860 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
24870 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
24880 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
24890 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  r;.#ifdef SQLITE
248a0 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
248b0 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66  EFERENCES.    if
248c0 28 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72  ( pItem->bSorter
248d0 52 65 66 20 29 7b 0a 20 20 20 20 20 20 69 2d 2d  Ref ){.      i--
248e0 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  ;.      n--;.   
248f0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
24900 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53    if( (flags & S
24910 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21  QLITE_ECEL_REF)!
24920 3d 30 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d  =0 && (j = pItem
24930 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
24940 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l)>0 ){.      if
24950 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
24960 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b  _ECEL_OMITREF ){
24970 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20  .        i--;.  
24980 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
24990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
249a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
249b0 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73  2(v, copyOp, j+s
249c0 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b  rcReg-1, target+
249d0 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
249e0 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
249f0 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46   & SQLITE_ECEL_F
24a00 41 43 54 4f 52 29 21 3d 30 0a 20 20 20 20 20 20  ACTOR)!=0.      
24a10 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
24a20 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
24a30 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 20 20  Join(pExpr).    
24a40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24a50 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
24a60 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
24a70 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c  rget+i);.    }el
24a80 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e  se{.      int in
24a90 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
24aa0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
24ab0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
24ac0 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t+i);.      if( 
24ad0 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20  inReg!=target+i 
24ae0 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f  ){.        VdbeO
24af0 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20  p *pOp;.        
24b00 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43  if( copyOp==OP_C
24b10 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
24b20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65  (pOp=sqlite3Vdbe
24b30 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f  GetOp(v, -1))->o
24b40 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20  pcode==OP_Copy. 
24b50 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
24b60 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e  p1+pOp->p3+1==in
24b70 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
24b80 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b  pOp->p2+pOp->p3+
24b90 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20  1==target+i.    
24ba0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
24bb0 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20   pOp->p3++;.    
24bc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24bd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24be0 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
24bf0 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b  , inReg, target+
24c00 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
24c10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
24c20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
24c30 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
24c40 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e  de for a BETWEEN
24c50 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
24c60 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
24c70 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  AND z.**.** The 
24c80 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c  above is equival
24c90 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20  ent to .**.**   
24ca0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a   x>=y AND x<=z.*
24cb0 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20  *.** Code it as 
24cc0 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
24cd0 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
24ce0 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
24cf0 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20  .** elimination 
24d00 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  of x..**.** The 
24d10 78 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65  xJumpIf paramete
24d20 72 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74  r determines det
24d30 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  ails:.**.**    N
24d40 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20  ULL:            
24d50 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65         Store the
24d60 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
24d70 69 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20  in reg[dest].** 
24d80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
24d90 54 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20  True:      Jump 
24da0 74 6f 20 64 65 73 74 20 69 66 20 74 72 75 65 0a  to dest if true.
24db0 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  **    sqlite3Exp
24dc0 72 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75  rIfFalse:     Ju
24dd0 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20 66 61  mp to dest if fa
24de0 6c 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75  lse.**.** The ju
24df0 6d 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74  mpIfNull paramet
24e00 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
24e10 20 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c   xJumpIf is NULL
24e20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24e30 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
24e40 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
24e50 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
24e60 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
24e70 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
24e80 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
24e90 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45      /* The BETWE
24ea0 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  EN expression */
24eb0 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
24ec0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
24ed0 74 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72  tination or stor
24ee0 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  age location */.
24ef0 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28    void (*xJump)(
24f00 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74  Parse*,Expr*,int
24f10 2c 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e  ,int), /* Action
24f20 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e   to take */.  in
24f30 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20  t jumpIfNull    
24f40 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70  /* Take the jump
24f50 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
24f60 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45  is NULL */.){. E
24f70 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20  xpr exprAnd;    
24f80 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72   /* The AND oper
24f90 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e  ator in  x>=y AN
24fa0 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70  D x<=z  */.  Exp
24fb0 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f  r compLeft;    /
24fc0 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72  * The  x>=y  ter
24fd0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70  m */.  Expr comp
24fe0 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20  Right;   /* The 
24ff0 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20   x<=z  term */. 
25000 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20   Expr exprX;    
25010 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75     /* The  x  su
25020 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
25030 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
25040 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  0; /* Temporary 
25050 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
25060 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70  ..  memset(&comp
25070 4c 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Left, 0, sizeof(
25080 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Expr));.  memset
25090 28 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20  (&compRight, 0, 
250a0 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
250b0 20 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64   memset(&exprAnd
250c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
250d0 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  ));..  assert( !
250e0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
250f0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
25100 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20  ect) );.  exprX 
25110 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  = *pExpr->pLeft;
25120 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20  .  exprAnd.op = 
25130 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e  TK_AND;.  exprAn
25140 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
25150 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  eft;.  exprAnd.p
25160 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
25170 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f  ht;.  compLeft.o
25180 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d  p = TK_GE;.  com
25190 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
251a0 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  xprX;.  compLeft
251b0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
251c0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
251d0 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68  Expr;.  compRigh
251e0 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20  t.op = TK_LE;.  
251f0 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
25200 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70  = &exprX;.  comp
25210 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
25220 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
25230 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70  [1].pExpr;.  exp
25240 72 54 6f 52 65 67 69 73 74 65 72 28 26 65 78 70  rToRegister(&exp
25250 72 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74  rX, exprCodeVect
25260 6f 72 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  or(pParse, &expr
25270 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a  X, &regFree1));.
25280 20 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20    if( xJump ){. 
25290 20 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c     xJump(pParse,
252a0 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
252b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
252c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
252d0 72 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  rk the expressio
252e0 6e 20 69 73 20 62 65 69 6e 67 20 66 72 6f 6d 20  n is being from 
252f0 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
25300 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
25310 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  .    ** so that 
25320 74 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  the sqlite3ExprC
25330 6f 64 65 54 61 72 67 65 74 28 29 20 72 6f 75 74  odeTarget() rout
25340 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74  ine will not att
25350 65 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20  empt to move.   
25360 20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20   ** it into the 
25370 50 61 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72  Parse.pConstExpr
25380 20 6c 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c   list.  We shoul
25390 64 20 75 73 65 20 61 20 6e 65 77 20 62 69 74 20  d use a new bit 
253a0 66 6f 72 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a  for this,.    **
253b0 20 66 6f 72 20 63 6c 61 72 69 74 79 2c 20 62 75   for clarity, bu
253c0 74 20 77 65 20 61 72 65 20 6f 75 74 20 6f 66 20  t we are out of 
253d0 62 69 74 73 20 69 6e 20 74 68 65 20 45 78 70 72  bits in the Expr
253e0 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 73 6f 20  .flags field so 
253f0 77 65 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 74  we.    ** have t
25400 6f 20 72 65 75 73 65 20 74 68 65 20 45 50 5f 46  o reuse the EP_F
25410 72 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75  romJoin bit.  Bu
25420 6d 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70  mmer. */.    exp
25430 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46  rX.flags |= EP_F
25440 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c  romJoin;.    sql
25450 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
25460 65 74 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  et(pParse, &expr
25470 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a  And, dest);.  }.
25480 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
25490 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
254a0 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a  regFree1);..  /*
254b0 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65   Ensure adequate
254c0 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a   test coverage *
254d0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  /.  testcase( xJ
254e0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
254f0 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
25500 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
25510 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
25520 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
25530 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
25540 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
25550 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
25560 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
25570 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
25580 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d  prIfTrue  && jum
25590 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
255a0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
255b0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
255c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
255d0 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
255e0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
255f0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
25600 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
25610 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
25620 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
25630 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
25640 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
25650 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
25660 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
25670 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
25680 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
25690 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
256a0 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26  e3ExprIfFalse &&
256b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
256c0 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
256d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
256e0 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
256f0 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
25700 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
25710 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
25720 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29  case( xJump==0 )
25730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
25740 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
25750 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
25760 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
25770 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
25780 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
25790 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
257a0 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20  ion is true but 
257b0 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
257c0 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
257d0 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
257e0 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e  ession is false.
257f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
25800 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
25810 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
25820 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
25830 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b  se), then.** tak
25840 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
25850 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61  e jumpIfNull fla
25860 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  g is SQLITE_JUMP
25870 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  IFNULL..**.** Th
25880 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
25890 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
258a0 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76   certain token v
258b0 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51  alues (ex: TK_EQ
258c0 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d  ).** are the sam
258d0 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75  e as opcode valu
258e0 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74  es (ex: OP_Eq) t
258f0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  hat implement th
25900 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
25910 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53  ** operation.  S
25920 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20  pecial comments 
25930 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68  in vdbe.c and th
25940 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
25950 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65  script in.** the
25960 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61   make process ca
25970 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  use these values
25980 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65   to align.  Asse
25990 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64  rt()s in the cod
259a0 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66  e.** below verif
259b0 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
259c0 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63  rs are aligned c
259d0 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69  orrectly..*/.voi
259e0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
259f0 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
25a00 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
25a10 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
25a20 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
25a30 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
25a40 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
25a50 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
25a60 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
25a70 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
25a80 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
25a90 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
25aa0 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
25ab0 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
25ac0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
25ad0 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72  ER(v==0) )     r
25ae0 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74  eturn;  /* Exist
25af0 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
25b00 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
25b10 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  /.  if( NEVER(pE
25b20 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  xpr==0) ) return
25b30 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69  ;  /* No way thi
25b40 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a  s can happen */.
25b50 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
25b60 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
25b70 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
25b80 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  D: {.      int d
25b90 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
25ba0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
25bb0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
25bc0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
25bd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25be0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
25bf0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
25c00 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
25c10 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
25c20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25c30 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
25c40 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
25c50 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
25c60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
25c70 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
25c80 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
25c90 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
25ca0 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
25cb0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
25cc0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
25cd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
25ce0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
25cf0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
25d00 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
25d10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25d20 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
25d30 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
25d40 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
25d50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25d60 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
25d70 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
25d80 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
25d90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
25da0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
25db0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
25dc0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
25dd0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
25de0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
25df0 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b  case TK_TRUTH: {
25e00 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74  .      int isNot
25e10 3b 20 20 20 20 20 20 2f 2a 20 49 53 20 4e 4f 54  ;      /* IS NOT
25e20 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20   TRUE or IS NOT 
25e30 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 69  FALSE */.      i
25e40 6e 74 20 69 73 54 72 75 65 3b 20 20 20 20 20 2f  nt isTrue;     /
25e50 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20  * IS TRUE or IS 
25e60 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20  NOT TRUE */.    
25e70 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
25e80 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
25e90 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70 72     isNot = pExpr
25ea0 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b  ->op2==TK_ISNOT;
25eb0 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20  .      isTrue = 
25ec0 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
25ed0 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69  Value(pExpr->pRi
25ee0 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ght);.      test
25ef0 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26 20  case( isTrue && 
25f00 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74  isNot );.      t
25f10 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75 65  estcase( !isTrue
25f20 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20   && isNot );.   
25f30 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e 20     if( isTrue ^ 
25f40 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  isNot ){.       
25f50 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
25f60 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
25f70 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20  ->pLeft, dest,. 
25f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f90 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f           isNot ?
25fa0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
25fb0 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d  LL : 0);.      }
25fc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
25fd0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25fe0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
25ff0 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20  pLeft, dest,.   
26000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26010 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
26020 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
26030 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  L : 0);.      }.
26040 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26050 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
26060 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
26070 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
26080 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20  case( op==TK_IS 
26090 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
260a0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  e( op==TK_ISNOT 
260b0 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
260c0 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
260d0 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
260e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51   jumpIfNull = SQ
260f0 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
26100 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
26110 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
26120 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
26130 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
26140 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
26150 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
26160 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
26170 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  Q: {.      if( s
26180 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
26190 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  or(pExpr->pLeft)
261a0 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f   ) goto default_
261b0 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74  expr;.      test
261c0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
261d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
261e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
261f0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
26200 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
26210 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
26220 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
26230 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
26240 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
26250 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
26260 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
26270 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
26280 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
26290 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
262a0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
262b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
262c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
262d0 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
262e0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
262f0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
26300 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
26310 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
26320 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
26330 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
26340 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
26350 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
26360 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
26370 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
26380 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
26390 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
263a0 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
263b0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
263c0 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
263d0 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
263e0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
263f0 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
26400 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
26410 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
26420 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
26430 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
26440 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
26450 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
26460 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
26470 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
26480 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
26490 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
264a0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
264b0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
264c0 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
264d0 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  e(op==OP_Ne);.  
264e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
264f0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
26500 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
26510 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
26520 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
26530 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
26540 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
26550 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
26560 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26570 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
26580 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
26590 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
265a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
265b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
265c0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
265d0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
265e0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
265f0 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
26600 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
26610 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
26620 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
26630 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
26640 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
26650 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
26660 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
26670 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
26680 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
26690 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
266a0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
266b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
266c0 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
266d0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
266e0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
266f0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
26700 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
26710 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
26720 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
26730 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26740 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
26750 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
26760 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
26770 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26780 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
26790 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
267a0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
267b0 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49  st, sqlite3ExprI
267c0 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  fTrue, jumpIfNul
267d0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
267e0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
267f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
26800 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
26810 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
26820 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
26830 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
26840 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
26850 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
26860 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
26870 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
26880 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26890 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
268a0 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
268b0 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
268c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
268d0 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
268e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
268f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
26900 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
26910 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26920 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
26930 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61  ault: {.    defa
26940 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20 20  ult_expr:.      
26950 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72  if( exprAlwaysTr
26960 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ue(pExpr) ){.   
26970 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26980 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
26990 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
269a0 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
269b0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
269c0 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* No-op */.   
269d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
269e0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
269f0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
26a00 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
26a10 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
26a20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
26a30 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65  v, OP_If, r1, de
26a40 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
26a50 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
26a60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
26a70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
26a80 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26a90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26aa0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
26ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
26ac0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
26ad0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
26ae0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
26af0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
26b00 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
26b10 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
26b20 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
26b30 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
26b40 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
26b50 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
26b60 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
26b70 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
26b80 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
26b90 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
26ba0 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
26bb0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
26bc0 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
26bd0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
26be0 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
26bf0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
26c00 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
26c10 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
26c20 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
26c30 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
26c40 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
26c50 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
26c60 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
26c70 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
26c80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26c90 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
26ca0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
26cb0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
26cc0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
26cd0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
26ce0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
26cf0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
26d00 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
26d10 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
26d20 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
26d30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
26d40 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
26d50 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
26d60 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26d70 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
26d80 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78   ) return; /* Ex
26d90 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
26da0 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
26db0 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  r */.  if( pExpr
26dc0 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b  ==0 )    return;
26dd0 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
26de0 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
26df0 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
26e00 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
26e10 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
26e20 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
26e30 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
26e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
26e50 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
26e60 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
26e70 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
26e80 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
26e90 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
26ea0 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
26eb0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
26ed0 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
26ee0 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
26ef0 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
26f00 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
26f10 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
26f20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
26f30 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
26f40 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
26f60 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
26f70 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
26f80 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
26f90 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
26fa0 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
26fb0 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
26fc0 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
26fd0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
26fe0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
26ff0 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
27000 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
27010 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
27020 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
27030 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
27040 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
27050 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
27060 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
27070 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
27080 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
27090 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
270a0 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
270b0 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
270c0 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
270d0 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
270e0 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
270f0 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
27100 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27110 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
27120 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
27130 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
27140 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
27150 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
27160 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
27170 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
27180 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
27190 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
271a0 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
271b0 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
271c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
271d0 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
271e0 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
271f0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
27200 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
27210 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
27220 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
27230 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
27240 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27250 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
27260 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
27270 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
27280 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
27290 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
272a0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
272b0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
272c0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
272d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
272e0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
272f0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
27300 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
27310 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
27320 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
27330 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
27340 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27350 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
27360 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
27370 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
27380 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
27390 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
273a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
273b0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
273c0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
273d0 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e  eft, d2, jumpIfN
273e0 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
273f0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
27400 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
27410 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
27420 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
27430 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
27440 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
27450 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
27460 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27470 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27480 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
27490 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
274a0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
274b0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
274c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
274d0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
274e0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
274f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27500 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b  case TK_TRUTH: {
27510 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74  .      int isNot
27520 3b 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52  ;   /* IS NOT TR
27530 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c  UE or IS NOT FAL
27540 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  SE */.      int 
27550 69 73 54 72 75 65 3b 20 20 2f 2a 20 49 53 20 54  isTrue;  /* IS T
27560 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52  RUE or IS NOT TR
27570 55 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  UE */.      test
27580 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
27590 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 4e  ==0 );.      isN
275a0 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d  ot = pExpr->op2=
275b0 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20  =TK_ISNOT;.     
275c0 20 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65   isTrue = sqlite
275d0 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28  3ExprTruthValue(
275e0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
275f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27600 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20  isTrue && isNot 
27610 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27620 65 28 20 21 69 73 54 72 75 65 20 26 26 20 69 73  e( !isTrue && is
27630 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Not );.      if(
27640 20 69 73 54 72 75 65 20 5e 20 69 73 4e 6f 74 20   isTrue ^ isNot 
27650 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53  ){.        /* IS
27660 20 54 52 55 45 20 61 6e 64 20 49 53 20 4e 4f 54   TRUE and IS NOT
27670 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20   FALSE */.      
27680 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
27690 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
276a0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
276b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
276c0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
276d0 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a  t ? 0 : SQLITE_J
276e0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20 20  UMPIFNULL);..   
276f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27700 20 20 2f 2a 20 49 53 20 46 41 4c 53 45 20 61 6e    /* IS FALSE an
27710 64 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f  d IS NOT TRUE */
27720 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27730 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
27740 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
27750 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20   dest,.         
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27770 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51 4c   isNot ? 0 : SQL
27780 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
27790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
277a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
277b0 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
277c0 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
277d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
277e0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
277f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27800 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
27810 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
27820 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d  op = (pExpr->op=
27830 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20  =TK_IS) ? TK_NE 
27840 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a  : TK_EQ;.      j
27850 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49  umpIfNull = SQLI
27860 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
27870 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
27880 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
27890 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
278a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
278b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
278c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
278d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
278e0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
278f0 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
27900 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
27910 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78   goto default_ex
27920 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  pr;.      testca
27930 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
27940 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
27950 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27960 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27970 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
27980 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
27990 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
279a0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
279b0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
279c0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
279d0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
279e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
279f0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
27a00 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
27a10 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
27a20 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
27a30 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
27a40 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
27a50 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
27a60 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27a70 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
27a80 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
27a90 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
27aa0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
27ab0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27ac0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
27ad0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
27ae0 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
27af0 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
27b00 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
27b10 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
27b20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
27b30 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
27b40 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
27b50 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
27b60 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
27b70 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
27b80 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
27b90 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56  =OP_Eq);.      V
27ba0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27bb0 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
27bc0 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
27bd0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
27be0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27bf0 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
27c00 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
27c10 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
27c20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
27c30 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
27c40 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
27c50 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27c60 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
27c70 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
27c80 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
27c90 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
27ca0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
27cb0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
27cc0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
27cd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
27ce0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
27cf0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
27d00 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
27d10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
27d20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
27d30 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
27d40 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
27d50 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
27d60 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
27d70 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
27d80 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
27d90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27da0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
27db0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
27dc0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
27dd0 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65  LL );   VdbeCove
27de0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
27df0 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
27e00 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
27e10 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62  _NOTNULL );  Vdb
27e20 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27e30 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
27e40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27e50 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
27e60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27e70 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
27e80 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
27e90 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27ea0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27eb0 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
27ec0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
27ed0 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
27ee0 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e  IfFalse, jumpIfN
27ef0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
27f00 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
27f10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
27f20 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
27f30 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
27f40 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a  ( jumpIfNull ){.
27f50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
27f60 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
27f70 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
27f80 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
27f90 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
27fa0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
27fb0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
27fc0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
27fd0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
27fe0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
27ff0 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  st, destIfNull);
28000 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28010 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
28020 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
28030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
28040 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
28050 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
28060 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78  {.    default_ex
28070 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65  pr: .      if( e
28080 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
28090 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
280a0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
280b0 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
280c0 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
280d0 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
280e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e   ){.        /* n
280f0 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
28100 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
28110 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
28120 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
28130 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
28140 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28150 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
28160 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74  _IfNot, r1, dest
28170 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
28180 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
28190 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
281a0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
281b0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
281c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
281d0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
281e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
281f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
28200 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
28210 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
28220 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
28230 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
28240 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
28250 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b  2);.}../*.** Lik
28260 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  e sqlite3ExprIfF
28270 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68  alse() except th
28280 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64  at a copy is mad
28290 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72  e of pExpr befor
282a0 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61  e.** code genera
282b0 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63  tion, and that c
282c0 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61  opy is deleted a
282d0 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61  fter code genera
282e0 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e  tion. This.** en
282f0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f  sures that the o
28300 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73  riginal pExpr is
28310 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76   unchanged..*/.v
28320 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
28330 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20  fFalseDup(Parse 
28340 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
28350 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69  Expr, int dest,i
28360 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
28370 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
28380 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
28390 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69  pr *pCopy = sqli
283a0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
283b0 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
283c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
283d0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
283e0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
283f0 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73  arse, pCopy, des
28400 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
28410 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
28420 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70  rDelete(db, pCop
28430 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70  y);.}../*.** Exp
28440 72 65 73 73 69 6f 6e 20 70 56 61 72 20 69 73 20  ression pVar is 
28450 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
28460 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65   an SQL variable
28470 2e 20 70 45 78 70 72 20 6d 61 79 20 62 65 20 61  . pExpr may be a
28480 6e 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65 78  ny.** type of ex
28490 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
284a0 49 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69  If pExpr is a si
284b0 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 2d  mple SQL value -
284c0 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 72 65 61   an integer, rea
284d0 6c 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62 0a  l, string, blob.
284e0 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65  ** or NULL value
284f0 20 2d 20 74 68 65 6e 20 74 68 65 20 56 44 42 45   - then the VDBE
28500 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
28510 20 70 72 65 70 61 72 65 64 20 69 73 20 63 6f 6e   prepared is con
28520 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72 65  figured.** to re
28530 2d 70 72 65 70 61 72 65 20 65 61 63 68 20 74 69  -prepare each ti
28540 6d 65 20 61 20 6e 65 77 20 76 61 6c 75 65 20 69  me a new value i
28550 73 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61  s bound to varia
28560 62 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20  ble pVar..**.** 
28570 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66  Additionally, if
28580 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d 70   pExpr is a simp
28590 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 61 6e 64  le SQL value and
285a0 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 68   the value is th
285b0 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74 68 61  e.** same as tha
285c0 74 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75 6e  t currently boun
285d0 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56  d to variable pV
285e0 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  ar, non-zero is 
285f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68  returned..** Oth
28600 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 76  erwise, if the v
28610 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 74 68  alues are not th
28620 65 20 73 61 6d 65 20 6f 72 20 69 66 20 70 45 78  e same or if pEx
28630 70 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70  pr is not a simp
28640 6c 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65 2c  le.** SQL value,
28650 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   zero is returne
28660 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
28670 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69   exprCompareVari
28680 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
28690 73 65 2c 20 45 78 70 72 20 2a 70 56 61 72 2c 20  se, Expr *pVar, 
286a0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
286b0 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69  int res = 0;.  i
286c0 6e 74 20 69 56 61 72 3b 0a 20 20 73 71 6c 69 74  nt iVar;.  sqlit
286d0 65 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a 70  e3_value *pL, *p
286e0 52 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c 69  R = 0;.  .  sqli
286f0 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  te3ValueFromExpr
28700 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
28710 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  pr, SQLITE_UTF8,
28720 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
28730 2c 20 26 70 52 29 3b 0a 20 20 69 66 28 20 70 52  , &pR);.  if( pR
28740 20 29 7b 0a 20 20 20 20 69 56 61 72 20 3d 20 70   ){.    iVar = p
28750 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  Var->iColumn;.  
28760 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
28770 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e  Varmask(pParse->
28780 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20  pVdbe, iVar);.  
28790 20 20 70 4c 20 3d 20 73 71 6c 69 74 65 33 56 64    pL = sqlite3Vd
287a0 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
287b0 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61  pParse->pReprepa
287c0 72 65 2c 20 69 56 61 72 2c 20 53 51 4c 49 54 45  re, iVar, SQLITE
287d0 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20 20  _AFF_BLOB);.    
287e0 69 66 28 20 70 4c 20 29 7b 0a 20 20 20 20 20 20  if( pL ){.      
287f0 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
28800 65 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c 49  e_type(pL)==SQLI
28810 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
28820 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
28830 5f 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d 61  _text(pL); /* Ma
28840 6b 65 20 73 75 72 65 20 74 68 65 20 65 6e 63 6f  ke sure the enco
28850 64 69 6e 67 20 69 73 20 55 54 46 2d 38 20 2a 2f  ding is UTF-8 */
28860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
28870 65 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65 33  es =  0==sqlite3
28880 4d 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20 70  MemCompare(pL, p
28890 52 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  R, 0);.    }.   
288a0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
288b0 65 28 70 52 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(pR);.    sqlit
288c0 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c 29 3b  e3ValueFree(pL);
288d0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
288e0 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  es;.}../*.** Do 
288f0 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
28900 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
28910 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
28920 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a  rn 0 if the two.
28930 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
28940 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64  re completely id
28950 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e  entical.  Return
28960 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65   1 if they diffe
28970 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43  r only.** by a C
28980 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
28990 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c  at the top level
289a0 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74  .  Return 2 if t
289b0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
289c0 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68  nces.** other th
289d0 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  an the top-level
289e0 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
289f0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  r..**.** If any 
28a00 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
28a10 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
28a20 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
28a30 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
28a40 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
28a50 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
28a60 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
28a70 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
28a80 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Tab..**.** The p
28a90 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20  A side might be 
28aa0 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
28ab0 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  R.  If that is t
28ac0 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69  he case and pB i
28ad0 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54  s.** not using T
28ae0 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69  K_REGISTER but i
28af0 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69  s otherwise equi
28b00 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69  valent, then sti
28b10 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  ll return 0..**.
28b20 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  ** Sometimes thi
28b30 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
28b40 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20  eturn 2 even if 
28b50 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69  the two expressi
28b60 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72  ons.** really ar
28b70 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49  e equivalent.  I
28b80 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76  f we cannot prov
28b90 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
28ba0 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64  ssions are.** id
28bb0 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75  entical, we retu
28bc0 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20  rn 2 just to be 
28bd0 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69  safe.  So if thi
28be0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
28bf0 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75  urns 2, then you
28c00 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b   do not really k
28c10 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20  now for certain 
28c20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
28c30 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
28c40 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20  e same.  But if 
28c50 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31  you get a 0 or 1
28c60 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f   return, then yo
28c70 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65  u.** can be sure
28c80 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
28c90 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
28ca0 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68  In the places wh
28cb0 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ere.** this rout
28cc0 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20  ine is used, it 
28cd0 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f  does not hurt to
28ce0 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20   get an extra 2 
28cf0 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d  - that.** just m
28d00 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73  ight result in s
28d10 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ome slightly slo
28d20 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72  wer code.  But r
28d30 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69  eturning.** an i
28d40 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20  ncorrect 0 or 1 
28d50 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
28d60 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  malfunction..**.
28d70 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
28d80 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54 4b  not NULL then TK
28d90 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d 73 20  _VARIABLE terms 
28da0 69 6e 20 70 41 20 77 69 74 68 20 62 69 6e 64 69  in pA with bindi
28db0 6e 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  ngs in.** pParse
28dc0 2d 3e 70 52 65 70 72 65 70 61 72 65 20 63 61 6e  ->pReprepare can
28dd0 20 62 65 20 6d 61 74 63 68 65 64 20 61 67 61 69   be matched agai
28de0 6e 73 74 20 6c 69 74 65 72 61 6c 73 20 69 6e 20  nst literals in 
28df0 70 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50 61  pB.  The .** pPa
28e00 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d  rse->pVdbe->expm
28e10 61 73 6b 20 62 69 74 6d 61 73 6b 20 69 73 20 75  ask bitmask is u
28e20 70 64 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  pdated for each 
28e30 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e  variable referen
28e40 63 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72 73  ced..** If pPars
28e50 65 20 69 73 20 4e 55 4c 4c 20 28 74 68 65 20 6e  e is NULL (the n
28e60 6f 72 6d 61 6c 20 63 61 73 65 29 20 74 68 65 6e  ormal case) then
28e70 20 61 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c 45   any TK_VARIABLE
28e80 20 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72 67   term in .** Arg
28e90 75 6d 65 6e 74 20 70 50 61 72 73 65 20 73 68 6f  ument pParse sho
28ea0 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  uld normally be 
28eb0 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e  NULL. If it is n
28ec0 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20 6f  ot NULL and pA o
28ed0 72 0a 2a 2a 20 70 42 20 63 61 75 73 65 73 20 61  r.** pB causes a
28ee0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
28ef0 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   2..*/.int sqlit
28f00 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 50 61  e3ExprCompare(Pa
28f10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
28f20 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c  r *pA, Expr *pB,
28f30 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33   int iTab){.  u3
28f40 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b  2 combinedFlags;
28f50 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
28f60 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pB==0 ){.    ret
28f70 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a  urn pB==pA ? 0 :
28f80 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   2;.  }.  if( pP
28f90 61 72 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d 3d  arse && pA->op==
28fa0 54 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20 65  TK_VARIABLE && e
28fb0 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62  xprCompareVariab
28fc0 6c 65 28 70 50 61 72 73 65 2c 20 70 41 2c 20 70  le(pParse, pA, p
28fd0 42 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  B) ){.    return
28fe0 20 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e   0;.  }.  combin
28ff0 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c  edFlags = pA->fl
29000 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b  ags | pB->flags;
29010 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46  .  if( combinedF
29020 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
29030 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ue ){.    if( (p
29040 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61  A->flags&pB->fla
29050 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21  gs&EP_IntValue)!
29060 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c  =0 && pA->u.iVal
29070 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65  ue==pB->u.iValue
29080 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29090 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   0;.    }.    re
290a0 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
290b0 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
290c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
290d0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
290e0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
290f0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d  pare(pParse, pA-
29100 3e 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c  >pLeft,pB,iTab)<
29110 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
29120 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
29130 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pB->op==TK_CO
29140 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
29150 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
29160 73 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74  se, pA,pB->pLeft
29170 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20  ,iTab)<2 ){.    
29180 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
29190 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
291a0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
291b0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  !=TK_COLUMN && p
291c0 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  A->op!=TK_AGG_CO
291d0 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54  LUMN && pA->u.zT
291e0 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
291f0 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pA->op==TK_FUNCT
29200 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ION ){.      if(
29210 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
29220 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
29230 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20  >u.zToken)!=0 ) 
29240 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65  return 2;.    }e
29250 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d  lse if( pA->op==
29260 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
29270 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
29280 73 74 72 69 63 6d 70 28 70 41 2d 3e 75 2e 7a 54  stricmp(pA->u.zT
29290 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
292a0 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32  n)!=0 ) return 2
292b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
292c0 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  strcmp(pA->u.zTo
292d0 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
292e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
292f0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
29300 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  }.  if( (pA->fla
29310 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
29320 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
29330 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72  EP_Distinct) ) r
29340 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41  eturn 2;.  if( A
29350 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46  LWAYS((combinedF
29360 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f  lags & EP_TokenO
29370 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nly)==0) ){.    
29380 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
29390 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
293a0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
293b0 20 69 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c   if( (combinedFl
293c0 61 67 73 20 26 20 45 50 5f 46 69 78 65 64 43 6f  ags & EP_FixedCo
293d0 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71  l)==0.     && sq
293e0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
293f0 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65  (pParse, pA->pLe
29400 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69  ft, pB->pLeft, i
29410 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
29420 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
29430 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
29440 73 65 2c 20 70 41 2d 3e 70 52 69 67 68 74 2c 20  se, pA->pRight, 
29450 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pB->pRight, iTab
29460 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
29470 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
29480 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d  rListCompare(pA-
29490 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e  >x.pList, pB->x.
294a0 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20 72  pList, iTab) ) r
294b0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 61 73 73  eturn 2;.    ass
294c0 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c  ert( (combinedFl
294d0 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64  ags & EP_Reduced
294e0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
294f0 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e  pA->op!=TK_STRIN
29500 47 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f  G && pA->op!=TK_
29510 54 52 55 45 46 41 4c 53 45 20 29 7b 0a 20 20 20  TRUEFALSE ){.   
29520 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75     if( pA->iColu
29530 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
29540 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
29550 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
29560 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20  !=pB->iTable .  
29570 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61       && (pA->iTa
29580 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56  ble!=iTab || NEV
29590 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30  ER(pB->iTable>=0
295a0 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  )) ) return 2;. 
295b0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
295c0 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
295d0 55 4e 43 0a 20 20 20 20 2f 2a 20 4a 75 73 74 69  UNC.    /* Justi
295e0 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  fication for the
295f0 20 61 73 73 65 72 74 28 29 3a 0a 20 20 20 20 2a   assert():.    *
29600 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * window functio
29610 6e 73 20 68 61 76 65 20 70 2d 3e 6f 70 3d 3d 54  ns have p->op==T
29620 4b 5f 46 55 4e 43 54 49 4f 4e 20 62 75 74 20 61  K_FUNCTION but a
29630 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
29640 6e 73 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 70  ns.    ** have p
29650 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
29660 43 54 49 4f 4e 2e 20 20 53 6f 20 61 6e 79 20 63  CTION.  So any c
29670 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65  omparison betwee
29680 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65 0a 20  n an aggregate. 
29690 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
296a0 6e 64 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63  nd a window func
296b0 74 69 6f 6e 20 73 68 6f 75 6c 64 20 68 61 76 65  tion should have
296c0 20 66 61 69 6c 65 64 20 62 65 66 6f 72 65 20 72   failed before r
296d0 65 61 63 68 69 6e 67 0a 20 20 20 20 2a 2a 20 74  eaching.    ** t
296e0 68 69 73 20 70 6f 69 6e 74 2e 20 20 41 6e 64 2c  his point.  And,
296f0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
29700 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 77 69  ble to have a wi
29710 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61 6e  ndow function an
29720 64 0a 20 20 20 20 2a 2a 20 61 20 73 63 61 6c 61  d.    ** a scala
29730 72 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  r function with 
29740 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 6e  the same name an
29750 64 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  d number of argu
29760 6d 65 6e 74 73 2e 20 20 53 6f 0a 20 20 20 20 2a  ments.  So.    *
29770 2a 20 69 66 20 77 65 20 72 65 61 63 68 20 74 68  * if we reach th
29780 69 73 20 70 6f 69 6e 74 2c 20 65 69 74 68 65 72  is point, either
29790 20 41 20 61 6e 64 20 42 20 62 6f 74 68 20 77 69   A and B both wi
297a0 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ndow functions o
297b0 72 0a 20 20 20 20 2a 2a 20 6e 65 69 74 68 65 72  r.    ** neither
297c0 20 61 72 65 20 61 20 77 69 6e 64 6f 77 20 66 75   are a window fu
297d0 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  nctions. */.    
297e0 61 73 73 65 72 74 28 20 28 70 41 2d 3e 70 57 69  assert( (pA->pWi
297f0 6e 3d 3d 30 29 3d 3d 28 70 42 2d 3e 70 57 69 6e  n==0)==(pB->pWin
29800 3d 3d 30 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  ==0) );..    if(
29810 20 70 41 2d 3e 70 57 69 6e 21 3d 30 20 29 7b 0a   pA->pWin!=0 ){.
29820 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
29830 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 70  3WindowCompare(p
29840 50 61 72 73 65 2c 70 41 2d 3e 70 57 69 6e 2c 70  Parse,pA->pWin,p
29850 42 2d 3e 70 57 69 6e 29 21 3d 30 20 29 20 72 65  B->pWin)!=0 ) re
29860 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 23 65  turn 2;.    }.#e
29870 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
29880 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
29890 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69  mpare two ExprLi
298a0 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74  st objects.  Ret
298b0 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72  urn 0 if they ar
298c0 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
298d0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
298e0 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
298f0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  ny way..**.** If
29900 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
29910 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
29920 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
29930 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
29940 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
29950 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
29960 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
29970 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
29980 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
29990 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
299a0 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ht return non-ze
299b0 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  ro for equivalen
299c0 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68  t ExprLists.  Th
299d0 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71  e.** only conseq
299e0 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69  uence will be di
299f0 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74  sabled optimizat
29a00 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20  ions.  But this 
29a10 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
29a20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69  never return 0 i
29a30 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69  f the two ExprLi
29a40 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64  st objects are d
29a50 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20  ifferent, or.** 
29a60 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69  a malfunction wi
29a70 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  ll result..**.**
29a80 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   Two NULL pointe
29a90 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
29aa0 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  d to be the same
29ab0 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f  .  But a NULL po
29ac0 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20  inter.** always 
29ad0 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
29ae0 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e  on-NULL pointer.
29af0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
29b00 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45  xprListCompare(E
29b10 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70  xprList *pA, Exp
29b20 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69  rList *pB, int i
29b30 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Tab){.  int i;. 
29b40 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42   if( pA==0 && pB
29b50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
29b60 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
29b70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  B==0 ) return 1;
29b80 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72  .  if( pA->nExpr
29b90 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65  !=pB->nExpr ) re
29ba0 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d  turn 1;.  for(i=
29bb0 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20  0; i<pA->nExpr; 
29bc0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
29bd0 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69  pExprA = pA->a[i
29be0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ].pExpr;.    Exp
29bf0 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e  r *pExprB = pB->
29c00 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
29c10 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72  if( pA->a[i].sor
29c20 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d  tOrder!=pB->a[i]
29c30 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
29c40 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73  urn 1;.    if( s
29c50 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
29c60 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45 78  e(0, pExprA, pEx
29c70 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74  prB, iTab) ) ret
29c80 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
29c90 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
29ca0 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
29cb0 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74  Compare() except
29cc0 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
29cd0 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65  rs at the top-le
29ce0 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72  vel.** are ignor
29cf0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
29d00 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
29d10 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  p(Expr *pA, Expr
29d20 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
29d30 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
29d40 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a  3ExprCompare(0,.
29d50 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
29d60 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
29d70 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20 20  ate(pA),.       
29d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29d90 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42 29  rSkipCollate(pB)
29da0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69  ,.             i
29db0 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Tab);.}../*.** R
29dc0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65  eturn true if we
29dd0 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70   can prove the p
29de0 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  E2 will always b
29df0 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73  e true if pE1 is
29e00 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72  .** true.  Retur
29e10 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61  n false if we ca
29e20 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68  nnot complete th
29e30 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45  e proof or if pE
29e40 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61  2 might.** be fa
29e50 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  lse.  Examples:.
29e60 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  **.**     pE1: x
29e70 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78  ==5       pE2: x
29e80 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
29e90 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
29ea0 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20      pE1: x>0    
29eb0 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
29ec0 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
29ed0 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
29ee0 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70  E1: x=21       p
29ef0 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33  E2: x=21 OR y=43
29f00 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
29f10 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
29f20 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20  =123     pE2: x 
29f30 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
29f40 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
29f50 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20     pE1: x!=?1   
29f60 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
29f70 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
29f80 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
29f90 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32  : x IS NULL  pE2
29fa0 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
29fb0 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
29fc0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
29fd0 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49  S ?2    pE2: x I
29fe0 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
29ff0 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a  uslt: false.**.*
2a000 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  * When comparing
2a010 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
2a020 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64   between pE1 and
2a030 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73   pE2, if pE2 has
2a040 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c  .** Expr.iTable<
2a050 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20  0 then assume a 
2a060 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76  table number giv
2a070 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a  en by iTab..**.*
2a080 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e  * If pParse is n
2a090 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
2a0a0 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e  e values of boun
2a0b0 64 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 70  d variables in p
2a0c0 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 70 61  E1 are .** compa
2a0d0 72 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65  red against lite
2a0e0 72 61 6c 20 76 61 6c 75 65 73 20 69 6e 20 70 45  ral values in pE
2a0f0 32 20 61 6e 64 20 70 50 61 72 73 65 2d 3e 70 56  2 and pParse->pV
2a100 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69 73 0a  dbe->expmask is.
2a110 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 72  ** modified to r
2a120 65 63 6f 72 64 20 77 68 69 63 68 20 62 6f 75 6e  ecord which boun
2a130 64 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  d variables are 
2a140 72 65 66 65 72 65 6e 63 65 64 2e 20 20 49 66 20  referenced.  If 
2a150 70 50 61 72 73 65 20 0a 2a 2a 20 69 73 20 4e 55  pParse .** is NU
2a160 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65 20 77  LL, then false w
2a170 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
2a180 69 66 20 70 45 31 20 63 6f 6e 74 61 69 6e 73 20  if pE1 contains 
2a190 61 6e 79 20 62 6f 75 6e 64 20 76 61 72 69 61 62  any bound variab
2a1a0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  les..**.** When 
2a1b0 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
2a1c0 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
2a1d0 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
2a1e0 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
2a1f0 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
2a200 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
2a210 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
2a220 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
2a230 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
2a240 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
2a250 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
2a260 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
2a270 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
2a280 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2a290 72 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61 72  rImpliesExpr(Par
2a2a0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2a2b0 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32   *pE1, Expr *pE2
2a2c0 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
2a2d0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2a2e0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
2a2f0 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30  1, pE2, iTab)==0
2a300 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2a310 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d  ;.  }.  if( pE2-
2a320 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26  >op==TK_OR.   &&
2a330 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70   (sqlite3ExprImp
2a340 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c  liesExpr(pParse,
2a350 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74   pE1, pE2->pLeft
2a360 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20  , iTab).        
2a370 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45       || sqlite3E
2a380 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
2a390 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2a3a0 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
2a3b0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2a3c0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
2a3d0 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  2->op==TK_NOTNUL
2a3e0 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
2a3f0 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  _ISNULL && pE1->
2a400 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20  op!=TK_IS ){.   
2a410 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c 69   Expr *pX = sqli
2a420 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2a430 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a  te(pE1->pLeft);.
2a440 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2a450 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a  !=pE1->pLeft );.
2a460 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2a470 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2a480 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65 66  e, pX, pE2->pLef
2a490 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65  t, iTab)==0 ) re
2a4a0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2a4b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2a4c0 20 54 68 69 73 20 69 73 20 74 68 65 20 45 78 70   This is the Exp
2a4d0 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20  r node callback 
2a4e0 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72 49  for sqlite3ExprI
2a4f0 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2a500 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ()..** If the ex
2a510 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
2a520 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65 20  quires that the 
2a530 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65 72  table at pWalker
2a540 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20 61  ->iCur.** have a
2a550 20 6e 6f 6e 2d 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   non-NULL column
2a560 2c 20 74 68 65 6e 20 73 65 74 20 70 57 61 6c 6b  , then set pWalk
2a570 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20 61  er->eCode to 1 a
2a580 6e 64 20 61 62 6f 72 74 2e 0a 2a 2f 0a 73 74 61  nd abort..*/.sta
2a590 74 69 63 20 69 6e 74 20 69 6d 70 6c 69 65 73 4e  tic int impliesN
2a5a0 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b 65 72  otNullRow(Walker
2a5b0 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2a5c0 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68  *pExpr){.  /* Th
2a5d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
2a5e0 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 57 48  ly called for WH
2a5f0 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
2a600 73 73 69 6f 6e 73 20 61 6e 64 20 73 6f 20 69 74  ssions and so it
2a610 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 68 61 76  .  ** cannot hav
2a620 65 20 61 6e 79 20 54 4b 5f 41 47 47 5f 43 4f 4c  e any TK_AGG_COL
2a630 55 4d 4e 20 65 6e 74 72 69 65 73 20 62 65 63 61  UMN entries beca
2a640 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 6f 6e  use those are on
2a650 6c 79 20 66 6f 75 6e 64 0a 20 20 2a 2a 20 69 6e  ly found.  ** in
2a660 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 2e   HAVING clauses.
2a670 20 20 57 65 20 63 61 6e 20 67 65 74 20 61 20 54    We can get a T
2a680 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 69  K_AGG_FUNCTION i
2a690 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  n a WHERE clause
2a6a0 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20  ,.  ** but that 
2a6b0 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 20 63 6f  is an illegal co
2a6c0 6e 73 74 72 75 63 74 20 61 6e 64 20 74 68 65 20  nstruct and the 
2a6d0 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 72 65  query will be re
2a6e0 6a 65 63 74 65 64 20 61 74 0a 20 20 2a 2a 20 61  jected at.  ** a
2a6f0 20 6c 61 74 65 72 20 73 74 61 67 65 20 6f 66 20   later stage of 
2a700 70 72 6f 63 65 73 73 69 6e 67 2c 20 73 6f 20 74  processing, so t
2a710 68 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  he TK_AGG_FUNCTI
2a720 4f 4e 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  ON case does not
2a730 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  .  ** need to be
2a740 20 63 6f 6e 73 69 64 65 72 65 64 20 68 65 72 65   considered here
2a750 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
2a760 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
2a770 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 74 65 73  _COLUMN );.  tes
2a780 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2a790 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
2a7a0 4e 20 29 3b 0a 0a 20 20 69 66 28 20 45 78 70 72  N );..  if( Expr
2a7b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2a7c0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
2a7d0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75  ) return WRC_Pru
2a7e0 6e 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  ne;.  switch( pE
2a7f0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
2a800 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
2a810 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a 20    case TK_NOT:. 
2a820 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
2a830 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  L:.    case TK_I
2a840 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  S:.    case TK_O
2a850 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  R:.    case TK_C
2a860 41 53 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ASE:.    case TK
2a870 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IN:.    case TK
2a880 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
2a890 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2a8a0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
2a8b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2a8c0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2a8d0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  NOT );.      tes
2a8e0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2a8f0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
2a900 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2a910 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
2a920 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2a930 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2a940 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _OR );.      tes
2a950 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2a960 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 0a 20 20 20  ==TK_CASE );.   
2a970 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2a980 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
2a990 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2a9a0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46   pExpr->op==TK_F
2a9b0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
2a9c0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2a9d0 65 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  e;.    case TK_C
2a9e0 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 69 66 28  OLUMN:.      if(
2a9f0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72   pWalker->u.iCur
2aa00 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
2aa10 29 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  ){.        pWalk
2aa20 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20  er->eCode = 1;. 
2aa30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2aa40 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
2aa50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
2aa60 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20 2f 2a  C_Prune;..    /*
2aa70 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   Virtual tables 
2aa80 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75  are allowed to u
2aa90 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6c  se constraints l
2aaa0 69 6b 65 20 78 3d 4e 55 4c 4c 2e 20 20 53 6f 0a  ike x=NULL.  So.
2aab0 20 20 20 20 2a 2a 20 61 20 74 65 72 6d 20 6f 66      ** a term of
2aac0 20 74 68 65 20 66 6f 72 6d 20 78 3d 79 20 64 6f   the form x=y do
2aad0 65 73 20 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  es not prove tha
2aae0 74 20 79 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20  t y is not null 
2aaf0 69 66 20 78 0a 20 20 20 20 2a 2a 20 69 73 20 74  if x.    ** is t
2ab00 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 76  he column of a v
2ab10 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
2ab20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a      case TK_EQ:.
2ab30 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
2ab40 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
2ab50 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
2ab60 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
2ab70 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
2ab80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ab90 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
2aba0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2abb0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2abc0 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_NE );.      te
2abd0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2abe0 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20  p==TK_LT );.    
2abf0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2ac00 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a  r->op==TK_LE );.
2ac10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ac20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  pExpr->op==TK_GT
2ac30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2ac40 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2ac50 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 69 66  K_GE );.      if
2ac60 28 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  ( (pExpr->pLeft-
2ac70 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
2ac80 26 20 49 73 56 69 72 74 75 61 6c 28 70 45 78 70  & IsVirtual(pExp
2ac90 72 2d 3e 70 4c 65 66 74 2d 3e 70 54 61 62 29 29  r->pLeft->pTab))
2aca0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78 70  .       || (pExp
2acb0 72 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  r->pRight->op==T
2acc0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69  K_COLUMN && IsVi
2acd0 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 52 69  rtual(pExpr->pRi
2ace0 67 68 74 2d 3e 70 54 61 62 29 29 0a 20 20 20 20  ght->pTab)).    
2acf0 20 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74 75    ){.       retu
2ad00 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2ad10 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
2ad20 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
2ad30 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
2ad40 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
2ad50 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f  n true (non-zero
2ad60 29 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20  ) if expression 
2ad70 70 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72  p can only be tr
2ad80 75 65 20 69 66 20 61 74 20 6c 65 61 73 74 0a 2a  ue if at least.*
2ad90 2a 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  * one column of 
2ada0 74 61 62 6c 65 20 69 54 61 62 20 69 73 20 6e 6f  table iTab is no
2adb0 6e 2d 6e 75 6c 6c 2e 20 20 49 6e 20 6f 74 68 65  n-null.  In othe
2adc0 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
2add0 74 72 75 65 0a 2a 2a 20 69 66 20 65 78 70 72 65  true.** if expre
2ade0 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 61 6c 77  ssion p will alw
2adf0 61 79 73 20 62 65 20 4e 55 4c 4c 20 6f 72 20 66  ays be NULL or f
2ae00 61 6c 73 65 20 69 66 20 65 76 65 72 79 20 63 6f  alse if every co
2ae10 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20  lumn of iTab.** 
2ae20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46  is NULL..**.** F
2ae30 61 6c 73 65 20 6e 65 67 61 74 69 76 65 73 20 61  alse negatives a
2ae40 72 65 20 61 63 63 65 70 74 61 62 6c 65 2e 20 20  re acceptable.  
2ae50 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2ae60 69 74 20 69 73 20 6f 6b 20 74 6f 20 72 65 74 75  it is ok to retu
2ae70 72 6e 0a 2a 2a 20 7a 65 72 6f 20 65 76 65 6e 20  rn.** zero even 
2ae80 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  if expression p 
2ae90 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72  will never be tr
2aea0 75 65 20 6f 66 20 65 76 65 72 79 20 63 6f 6c 75  ue of every colu
2aeb0 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73  mn of iTab.** is
2aec0 20 4e 55 4c 4c 2e 20 20 41 20 66 61 6c 73 65 20   NULL.  A false 
2aed0 6e 65 67 61 74 69 76 65 20 69 73 20 6d 65 72 65  negative is mere
2aee0 6c 79 20 61 20 6d 69 73 73 65 64 20 6f 70 74 69  ly a missed opti
2aef0 6d 69 7a 61 74 69 6f 6e 20 6f 70 70 6f 72 74 75  mization opportu
2af00 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73  nity..**.** Fals
2af10 65 20 70 6f 73 69 74 69 76 65 73 20 61 72 65 20  e positives are 
2af20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2c 20 68 6f 77  not allowed, how
2af30 65 76 65 72 2e 20 20 41 20 66 61 6c 73 65 20 70  ever.  A false p
2af40 6f 73 69 74 69 76 65 20 6d 61 79 20 72 65 73 75  ositive may resu
2af50 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 63 6f  lt.** in an inco
2af60 72 72 65 63 74 20 61 6e 73 77 65 72 2e 0a 2a 2a  rrect answer..**
2af70 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 70 20 74  .** Terms of p t
2af80 68 61 74 20 61 72 65 20 6d 61 72 6b 65 64 20 77  hat are marked w
2af90 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  ith EP_FromJoin 
2afa0 28 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74 20  (and hence that 
2afb0 63 6f 6d 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  come from.** the
2afc0 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2afd0 75 73 65 73 20 6f 66 20 4c 45 46 54 20 4a 4f 49  uses of LEFT JOI
2afe0 4e 53 29 20 61 72 65 20 65 78 63 6c 75 64 65 64  NS) are excluded
2aff0 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 73   from the analys
2b000 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  is..**.** This r
2b010 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
2b020 6f 20 63 68 65 63 6b 20 69 66 20 61 20 4c 45 46  o check if a LEF
2b030 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 63 6f  T JOIN can be co
2b040 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 2a 2a 20  nverted into.** 
2b050 61 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e  an ordinary JOIN
2b060 2e 20 20 54 68 65 20 70 20 61 72 67 75 6d 65 6e  .  The p argumen
2b070 74 20 69 73 20 74 68 65 20 57 48 45 52 45 20 63  t is the WHERE c
2b080 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 57  lause.  If the W
2b090 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 72  HERE.** clause r
2b0a0 65 71 75 69 72 65 73 20 74 68 61 74 20 73 6f 6d  equires that som
2b0b0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
2b0c0 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74  right table of t
2b0d0 68 65 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20  he LEFT JOIN.** 
2b0e0 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  be non-NULL, the
2b0f0 6e 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20  n the LEFT JOIN 
2b100 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 63 6f  can be safely co
2b110 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 0a  nverted into an.
2b120 2a 2a 20 6f 72 64 69 6e 61 72 79 20 6a 6f 69 6e  ** ordinary join
2b130 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2b140 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75  ExprImpliesNonNu
2b150 6c 6c 52 6f 77 28 45 78 70 72 20 2a 70 2c 20 69  llRow(Expr *p, i
2b160 6e 74 20 69 54 61 62 29 7b 0a 20 20 57 61 6c 6b  nt iTab){.  Walk
2b170 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
2b180 61 6c 6c 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65  allback = implie
2b190 73 4e 6f 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77  sNotNullRow;.  w
2b1a0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2b1b0 20 3d 20 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63   = 0;.  w.xSelec
2b1c0 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a  tCallback2 = 0;.
2b1d0 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20    w.eCode = 0;. 
2b1e0 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 54 61 62   w.u.iCur = iTab
2b1f0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2b200 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
2b210 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a  turn w.eCode;.}.
2b220 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2b230 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2b240 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2b250 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
2b260 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64  e walker.** to d
2b270 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65  etermine if an e
2b280 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
2b290 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65   evaluated by re
2b2a0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a  ference to the.*
2b2b0 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69  * index only, wi
2b2c0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
2b2d0 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20  do a search for 
2b2e0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2b2f0 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79  g.** table entry
2b300 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e  .  The IdxCover.
2b310 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68  pIdx field is th
2b320 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76  e index.  IdxCov
2b330 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68  er.iCur.** is th
2b340 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  e cursor for the
2b350 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63   table..*/.struc
2b360 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49  t IdxCover {.  I
2b370 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
2b380 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
2b390 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f  be tested for co
2b3a0 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  verage */.  int 
2b3b0 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  iCur;        /* 
2b3c0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
2b3d0 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72  r the table corr
2b3e0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
2b3f0 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   index */.};../*
2b400 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
2b410 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65   if there are re
2b420 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2b430 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a  mns in table .**
2b440 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
2b450 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20  Cover->iCur can 
2b460 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69  be satisfied usi
2b470 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  ng the index.** 
2b480 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2b490 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73  over->pIdx..*/.s
2b4a0 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64  tatic int exprId
2b4b0 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70  xCover(Walker *p
2b4c0 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2b4d0 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
2b4e0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2b4f0 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54  .   && pExpr->iT
2b500 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
2b510 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
2b520 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f  .   && sqlite3Co
2b530 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c  lumnOfIndex(pWal
2b540 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2b550 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69  ->pIdx, pExpr->i
2b560 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20  Column)<0.  ){. 
2b570 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
2b580 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  e = 1;.    retur
2b590 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
2b5a0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2b5b0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
2b5c0 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
2b5d0 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74   index pIdx on t
2b5e0 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
2b5f0 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77   iCur contains w
2b600 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65  ill.** the expre
2b610 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
2b620 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
2b630 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65   index does cove
2b640 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  r the.** express
2b650 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ion and false if
2b660 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
2b670 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73  ssion references
2b680 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a   table columns.*
2b690 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66  * that are not f
2b6a0 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65  ound in the inde
2b6b0 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e  x pIdx..**.** An
2b6c0 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20   index covering 
2b6d0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65  an expression me
2b6e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70  ans that the exp
2b6f0 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a  ression can be.*
2b700 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e  * evaluated usin
2b710 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78  g only the index
2b720 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76   and without hav
2b730 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  ing to lookup th
2b740 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
2b750 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a  ng table entry..
2b760 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2b770 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78  prCoveredByIndex
2b780 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  (.  Expr *pExpr,
2b790 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
2b7a0 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65  ndex to be teste
2b7b0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
2b7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2b7d0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
2b7e0 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
2b7f0 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20  nding table */. 
2b800 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
2b810 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2b820 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  x that might be 
2b830 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67  used for coverag
2b840 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72  e */.){.  Walker
2b850 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78   w;.  struct Idx
2b860 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65  Cover xcov;.  me
2b870 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
2b880 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69  of(w));.  xcov.i
2b890 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63  Cur = iCur;.  xc
2b8a0 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  ov.pIdx = pIdx;.
2b8b0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2b8c0 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72  k = exprIdxCover
2b8d0 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65  ;.  w.u.pIdxCove
2b8e0 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c  r = &xcov;.  sql
2b8f0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
2b900 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72   pExpr);.  retur
2b910 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a  n !w.eCode;.}...
2b920 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
2b930 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2b940 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
2b950 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
2b960 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f   walker.** to co
2b970 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  unt references t
2b980 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  o table columns 
2b990 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  in the arguments
2b9a0 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65   of an .** aggre
2b9b0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69  gate function, i
2b9c0 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65  n order to imple
2b9d0 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ment the.** sqli
2b9e0 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53  te3FunctionThisS
2b9f0 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  rc() routine..*/
2ba00 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74  .struct SrcCount
2ba10 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53   {.  SrcList *pS
2ba20 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72  rc;   /* One par
2ba30 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61  ticular FROM cla
2ba40 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20  use in a nested 
2ba50 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  query */.  int n
2ba60 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  This;       /* N
2ba70 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2ba80 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
2ba90 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  n pSrcList */.  
2baa0 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20  int nOther;     
2bab0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2bac0 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2bad0 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f  mns in other FRO
2bae0 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a  M clauses */.};.
2baf0 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
2bb00 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
2bb10 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2bb20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bb30 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c  exprSrcCount(Wal
2bb40 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2bb50 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a  pr *pExpr){.  /*
2bb60 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20   The NEVER() on 
2bb70 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20  the second term 
2bb80 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74  is because sqlit
2bb90 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
2bba0 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20  isSrc().  ** is 
2bbb0 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65  always called be
2bbc0 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72  fore sqlite3Expr
2bbd0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2bbe0 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20  s() and so the. 
2bbf0 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68   ** TK_COLUMNs h
2bc00 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
2bc10 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
2bc20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20  TK_AGG_COLUMN.  
2bc30 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  If.  ** sqlite3F
2bc40 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2bc50 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66  rc() is used dif
2bc60 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  ferently in the 
2bc70 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a  future, the.  **
2bc80 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65   NEVER() will ne
2bc90 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64  ed to be removed
2bca0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  . */.  if( pExpr
2bcb0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2bcc0 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e  || NEVER(pExpr->
2bcd0 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2bce0 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  N) ){.    int i;
2bcf0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43  .    struct SrcC
2bd00 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65  ount *p = pWalke
2bd10 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a  r->u.pSrcCount;.
2bd20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
2bd30 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
2bd40 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63   int nSrc = pSrc
2bd50 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20   ? pSrc->nSrc : 
2bd60 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
2bd70 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSrc; i++){.  
2bd80 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2bd90 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69  Table==pSrc->a[i
2bda0 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ].iCursor ) brea
2bdb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
2bdc0 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20   i<nSrc ){.     
2bdd0 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20   p->nThis++;.   
2bde0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
2bdf0 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d  >nOther++;.    }
2be00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2be10 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2be20 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
2be30 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67  f any of the arg
2be40 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45  uments to the pE
2be50 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66  xpr Function ref
2be60 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69  erence.** pSrcLi
2be70 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  st.  Return true
2be80 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c   if they do.  Al
2be90 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  so return true i
2bea0 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  f the function.*
2beb0 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e  * has no argumen
2bec0 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63  ts or has only c
2bed0 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
2bee0 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  s.  Return false
2bef0 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66   if pExpr.** ref
2bf00 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20  erences columns 
2bf10 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20  but not columns 
2bf20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20  of tables found 
2bf30 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  in pSrcList..*/.
2bf40 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74  int sqlite3Funct
2bf50 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45  ionUsesThisSrc(E
2bf60 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c  xpr *pExpr, SrcL
2bf70 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a  ist *pSrcList){.
2bf80 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
2bf90 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e  ruct SrcCount cn
2bfa0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  t;.  assert( pEx
2bfb0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
2bfc0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78  UNCTION );.  w.x
2bfd0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
2bfe0 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77  xprSrcCount;.  w
2bff0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2c000 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63   = 0;.  w.u.pSrc
2c010 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20  Count = &cnt;.  
2c020 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c  cnt.pSrc = pSrcL
2c030 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73  ist;.  cnt.nThis
2c040 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68   = 0;.  cnt.nOth
2c050 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
2c060 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77  3WalkExprList(&w
2c070 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
2c080 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e  );.  return cnt.
2c090 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e  nThis>0 || cnt.n
2c0a0 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Other==0;.}../*.
2c0b0 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
2c0c0 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
2c0d0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72  Info->aCol[] arr
2c0e0 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
2c0f0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
2c100 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
2c110 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2c120 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
2c130 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2c140 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
2c150 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a  Column(sqlite3 *
2c160 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
2c170 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
2c180 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
2c190 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
2c1a0 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20  te(.       db,. 
2c1b0 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
2c1c0 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  l,.       sizeof
2c1d0 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29  (pInfo->aCol[0])
2c1e0 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
2c1f0 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
2c200 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
2c210 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
2c220 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
2c230 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
2c240 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72  nfo->aFunc[] arr
2c250 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
2c260 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
2c270 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
2c280 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2c290 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
2c2a0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2c2b0 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
2c2c0 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62  Func(sqlite3 *db
2c2d0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
2c2e0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
2c2f0 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c  nfo->aFunc = sql
2c300 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
2c310 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20  e(.       db, . 
2c320 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75        pInfo->aFu
2c330 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  nc,.       sizeo
2c340 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
2c350 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  ]),.       &pInf
2c360 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->nFunc,.      
2c370 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
2c380 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
2c390 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
2c3a0 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  xprCallback for 
2c3b0 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20  a tree walker.  
2c3c0 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  It is used to.**
2c3d0 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
2c3e0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2c3f0 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
2c400 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2c410 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
2c420 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
2c430 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
2c440 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
2c450 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65  eAggregate(Walke
2c460 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2c470 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
2c480 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
2c490 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
2c4a0 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20  >u.pNC;.  Parse 
2c4b0 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
2c4c0 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
2c4d0 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
2c4e0 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
2c4f0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
2c500 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 41 67 67 49  = pNC->uNC.pAggI
2c510 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  nfo;..  assert( 
2c520 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
2c530 43 5f 55 41 67 67 49 6e 66 6f 20 29 3b 0a 20 20  C_UAggInfo );.  
2c540 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
2c550 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
2c560 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
2c570 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
2c580 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
2c590 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2c5a0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
2c5b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2c5c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
2c5d0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  UMN );.      /* 
2c5e0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2c5f0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
2c600 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
2c610 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
2c620 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
2c630 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
2c640 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
2c650 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69  f( ALWAYS(pSrcLi
2c660 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
2c670 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2c680 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
2c690 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
2c6a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2c6b0 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
2c6c0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2c6d0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2c6e0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
2c6f0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2c700 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2c710 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
2c720 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2c730 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
2c740 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
2c750 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
2c760 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
2c770 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
2c780 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
2c790 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70   means that pExp
2c7a0 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  r refers to a ta
2c7b0 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
2c7c0 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  ** that is in th
2c7d0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2c7e0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
2c7f0 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20  uery.  .        
2c800 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
2c810 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e     ** Make an en
2c820 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  try for the colu
2c830 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  mn in pAggInfo->
2c840 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a  aCol[] if there.
2c850 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2c860 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74  s not an entry t
2c870 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
2c880 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2c890 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
2c8a0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2c8b0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f   = pAggInfo->aCo
2c8c0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  l;.            f
2c8d0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e  or(k=0; k<pAggIn
2c8e0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  fo->nColumn; k++
2c8f0 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
2c900 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
2c910 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  l->iTable==pExpr
2c920 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
2c930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2c940 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  ol->iColumn==pEx
2c950 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
2c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2c970 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2c980 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c990 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2c9a0 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f  if( (k>=pAggInfo
2c9b0 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20  ->nColumn).     
2c9c0 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20          && (k = 
2c9d0 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
2c9e0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
2c9f0 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20  gInfo))>=0 .    
2ca00 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2ca10 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
2ca20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
2ca30 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k];.            
2ca40 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70    pCol->pTab = p
2ca50 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
2ca60 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2ca70 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  iTable = pExpr->
2ca80 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
2ca90 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
2caa0 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
2cab0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
2cac0 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d      pCol->iMem =
2cad0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2cae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2caf0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2cb00 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
2cb10 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78         pCol->pEx
2cb20 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
2cb30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
2cb40 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
2cb50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cb60 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20      int j, n;.  
2cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
2cb80 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41  prList *pGB = pA
2cb90 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
2cba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cbb0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2cbc0 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20  t_item *pTerm = 
2cbd0 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  pGB->a;.        
2cbe0 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d          n = pGB-
2cbf0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
2cc00 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
2cc10 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d   j<n; j++, pTerm
2cc20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2cc30 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20         Expr *pE 
2cc40 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
2cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc60 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
2cc70 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69  _COLUMN && pE->i
2cc80 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
2cc90 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
2cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2ccb0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
2ccc0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
2ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cce0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2ccf0 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
2cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2cd10 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2cd20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cd30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2cd40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2cd50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
2cd60 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2cd70 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2cd80 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
2cd90 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67  terColumn = pAgg
2cda0 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f  Info->nSortingCo
2cdb0 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
2cdc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cdd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2cde0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
2cdf0 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70  w an entry for p
2ce00 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f  Expr in pAggInfo
2ce10 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72  ->aCol[] (either
2ce20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2ce30 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74  because it was t
2ce40 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62  here before or b
2ce50 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63  ecause we just c
2ce60 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20  reated it)..    
2ce70 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65          ** Conve
2ce80 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20  rt the pExpr to 
2ce90 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  be a TK_AGG_COLU
2cea0 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20  MN referring to 
2ceb0 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20  that.           
2cec0 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   ** pAggInfo->aC
2ced0 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20  ol[] entry..    
2cee0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2cef0 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
2cf00 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
2cf10 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2cf20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2cf30 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
2cf40 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  gInfo;.         
2cf50 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
2cf60 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20  K_AGG_COLUMN;.  
2cf70 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2cf80 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a  >iAgg = (i16)k;.
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2cfa0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f  k;.          } /
2cfb0 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69  * endif pExpr->i
2cfc0 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
2cfd0 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  ursor */.       
2cfe0 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f   } /* end loop o
2cff0 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a  ver pSrcList */.
2d000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2d010 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2d020 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
2d030 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
2d040 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43  {.      if( (pNC
2d050 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49  ->ncFlags & NC_I
2d060 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20  nAggFunc)==0.   
2d070 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e      && pWalker->
2d080 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78  walkerDepth==pEx
2d090 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b  pr->op2.      ){
2d0a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
2d0b0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
2d0c0 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
2d0d0 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
2d0e0 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
2d0f0 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
2d100 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
2d110 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
2d120 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
2d130 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2d140 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
2d150 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
2d160 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
2d170 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
2d180 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
2d190 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2d1a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2d1b0 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74  prCompare(0, pIt
2d1c0 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72  em->pExpr, pExpr
2d1d0 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , -1)==0 ){.    
2d1e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2d1f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2d210 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46   i>=pAggInfo->nF
2d220 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unc ){.         
2d230 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69   /* pExpr is ori
2d240 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e  ginal.  Make a n
2d250 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67  ew entry in pAgg
2d260 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20  Info->aFunc[].  
2d270 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2d280 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
2d290 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  C(pParse->db);. 
2d2a0 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64           i = add
2d2b0 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72  AggInfoFunc(pPar
2d2c0 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
2d2d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2d2e0 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   i>=0 ){.       
2d2f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2d300 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2d310 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
2d320 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t) );.          
2d330 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49    pItem = &pAggI
2d340 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20  nfo->aFunc[i];. 
2d350 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2d360 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
2d370 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2d380 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  em->iMem = ++pPa
2d390 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2d3a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2d3b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2d3c0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
2d3d0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ue) );.         
2d3e0 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20     pItem->pFunc 
2d3f0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
2d400 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
2d410 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d420 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54       pExpr->u.zT
2d430 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  oken, .         
2d440 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2d450 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  >x.pList ? pExpr
2d460 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2d470 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20   : 0, enc, 0);. 
2d480 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2d490 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
2d4a0 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
2d4b0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2d4c0 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50  ->iDistinct = pP
2d4d0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2d4e0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2d4f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2d500 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
2d510 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
2d520 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2d530 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d540 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20    /* Make pExpr 
2d550 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70  point to the app
2d560 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66  ropriate pAggInf
2d570 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79  o->aFunc[] entry
2d580 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2d590 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2d5a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2d5b0 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
2d5c0 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2d5d0 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
2d5e0 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
2d5f0 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2d600 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2d610 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20  Agg = (i16)i;.  
2d620 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
2d630 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
2d640 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2d650 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
2d660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d670 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2d680 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
2d690 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2d6a0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2d6b0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
2d6c0 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2d6d0 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57  elect(Walker *pW
2d6e0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
2d6f0 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45  Select){.  UNUSE
2d700 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c  D_PARAMETER(pSel
2d710 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  ect);.  pWalker-
2d720 3e 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a  >walkerDepth++;.
2d730 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2d740 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
2d750 76 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67 72  void analyzeAggr
2d760 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e  egatesInSelectEn
2d770 64 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  d(Walker *pWalke
2d780 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
2d790 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ct){.  UNUSED_PA
2d7a0 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29  RAMETER(pSelect)
2d7b0 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c  ;.  pWalker->wal
2d7c0 6b 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f  kerDepth--;.}../
2d7d0 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
2d7e0 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f   pExpr expressio
2d7f0 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
2d800 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2d810 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
2d820 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
2d830 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
2d840 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74  AggInfo object t
2d850 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66  hat pNC->pAggInf
2d860 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20  o.** points to. 
2d870 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   Additional entr
2d880 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20  ies are made on 
2d890 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65  the AggInfo obje
2d8a0 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61  ct as.** necessa
2d8b0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
2d8c0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
2d8d0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
2d8e0 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
2d8f0 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
2d900 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
2d910 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
2d920 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
2d930 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2d940 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f  ggregates(NameCo
2d950 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
2d960 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b   *pExpr){.  Walk
2d970 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
2d980 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
2d990 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e  eAggregate;.  w.
2d9a0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2d9b0 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
2d9c0 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77  tesInSelect;.  w
2d9d0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2d9e0 32 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  2 = analyzeAggre
2d9f0 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64  gatesInSelectEnd
2da00 3b 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74  ;.  w.walkerDept
2da10 68 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43  h = 0;.  w.u.pNC
2da20 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74   = pNC;.  assert
2da30 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
2da40 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  =0 );.  sqlite3W
2da50 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
2da60 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  r);.}../*.** Cal
2da70 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
2da80 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
2da90 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
2daa0 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
2dab0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
2dac0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
2dad0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
2dae0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
2daf0 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
2db00 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
2db10 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
2db20 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2db30 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
2db40 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
2db50 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
2db60 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2db70 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
2db80 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
2db90 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
2dba0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
2dbb0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
2dbc0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2dbd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2dbe0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2dbf0 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
2dc00 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
2dc10 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2dc20 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65   a single new re
2dc30 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74  gister for use t
2dc40 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65  o hold some inte
2dc50 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e  rmediate result.
2dc60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
2dc70 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
2dc80 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
2dc90 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2dca0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2dcb0 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
2dcc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2dcd0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2dce0 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  --pParse->nTempR
2dcf0 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  eg];.}../*.** De
2dd00 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73  allocate a regis
2dd10 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69  ter, making avai
2dd20 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20  lable for reuse 
2dd30 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  for some other.*
2dd40 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76 6f  * purpose..*/.vo
2dd50 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
2dd60 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
2dd70 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
2dd80 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
2dd90 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2dda0 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
2ddb0 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
2ddc0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65  .    pParse->aTe
2ddd0 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
2dde0 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67  empReg++] = iReg
2ddf0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2de00 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c  llocate or deall
2de10 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66  ocate a block of
2de20 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76   nReg consecutiv
2de30 65 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a  e registers..*/.
2de40 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
2de50 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
2de60 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29  Parse, int nReg)
2de70 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
2de80 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65  if( nReg==1 ) re
2de90 74 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54  turn sqlite3GetT
2dea0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2deb0 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52    i = pParse->iR
2dec0 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70  angeReg;.  n = p
2ded0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2dee0 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20  ;.  if( nReg<=n 
2def0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  ){.    pParse->i
2df00 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67  RangeReg += nReg
2df10 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  ;.    pParse->nR
2df20 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b  angeReg -= nReg;
2df30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20  .  }else{.    i 
2df40 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
2df50 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
2df60 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a  em += nReg;.  }.
2df70 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f    return i;.}.vo
2df80 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
2df90 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  eTempRange(Parse
2dfa0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
2dfb0 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
2dfc0 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a   if( nReg==1 ){.
2dfd0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
2dfe0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
2dff0 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74  , iReg);.    ret
2e000 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  urn;.  }.  if( n
2e010 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg>pParse->nRan
2e020 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61  geReg ){.    pPa
2e030 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2e040 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
2e050 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69  e->iRangeReg = i
2e060 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
2e070 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f  * Mark all tempo
2e080 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
2e090 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61  s being unavaila
2e0a0 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ble for reuse..*
2e0b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  /.void sqlite3Cl
2e0c0 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
2e0d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
2e0e0 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52    pParse->nTempR
2e0f0 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  eg = 0;.  pParse
2e100 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
2e110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61  .}../*.** Valida
2e120 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f  te that no tempo
2e130 72 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61  rary register fa
2e140 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72  lls within the r
2e150 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73  ange of.** iFirs
2e160 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73  t..iLast, inclus
2e170 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ive.  This routi
2e180 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20  ne is only call 
2e190 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65  from within asse
2e1a0 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  rt().** statemen
2e1b0 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ts..*/.#ifdef SQ
2e1c0 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73  LITE_DEBUG.int s
2e1d0 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52  qlite3NoTempsInR
2e1e0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
2e1f0 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20  se, int iFirst, 
2e200 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e  int iLast){.  in
2e210 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73  t i;.  if( pPars
2e220 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20  e->nRangeReg>0. 
2e230 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61    && pParse->iRa
2e240 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e  ngeReg+pParse->n
2e250 52 61 6e 67 65 52 65 67 20 3e 20 69 46 69 72 73  RangeReg > iFirs
2e260 74 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e  t.   && pParse->
2e270 69 52 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61  iRangeReg <= iLa
2e280 73 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74  st.  ){.     ret
2e290 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  urn 0;.  }.  for
2e2a0 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
2e2b0 6e 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a  nTempReg; i++){.
2e2c0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
2e2d0 61 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69  aTempReg[i]>=iFi
2e2e0 72 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61  rst && pParse->a
2e2f0 54 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73  TempReg[i]<=iLas
2e300 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
2e310 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
2e320 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
2e330 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
2e340 42 55 47 20 2a 2f 0a                             BUG */.