/ Hex Artifact Content
Login

Artifact a750629a0a14805485f8f39d7a72061a996e30e95dc084f1e4002be0b4d9ec18:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
0fd0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29  3ExprNNCollSeq()
0fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
0ff0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1000: 29 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65  ) works the same
1010: 20 65 78 61 63 74 20 74 68 61 74 20 69 74 20 72   exact that it r
1020: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65  eturns the.** de
1030: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1040: 69 66 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20  if pExpr has no 
1050: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
1060: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  n..**.** The col
1070: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1080: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
1090: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
10a0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
10b0: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
10c0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
10d0: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
10f0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
1100: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
1110: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
1120: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
1130: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
1140: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
1150: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1160: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1170: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1180: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1190: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
11b0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
11c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
11d0: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
11e0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
11f0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >op;.    if( p->
1200: 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72  flags & EP_Gener
1210: 69 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ic ) break;.    
1220: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
1230: 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  || op==TK_UPLUS 
1240: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  ){.      p = p->
1250: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f 6e  pLeft;.      con
1260: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1270: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   if( op==TK_COLL
1280: 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52  ATE || (op==TK_R
1290: 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 6f 70  EGISTER && p->op
12a0: 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 29 20 29  2==TK_COLLATE) )
12b0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
12c0: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
12d0: 71 28 70 50 61 72 73 65 2c 20 45 4e 43 28 64 62  q(pParse, ENC(db
12e0: 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  ), 0, p->u.zToke
12f0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1310: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1320: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1330: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  MN.          || 
1340: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
1350: 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45  || op==TK_TRIGGE
1360: 52 29 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 54  R).     && p->pT
1370: 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ab!=0.    ){.   
1380: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
1390: 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62  ISTER && p->pTab
13a0: 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e  !=0 happens when
13b0: 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69   pExpr was origi
13c0: 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61  nally.      ** a
13d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77   TK_COLUMN but w
13e0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76  as previously ev
13f0: 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68  aluated and cach
1400: 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
1410: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 20   */.      int j 
1420: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
1430: 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a      if( j>=0 ){.
1440: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1450: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70  ar *zColl = p->p
1460: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
1470: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  ll;.        pCol
1480: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
1490: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
14a0: 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20  b), zColl, 0);. 
14b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14d0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
14e0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
14f0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26   if( p->pLeft &&
1500: 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67   (p->pLeft->flag
1510: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
1520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20  =0 ){.        p 
1530: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
1540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1550: 20 45 78 70 72 20 2a 70 4e 65 78 74 20 20 3d 20   Expr *pNext  = 
1560: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1570: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
1580: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
1590: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
15a0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
15b0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
15c0: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
15d0: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
15e0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
15f0: 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20 68 6f 6c   /* p->flags hol
1600: 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65 20 61 6e  ds EP_Collate an
1610: 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  d p->pLeft->flag
1620: 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20 41 6e 64  s does not.  And
1630: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 78  .        ** p->x
1640: 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e 6f 74 2e  .pSelect cannot.
1650: 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e 70 4c 65    So if p->x.pLe
1660: 66 74 20 65 78 69 73 74 73 2c 20 69 74 20 6d 75  ft exists, it mu
1670: 73 74 20 68 6f 6c 64 20 61 74 0a 20 20 20 20 20  st hold at.     
1680: 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20     ** least one 
1690: 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54 68 75 73  EP_Collate. Thus
16a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
16b0: 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f 0a 20 20  wo ALWAYS. */.  
16c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 2e 70        if( p->x.p
16d0: 4c 69 73 74 21 3d 30 20 26 26 20 41 4c 57 41 59  List!=0 && ALWAY
16e0: 53 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  S(!ExprHasProper
16f0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
1700: 63 74 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ct)) ){.        
1710: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41     for(i=0; ALWA
1730: 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  YS(i<p->x.pList-
1740: 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a 20  >nExpr); i++){. 
1750: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 45             if( E
1760: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1770: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1780: 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61 74  pExpr, EP_Collat
1790: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
17a0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78      pNext = p->x
17b0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
17c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1800: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
1810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1820: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
1830: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1840: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
1850: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
1860: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
1870: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1880: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
1890: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
18a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18b0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
18c0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
18d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
18e0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
18f0: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
1900: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1910: 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f 6c 6c  .** defautl coll
1920: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
1930: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1950: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
1960: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1970: 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  q() routine work
1980: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
1990: 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72 65 74  t that it.** ret
19a0: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
19b0: 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64  re is no defined
19c0: 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 43   collation..*/.C
19d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
19e0: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50 61 72  xprNNCollSeq(Par
19f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1a00: 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c   *pExpr){.  Coll
1a10: 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Seq *p = sqlite3
1a20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1a30: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  se, pExpr);.  if
1a40: 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70 50 61  ( p==0 ) p = pPa
1a50: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1a60: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  ll;.  assert( p!
1a70: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
1a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a90: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 74 77  n TRUE if the tw
1aa0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 68 61  o expressions ha
1ab0: 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  ve equivalent co
1ac0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ad0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1ae0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63  3ExprCollSeqMatc
1af0: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
1b00: 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
1b10: 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c 53 65   *pE2){.  CollSe
1b20: 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71 6c 69  q *pColl1 = sqli
1b30: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b40: 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b 0a 20  (pParse, pE1);. 
1b50: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32   CollSeq *pColl2
1b60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
1b70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b80: 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  pE2);.  return s
1b90: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ba0: 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f  oll1->zName, pCo
1bb0: 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 3b 0a  ll2->zName)==0;.
1bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1bd0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
1be0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1bf0: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1c00: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1c10: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1c20: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1c30: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c40: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1c50: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1c60: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1c70: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1c80: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
1c90: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1ca0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
1cb0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
1cc0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
1cd0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1ce0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1cf0: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1d00: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1d10: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1d20: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1d30: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1d40: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1d50: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1d60: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1d70: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1d80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1d90: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1da0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
1db0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1dc0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
1dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1de0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1e00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1e10: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1e20: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1e30: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1e40: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1e50: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1e60: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1e70: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1e80: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1e90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1eb0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ec0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ed0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1ee0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1ef0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1f00: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1f10: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1f20: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1f30: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1f40: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1f50: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1f60: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1f70: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1f80: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1f90: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1fa0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1fb0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1fc0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1fd0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1fe0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1ff0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
2000: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
2010: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
2020: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
2030: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2040: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
2050: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
2060: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
2070: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
2080: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
2090: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
20a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
20b0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
20c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
20d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
20e0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
20f0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
2100: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
2110: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2120: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2130: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2140: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
2150: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2160: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
2170: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
2180: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
2190: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21a0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
21b0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
21c0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
21f0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
2200: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
2210: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
2220: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
2230: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
2240: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
2250: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
2260: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
2270: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
2280: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
2290: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
22a0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
22b0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
22c0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
22d0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
22e0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
22f0: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
2300: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
2310: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
2320: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
2330: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
2340: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
2350: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
2360: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
2370: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
2380: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
2390: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
23a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
23b0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
23c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
23d0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
23e0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
23f0: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2400: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2410: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2420: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2430: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2440: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2460: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2470: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2480: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
2490: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
24a0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
24b0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
24c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
24d0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
24e0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
24f0: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2500: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2510: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2520: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2530: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2540: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2550: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2560: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2570: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2580: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
2590: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
25a0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
25b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25c0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
25d0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
25e0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
25f0: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2600: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2610: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2620: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2630: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2640: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2650: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2660: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2670: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2680: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
2690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
26a0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
26b0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
26c0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
26d0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
26e0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
26f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2700: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2710: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2720: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2730: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2740: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2750: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2760: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2770: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2780: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
2790: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
27a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27b0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
27c0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
27d0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
27e0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
27f0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2800: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2810: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2820: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2830: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2840: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2850: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2860: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2870: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2880: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
2890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
28a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
28b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
28c0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
28d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
28e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
28f0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2900: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2910: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2920: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2940: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2950: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2960: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2970: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2980: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
2990: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
29a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
29b0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
29c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
29d0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
29e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
29f0: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2a00: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2a10: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2a20: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2a30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2a40: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2a50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2a70: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2a80: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
2a90: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
2aa0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
2ab0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
2ac0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
2ad0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
2ae0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2af0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2b00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2b10: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2b20: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2b30: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2b40: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2b50: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2b60: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2b70: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2b80: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
2b90: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
2ba0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2bb0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
2bc0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
2bd0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2c00: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2c10: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2c20: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2c30: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2c40: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2c60: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2c70: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2c80: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
2c90: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
2ca0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
2cb0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
2cc0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
2cd0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
2ce0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2cf0: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2d00: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2d10: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2d20: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2d30: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2d40: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2d50: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2d60: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2d70: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2d80: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
2d90: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
2da0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
2db0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
2dc0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
2dd0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
2de0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2e00: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2e10: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2e20: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2e30: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2e60: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2e70: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2e80: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2e90: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ea0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2eb0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ec0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ed0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2ee0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2ef0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2f00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2f10: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2f20: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2f30: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2f40: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2f50: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2f60: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2f70: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2f80: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2fb0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2fc0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2fd0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2fe0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2ff0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
3000: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
3010: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
3020: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
3030: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
3040: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
3050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3060: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
3070: 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70  bexpression of p
3080: 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74  Vector that is t
3090: 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d  he i-th.** colum
30a0: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
30b0: 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69  (numbered starti
30c0: 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65  ng with 0).  The
30d0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
30e0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73  ensure that i is
30f0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a   within range..*
3100: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3110: 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6c  is really a scal
3120: 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72 22  ar (and "scalar"
3130: 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20 73   here includes s
3140: 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68 61  ubqueries.** tha
3150: 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  t return a singl
3160: 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20  e column!) then 
3170: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20 75  return pVector u
3180: 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  nmodified..**.**
3190: 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e 73   pVector retains
31a0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
31b0: 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65 78  e returned subex
31c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
31d0: 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69 73  If the vector is
31e0: 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20   a (SELECT ...) 
31f0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
3200: 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73 0a  ion returned is.
3210: 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70 72  ** just the expr
3220: 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69  ession for the i
3230: 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
3240: 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
3250: 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65  may.** not be re
3260: 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ady for evaluati
3270: 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 74  on because the t
3280: 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73 20  able cursor has 
3290: 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
32a0: 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45  positioned..*/.E
32b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74  xpr *sqlite3Vect
32c0: 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45  orFieldSubexpr(E
32d0: 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e  xpr *pVector, in
32e0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
32f0: 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  i<sqlite3ExprVec
3300: 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29  torSize(pVector)
3310: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
3320: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56  3ExprIsVector(pV
3330: 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61 73  ector) ){.    as
3340: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f  sert( pVector->o
3350: 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72  p2==0 || pVector
3360: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
3370: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56 65  R );.    if( pVe
3380: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3390: 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e  ECT || pVector->
33a0: 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  op2==TK_SELECT )
33b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
33c0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
33d0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
33e0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
33f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
3400: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3410: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3420: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3430: 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  pVector;.}../*.*
3440: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
3450: 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20  turn a new Expr 
3460: 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65  object which whe
3470: 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73  n passed to.** s
3480: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
3490: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61   will generate a
34a0: 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64  ll necessary cod
34b0: 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  e to compute.** 
34c0: 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f  the iField-th co
34d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
34e0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56  or expression pV
34f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ector..**.** It 
3500: 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f  is ok for pVecto
3510: 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  r to be a scalar
3520: 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69   (as long as iFi
3530: 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e  eld==0).  .** In
3540: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
3550: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
3560: 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44  ike sqlite3ExprD
3570: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  up()..**.** The 
3580: 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20  caller owns the 
3590: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
35a0: 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70  ject and is resp
35b0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65  onsible for.** e
35c0: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
35d0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
35e0: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
35f0: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  freed..**.** The
3600: 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20   caller retains 
3610: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65  ownership of pVe
3620: 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f  ctor.  If pVecto
3630: 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54  r is a TK_SELECT
3640: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
3650: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77 69  turned object wi
3660: 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56 65  ll reference pVe
3670: 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63  ctor and so pVec
3680: 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a  tor must remain.
3690: 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ** valid for the
36a0: 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65 74   life of the ret
36b0: 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49  urned object.  I
36c0: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
36d0: 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61  K_VECTOR.** or a
36e0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
36f0: 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20  on, then it can 
3700: 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f  be deleted as so
3710: 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74 69  on as this routi
3720: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a  ne.** returns..*
3730: 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20  *.** A trick to 
3740: 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43  cause a TK_SELEC
3750: 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20  T pVector to be 
3760: 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72  deleted together
3770: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74   with.** the ret
3780: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3790: 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20 74  t is to attach t
37a0: 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68  he pVector to th
37b0: 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a  e pRight field.*
37c0: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
37d0: 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  d TK_SELECT_COLU
37e0: 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a  MN Expr object..
37f0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3800: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
3810: 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ld(.  Parse *pPa
3820: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3830: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3840: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3850: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
3860: 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20  ector.  List of 
3870: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61  expressions or a
3880: 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20   sub-SELECT */. 
3890: 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20   int iField     
38a0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
38b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
38c0: 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  tor to return */
38d0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74  .){.  Expr *pRet
38e0: 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d  ;.  if( pVector-
38f0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
3900: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  {.    assert( pV
3910: 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45  ector->flags & E
3920: 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20  P_xIsSelect );. 
3930: 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c     /* The TK_SEL
3940: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
3950: 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  node:.    **.   
3960: 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20   ** pLeft:      
3970: 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e       pVector con
3980: 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43  taining TK_SELEC
3990: 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e  T.  Not deleted.
39a0: 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20  .    ** pRight: 
39b0: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65           not use
39c0: 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76  d.  But recursiv
39d0: 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  ely deleted..   
39e0: 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20   ** iColumn:    
39f0: 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20       Index of a 
3a00: 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f  column in pVecto
3a10: 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a  r.    ** iTable:
3a20: 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20 74            0 or t
3a30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
3a40: 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53 20  umns on the LHS 
3a50: 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74  of an assignment
3a60: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
3a70: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
3a80: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
3a90: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3aa0: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3ab0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3ac0: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
3ad0: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
3ae0: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
3af0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
3b00: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
3b10: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3b20: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3b30: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3b40: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
3b50: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
3b60: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
3b70: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
3b80: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
3b90: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
3ba0: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3bb0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
3bc0: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
3bd0: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
3be0: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
3bf0: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
3c00: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3c10: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3c20: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3c30: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3c40: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3c50: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
3c60: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
3c70: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
3c80: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3c90: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3ca0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3cb0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
3cc0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Ret ){.      pRe
3cd0: 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69  t->iColumn = iFi
3ce0: 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  eld;.      pRet-
3cf0: 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72  >pLeft = pVector
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3d10: 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70  rt( pRet==0 || p
3d20: 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  Ret->iTable==0 )
3d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3d40: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
3d50: 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63  TK_VECTOR ) pVec
3d60: 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  tor = pVector->x
3d70: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
3d80: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65  ].pExpr;.    pRe
3d90: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
3da0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
3db0: 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a  Vector, 0);.  }.
3dc0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
3de0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f  ssion pExpr is o
3df0: 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54  f type TK_SELECT
3e00: 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
3e10: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69  to evaluate.** i
3e20: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  t. Return the re
3e30: 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20  gister in which 
3e40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
3e50: 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65  ored (or, if the
3e60: 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
3e70: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3e80: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  n one column, th
3e90: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3ea0: 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74  ray.** of regist
3eb0: 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65  ers in which the
3ec0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3ed0: 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  d)..**.** If pEx
3ee0: 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53  pr is not a TK_S
3ef0: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3f00: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
3f10: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
3f20: 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
3f30: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3f40: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
3f50: 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  eg = 0;.#ifndef 
3f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3f70: 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
3f80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3f90: 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c  ){.    reg = sql
3fa0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
3fb0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
3fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
3fd0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b  if.  return reg;
3fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
3ff0: 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74  nt pVector point
4000: 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78  s to a vector ex
4010: 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65  pression - eithe
4020: 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  r a TK_VECTOR.**
4030: 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68   or TK_SELECT th
4040: 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  at returns more 
4050: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e  than one column.
4060: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4070: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65  eturns.** the re
4080: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66  gister number of
4090: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
40a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
40b0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  lue of.** elemen
40c0: 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20  t iField of the 
40d0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  vector..**.** If
40e0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
40f0: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
4100: 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  on, then code fo
4110: 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a  r it must have .
4120: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4130: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
4140: 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73  the exprCodeSubs
4150: 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e  elect() routine.
4160: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
4170: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65   parameter regSe
4180: 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74  lect should be t
4190: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
41a0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
41b0: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s.** containing 
41c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
41d0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a  he sub-select. .
41e0: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
41f0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
4200: 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65  ECTOR, then code
4210: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
4220: 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67  ed field.** is g
4230: 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69  enerated. In thi
4240: 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65  s case (*pRegFre
4250: 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  e) may be set to
4260: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
4270: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  * a temporary re
4280: 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65  gister to be fre
4290: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
42a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
42b0: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
42c0: 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75  returning, outpu
42d0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70  t parameter (*pp
42e0: 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20  Expr) is set to 
42f0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4300: 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72  Expr object corr
4310: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65  esponding to ele
4320: 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68  ment iElem of th
4330: 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61  e vector..*/.sta
4340: 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74  tic int exprVect
4350: 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  orRegister(.  Pa
4360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
4390: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
43a0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
43b0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f      /* Vector to
43c0: 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74   extract element
43d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
43e0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4400: 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66  eld to extract f
4410: 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20  rom pVector */. 
4420: 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20   int regSelect, 
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
4450: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4460: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
4470: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
4480: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70       /* OUT: Exp
4490: 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20  ression element 
44a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72  */.  int *pRegFr
44b0: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
44c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d       /* OUT: Tem
44d0: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
44e0: 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70  ee */.){.  u8 op
44f0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a   = pVector->op;.
4500: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
4510: 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54  _VECTOR || op==T
4520: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70  K_REGISTER || op
4530: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
4540: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
4550: 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45  STER ){.    *ppE
4560: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63  xpr = sqlite3Vec
4570: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
4580: 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29  pVector, iField)
4590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 65  ;.    return pVe
45a0: 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69  ctor->iTable+iFi
45b0: 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  eld;.  }.  if( o
45c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
45d0: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56      *ppExpr = pV
45e0: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
45f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65  ->pEList->a[iFie
4600: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ld].pExpr;.     
4610: 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74  return regSelect
4620: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a  +iField;.  }.  *
4630: 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72  ppExpr = pVector
4640: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
4650: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65  eld].pExpr;.  re
4660: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
4670: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
4680: 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72   *ppExpr, pRegFr
4690: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ee);.}../*.** Ex
46a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
46b0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  s a comparison b
46c0: 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f  etween two vecto
46d0: 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74  r values. Comput
46e0: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
46f0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4700: 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c  n (1, 0, or NULL
4710: 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  ) and write that
4720: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  .** result into 
4730: 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a  register dest..*
4740: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4750: 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65  must satisfy the
4760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f   following preco
4770: 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  nditions:.**.** 
4780: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
4790: 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d  =TK_IS:      op=
47a0: 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53  =TK_EQ and p5==S
47b0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
47c0: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
47d0: 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d  =TK_ISNOT:   op=
47e0: 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53  =TK_NE and p5==S
47f0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
4800: 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20     otherwise:   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d               op=
4820: 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70  =pExpr->op and p
4830: 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76  5==0.*/.static v
4840: 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f  oid codeVectorCo
4850: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
4860: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
4870: 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  * Code generator
4880: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4890: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
48a0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
48b0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
48c0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
48d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
48e0: 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
48f0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4900: 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20  /.  u8 op,      
4910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
4920: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4930: 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
4940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4950: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20  QLITE_NULLEQ or 
4960: 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  zero */.){.  Vdb
4970: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4980: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c  Vdbe;.  Expr *pL
4990: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
49a0: 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft;.  Expr *pRig
49b0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
49c0: 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20  ht;.  int nLeft 
49d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
49e0: 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
49f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4a00: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e  egLeft = 0;.  in
4a10: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
4a20: 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20    u8 opx = op;. 
4a30: 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20   int addrDone = 
4a40: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4a50: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  abel(v);..  if( 
4a60: 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45 78  nLeft!=sqlite3Ex
4a70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69  prVectorSize(pRi
4a80: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
4a90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4aa0: 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
4ab0: 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72 65  isused");.    re
4ac0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4ad0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
4ae0: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
4af0: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
4b20: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20  p==TK_ISNOT .   
4b30: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72  ==TK_LT || pExpr
4b50: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20  ->op==TK_GT .   
4b60: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b70: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72  ==TK_LE || pExpr
4b80: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29  ->op==TK_GE .  )
4b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
4ba0: 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45  r->op==op || (pE
4bb0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26  xpr->op==TK_IS &
4bc0: 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20  & op==TK_EQ).   
4bd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78           || (pEx
4be0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
4bf0: 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29   && op==TK_NE) )
4c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c10: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d  0 || pExpr->op!=
4c20: 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  op );.  assert( 
4c30: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
4c40: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
4c50: 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53  op );..  p5 |= S
4c60: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20  QLITE_STOREP2;. 
4c70: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20   if( opx==TK_LE 
4c80: 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20  ) opx = TK_LT;. 
4c90: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20   if( opx==TK_GE 
4ca0: 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a  ) opx = TK_GT;..
4cb0: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4cc0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4cd0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4ce0: 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43  regRight = exprC
4cf0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
4d00: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20  rse, pRight);.. 
4d10: 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f   for(i=0; 1 /*Lo
4d20: 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65  op exits by "bre
4d30: 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20  ak"*/; i++){.   
4d40: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
4d50: 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  0, regFree2 = 0;
4d60: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a  .    Expr *pL, *
4d70: 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c  pR; .    int r1,
4d80: 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28   r2;.    assert(
4d90: 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74   i>=0 && i<nLeft
4da0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20   );.    if( i>0 
4db0: 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  ) sqlite3ExprCac
4dc0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
4dd0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4de0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4df0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4e00: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e10: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e20: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e30: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e40: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e50: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e60: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e70: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e80: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e90: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4ea0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4eb0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4ec0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ed0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ee0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ef0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f00: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f10: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f20: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f30: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f40: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f50: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f60: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f70: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f80: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f90: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4fa0: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fb0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fc0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fd0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fe0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4ff0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5000: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5010: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5020: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5030: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5040: 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70  i>0 ) sqlite3Exp
5050: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
5060: 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c  );.    if( i==nL
5070: 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62  eft-1 ){.      b
5080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5090: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29  if( opx==TK_EQ )
50a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
50b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
50c0: 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64  IfNot, dest, add
50d0: 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65  rDone); VdbeCove
50e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70  rage(v);.      p
50f0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
5100: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
5110: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29  if( opx==TK_NE )
5120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5130: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5140: 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f  If, dest, addrDo
5150: 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ne); VdbeCoverag
5160: 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c  e(v);.      p5 |
5170: 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  = SQLITE_KEEPNUL
5180: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
5190: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
51a0: 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  TK_LT || op==TK_
51b0: 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20  GT || op==TK_LE 
51c0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  || op==TK_GE );.
51d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c  eAddOp2(v, OP_El
51f0: 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72  seNotEq, 0, addr
5200: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  Done);.      Vdb
5210: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
5220: 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20  p==TK_LT);.     
5230: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
5240: 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20  v, op==TK_GT);. 
5250: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5260: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45  eIf(v, op==TK_LE
5270: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5280: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
5290: 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28  K_GE);.      if(
52a0: 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70   i==nLeft-2 ) op
52b0: 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  x = op;.    }.  
52c0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
52d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
52e0: 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66  ddrDone);.}..#if
52f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
5300: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
5310: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
5320: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
5330: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
5340: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
5350: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
5360: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
5370: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
5380: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5390: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
53a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
53b0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
53c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
53d0: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
53e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
53f0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
5400: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
5410: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5420: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
5430: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
5440: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
5450: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5460: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
5470: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
5480: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
5490: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
54a0: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
54b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
54c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
54d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
54e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
54f0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
5500: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
5510: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
5520: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
5530: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
5540: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
5550: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
5560: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
5570: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
5580: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
5590: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
55a0: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
55b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
55c0: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
55d0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
55e0: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
55f0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
5600: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
5610: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
5620: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
5630: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
5640: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
5650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5660: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
5670: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5680: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5690: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
56a0: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
56b0: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
56c0: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
56d0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
56e0: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
56f0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
5700: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5710: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5720: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
5730: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
5740: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
5750: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
5760: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
5770: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
5780: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5790: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
57a0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20  t *pSelect, int 
57b0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65  *pnHeight){.  Se
57c0: 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70  lect *p;.  for(p
57d0: 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70  =pSelect; p; p=p
57e0: 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68  ->pPrior){.    h
57f0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5800: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
5810: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5820: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
5830: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5840: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5850: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
5860: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5870: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
5880: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5890: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
58a0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
58b0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
58c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
58d0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
58e0: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
58f0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
5900: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
5910: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
5920: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
5930: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
5940: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
5950: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
5960: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
5970: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
5980: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
5990: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
59a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
59b0: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
59c0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
59d0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
59e0: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
59f0: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
5a00: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
5a10: 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67  pagate EP_Propag
5a20: 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f  ate flags up fro
5a30: 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74  m Expr.x.pList t
5a40: 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a  o Expr.flags,.**
5a50: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
5a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a70: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
5a80: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
5a90: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5aa0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
5ab0: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
5ac0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5ad0: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
5ae0: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
5af0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5b00: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5b10: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
5b20: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
5b30: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
5b40: 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74  e if( p->x.pList
5b50: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
5b60: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
5b70: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
5b80: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20      p->flags |= 
5b90: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73  EP_Propagate & s
5ba0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
5bb0: 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  ags(p->x.pList);
5bc0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
5bd0: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
5be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
5bf0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
5c00: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
5c10: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
5c20: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
5c30: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
5c40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
5c50: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
5c60: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
5c70: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
5c80: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
5c90: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61  **.** Also propa
5ca0: 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70  gate all EP_Prop
5cb0: 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d  agate flags from
5cc0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
5cd0: 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66  t into.** Expr.f
5ce0: 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  lags. .*/.void s
5cf0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
5d00: 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73  ghtAndFlags(Pars
5d10: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
5d20: 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  *p){.  if( pPars
5d30: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
5d40: 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68  ;.  exprSetHeigh
5d50: 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t(p);.  sqlite3E
5d60: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
5d70: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
5d80: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
5d90: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
5da0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78  height of any ex
5db0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
5dc0: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74  ferenced.** by t
5dd0: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
5de0: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
5df0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
5e00: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  t sqlite3SelectE
5e10: 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74  xprHeight(Select
5e20: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5e30: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5e40: 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48  tOfSelect(p, &nH
5e50: 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e  eight);.  return
5e60: 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73   nHeight;.}.#els
5e70: 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69  e /* ABOVE:  Hei
5e80: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
5e90: 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a  enabled.  BELOW:
5ea0: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
5eb0: 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a  ent off */./*.**
5ec0: 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   Propagate all E
5ed0: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
5ee0: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
5ef0: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
5f00: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
5f10: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5f20: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
5f30: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
5f40: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5f50: 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74   p && p->x.pList
5f60: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
5f70: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
5f80: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  lect) ){.    p->
5f90: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
5fa0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
5fb0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
5fc0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  x.pList);.  }.}.
5fd0: 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48  #define exprSetH
5fe0: 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20  eight(y).#endif 
5ff0: 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  /* SQLITE_MAX_EX
6000: 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f  PR_DEPTH>0 */../
6010: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6020: 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c  e is the core al
6030: 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72  locator for Expr
6040: 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f   nodes..**.** Co
6050: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
6060: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
6070: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
6080: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
6090: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
60a0: 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  de and for the p
60b0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69  Token argument i
60c0: 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  s a single alloc
60d0: 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65  ation.** obtaine
60e0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
60f0: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
6100: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
6110: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
6120: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
6130: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
6140: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
6150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ..**.** If dequo
6160: 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
6170: 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69   the token (if i
6180: 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71  t exists) is deq
6190: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71  uoted..** If deq
61a0: 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e  uote is false, n
61b0: 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70  o dequoting is p
61c0: 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64  erformed.  The d
61d0: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
61e0: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
61f0: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
6200: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
6210: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
6220: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
6230: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
6240: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
6250: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
6260: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
6270: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
6280: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
6290: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
62a0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
62b0: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
62c0: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
62d0: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
62e0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
62f0: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
6300: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
6310: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
6320: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
6330: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
6340: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
6350: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
6360: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
6370: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
6380: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
6390: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
63a0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
63b0: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
63c0: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
63d0: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
63e0: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
63f0: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
6400: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
6410: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
6420: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
6430: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
6440: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6450: 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74  RawNN() */.  int
6460: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6470: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6480: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
6490: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
64a0: 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  en,    /* Token 
64b0: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
64c0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
64d0: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
64e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
64f0: 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20   dequote */.){. 
6500: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
6510: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
6520: 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b   int iValue = 0;
6530: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
6540: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
6550: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21  n ){.    if( op!
6560: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70  =TK_INTEGER || p
6570: 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20  Token->z==0.    
6580: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
6590: 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d  GetInt32(pToken-
65a0: 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20  >z, &iValue)==0 
65b0: 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  ){.      nExtra 
65c0: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20  = pToken->n+1;. 
65d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61       assert( iVa
65e0: 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  lue>=0 );.    }.
65f0: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c    }.  pNew = sql
6600: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
6610: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
6620: 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66  r)+nExtra);.  if
6630: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65  ( pNew ){.    me
6640: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
6650: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20  zeof(Expr));.   
6660: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
6670: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
6680: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
6690: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
66a0: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
66b0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
66c0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
66d0: 61 6c 75 65 7c 45 50 5f 4c 65 61 66 3b 0a 20 20  alue|EP_Leaf;.  
66e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
66f0: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
6700: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6710: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6720: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  en = (char*)&pNe
6730: 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  w[1];.        as
6740: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
6750: 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d  =0 || pToken->n=
6760: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
6770: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65  ( pToken->n ) me
6780: 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  mcpy(pNew->u.zTo
6790: 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ken, pToken->z, 
67a0: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
67b0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
67c0: 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20  en[pToken->n] = 
67d0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  0;.        if( d
67e0: 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65  equote && sqlite
67f0: 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Isquote(pNew->u
6800: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
6810: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
6820: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  w->u.zToken[0]==
6830: 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67  '"' ) pNew->flag
6840: 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65  s |= EP_DblQuote
6850: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  d;.          sql
6860: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
6870: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
6880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6890: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
68a0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
68b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  .    pNew->nHeig
68c0: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
68d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
68e0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
68f0: 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  ocate a new expr
6900: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d  ession node from
6910: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
6920: 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  ed token that ha
6930: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65  s.** already bee
6940: 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45  n dequoted..*/.E
6950: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
6960: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
6980: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
6990: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
69a0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
69b0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
69c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
69d0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
69e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
69f0: 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20  *zToken      /* 
6a00: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
6a10: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6a20: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a  /.){.  Token x;.
6a30: 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a    x.z = zToken;.
6a40: 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    x.n = sqlite3S
6a50: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 3b  trlen30(zToken);
6a60: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
6a70: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f  3ExprAlloc(db, o
6a80: 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  p, &x, 0);.}../*
6a90: 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74 72  .** Attach subtr
6aa0: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
6ab0: 69 67 68 74 20 74 6f 20 74 68 65 20 45 78 70 72  ight to the Expr
6ac0: 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a   node pRoot..**.
6ad0: 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c  ** If pRoot==NUL
6ae0: 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  L that means tha
6af0: 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  t a memory alloc
6b00: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
6b10: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20  occurred..** In 
6b20: 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74  that case, delet
6b30: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 70  e the subtrees p
6b40: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
6b50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6b60: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
6b70: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  es(.  sqlite3 *d
6b80: 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74  b,.  Expr *pRoot
6b90: 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  ,.  Expr *pLeft,
6ba0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a  .  Expr *pRight.
6bb0: 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d  ){.  if( pRoot==
6bc0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
6bd0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6be0: 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
6bf0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
6c00: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
6c10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
6c20: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
6c30: 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  e{.    if( pRigh
6c40: 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  t ){.      pRoot
6c50: 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68  ->pRight = pRigh
6c60: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6c70: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6c80: 61 67 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e  agate & pRight->
6c90: 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20  flags;.    }.   
6ca0: 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20   if( pLeft ){.  
6cb0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74      pRoot->pLeft
6cc0: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
6cd0: 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pRoot->flags |= 
6ce0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70  EP_Propagate & p
6cf0: 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Left->flags;.   
6d00: 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65   }.    exprSetHe
6d10: 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d  ight(pRoot);.  }
6d20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
6d30: 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20  te an Expr node 
6d40: 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d  which joins as m
6d50: 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72  any as two subtr
6d60: 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f  ees..**.** One o
6d70: 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75  r both of the su
6d80: 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55  btrees can be NU
6d90: 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  LL.  Return a po
6da0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
6db0: 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  .** Expr node.  
6dc0: 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  Or, if an OOM er
6dd0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
6de0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
6df0: 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65  ocFailed,.** fre
6e00: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61  e the subtrees a
6e10: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
6e20: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6e30: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
6e40: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
6e50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6e60: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
6e90: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
6ea0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
6eb0: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
6ec0: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
6ed0: 69 67 68 74 20 20 20 20 20 20 20 20 20 20 20 20  ight            
6ee0: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
6ef0: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
6f00: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
6f10: 4e 44 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45  ND && pParse->nE
6f20: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  rr==0 ){.    /* 
6f30: 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  Take advantage o
6f40: 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20  f short-circuit 
6f50: 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  false optimizati
6f60: 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20  on for AND */.  
6f70: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
6f80: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
6f90: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
6fa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
6fb0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6fc0: 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64  cRawNN(pParse->d
6fd0: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
6fe0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
6ff0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
7000: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
7010: 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f  .      p->op = o
7020: 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a  p & TKFLG_MASK;.
7030: 20 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d 20        p->iAgg = 
7040: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  -1;.    }.    sq
7050: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
7060: 75 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e  ubtrees(pParse->
7070: 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52  db, p, pLeft, pR
7080: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ight);.  }.  if(
7090: 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74   p ) {.    sqlit
70a0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
70b0: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
70c0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ight);.  }.  ret
70d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
70e0: 41 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74  Add pSelect to t
70f0: 68 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  he Expr.x.pSelec
7100: 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66  t field.  Or, if
7110: 20 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28   pExpr is NULL (
7120: 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f  due.** do a memo
7130: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
7140: 69 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65  ilure) then dele
7150: 74 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f  te the pSelect o
7160: 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
7170: 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
7180: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
7190: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
71a0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
71b0: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  ){.  if( pExpr )
71c0: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70  {.    pExpr->x.p
71d0: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
71e0: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  ;.    ExprSetPro
71f0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7200: 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62  xIsSelect|EP_Sub
7210: 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  query);.    sqli
7220: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
7230: 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c  AndFlags(pParse,
7240: 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65   pExpr);.  }else
7250: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7260: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
7270: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
7280: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
7290: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
72a0: 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  elect);.  }.}...
72b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
72c0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
72d0: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
72e0: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
72f0: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
7300: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
7310: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
7320: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
7330: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
7340: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
7350: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
7360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
7370: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
7380: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
7390: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
73a0: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
73b0: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
73c0: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
73d0: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
73e0: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
73f0: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
7400: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
7410: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
7420: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
7430: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
7440: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
7450: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
7460: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
7470: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
7480: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
7490: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
74a0: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
74b0: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
74c0: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
74d0: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
74e0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
74f0: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
7500: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
7510: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
7520: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
7530: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
7540: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
7550: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
7560: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
7570: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
7580: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
7590: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
75a0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
75b0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
75c0: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
75d0: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
75e0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
75f0: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
7600: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7610: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
7620: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7630: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
7640: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
7650: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
7660: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
7670: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
7680: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
7690: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
76a0: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
76b0: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
76c0: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
76d0: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
76e0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
76f0: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
7700: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
7710: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
7720: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
7730: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
7740: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
7750: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
7760: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
7770: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
7780: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
7790: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
77a0: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
77b0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
77c0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
77d0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
77e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
77f0: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
7800: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
7810: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
7820: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
7830: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
7840: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
7850: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
7860: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
7870: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7880: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
7890: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
78a0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
78b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
78c0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
78d0: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
78e0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
78f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
7900: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
7910: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7920: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
7930: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
7940: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
7950: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
7960: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
7970: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
7980: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
7990: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
79a0: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
79b0: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
79c0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
79d0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
79e0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  xprFunction(Pars
79f0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
7a00: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
7a10: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
7a20: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69  pr *pNew;.  sqli
7a30: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7a40: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
7a50: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
7a60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
7a70: 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54  loc(db, TK_FUNCT
7a80: 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b  ION, pToken, 1);
7a90: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
7aa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
7ab0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
7ac0: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
7ad0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65   memory leak whe
7ae0: 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  n malloc fails *
7af0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
7b00: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c    }.  pNew->x.pL
7b10: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45  ist = pList;.  E
7b20: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
7b30: 4e 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29  New, EP_HasFunc)
7b40: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
7b50: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7b60: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
7b70: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
7b80: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
7b90: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
7ba0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
7bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
7bc0: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
7bd0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
7be0: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
7bf0: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
7c00: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
7c10: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
7c20: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7c30: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
7c40: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
7c50: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
7c60: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
7c70: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
7c80: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7c90: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
7ca0: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
7cb0: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
7cc0: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
7cd0: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
7ce0: 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69 64  too big to avoid
7cf0: 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72   a denial of ser
7d00: 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e  vice attack when
7d10: 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74  .** the SQL stat
7d20: 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d  ement comes from
7d30: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75   an external sou
7d40: 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  rce..**.** Wildc
7d50: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
7d60: 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c   ":aaa", "@aaa",
7d70: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
7d80: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
7d90: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
7da0: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
7db0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
7dc0: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
7dd0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
7de0: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
7df0: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
7e00: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7e10: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
7e20: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
7e30: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
7e40: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
7e50: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
7e60: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
7e70: 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c  r, u32 n){.  sql
7e80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7e90: 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e->db;.  const c
7ea0: 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20  har *z;.  ynVar 
7eb0: 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  x;..  if( pExpr=
7ec0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
7ed0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
7ee0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
7ef0: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
7f00: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
7f10: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
7f20: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
7f30: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
7f40: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
7f50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
7f60: 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33 53 74  ==(u32)sqlite3St
7f70: 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69  rlen30(z) );.  i
7f80: 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20  f( z[1]==0 ){.  
7f90: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
7fa0: 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20   the form "?".  
7fb0: 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20  Assign the next 
7fc0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7fd0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  */.    assert( z
7fe0: 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20  [0]=='?' );.    
7ff0: 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  x = (ynVar)(++pP
8000: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d  arse->nVar);.  }
8010: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f  else{.    int do
8020: 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Add = 0;.    if(
8030: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
8040: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
8050: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
8060: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
8070: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
8080: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
8090: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
80a0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
80b0: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
80c0: 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20    int bOk;.     
80d0: 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f   if( n==2 ){ /*O
80e0: 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54  PTIMIZATION-IF-T
80f0: 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20 69 20  RUE*/.        i 
8100: 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20  = z[1]-'0';  /* 
8110: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
8120: 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67  of ?N for a sing
8130: 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20  le digit N */.  
8140: 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20        bOk = 1;. 
8150: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8160: 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c      bOk = 0==sql
8170: 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d  ite3Atoi64(&z[1]
8180: 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54  , &i, n-1, SQLIT
8190: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d  E_UTF8);.      }
81a0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
81b0: 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74   i==0 );.      t
81c0: 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b  estcase( i==1 );
81d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
81e0: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
81f0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8200: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29  ABLE_NUMBER]-1 )
8210: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8220: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
8230: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
8240: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b  IABLE_NUMBER] );
8250: 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d  .      if( bOk==
8260: 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62  0 || i<1 || i>db
8270: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8280: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
8290: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
82a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
82b0: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
82c0: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
82d0: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
82e0: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
82f0: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53      db->aLimit[S
8300: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8310: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20  ABLE_NUMBER]);. 
8320: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
8330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78 20 3d       }.      x =
8340: 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20   (ynVar)i;.     
8350: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
8360: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Var ){.        p
8370: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69  Parse->nVar = (i
8380: 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20 64 6f  nt)x;.        do
8390: 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Add = 1;.      }
83a0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
83b0: 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70  VListNumToName(p
83c0: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78  Parse->pVList, x
83d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
83e0: 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20  doAdd = 1;.     
83f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8400: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73      /* Wildcards
8410: 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24   like ":aaa", "$
8420: 61 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20  aaa" or "@aaa". 
8430: 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   Reuse the same 
8440: 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
8450: 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  * number as the 
8460: 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65  prior appearance
8470: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
8480: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  e, or if the nam
8490: 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  e.      ** has n
84a0: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
84b0: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
84c0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
84d0: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mber.      */.  
84e0: 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 73      x = (ynVar)s
84f0: 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d 65 54  qlite3VListNameT
8500: 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c  oNum(pParse->pVL
8510: 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  ist, z, n);.    
8520: 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20    if( x==0 ){.  
8530: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
8540: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
8550: 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64  );.        doAdd
8560: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
8570: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 41 64    }.    if( doAd
8580: 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  d ){.      pPars
8590: 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71 6c 69  e->pVList = sqli
85a0: 74 65 33 56 4c 69 73 74 41 64 64 28 64 62 2c 20  te3VListAdd(db, 
85b0: 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20  pParse->pVList, 
85c0: 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a  z, n, x);.    }.
85d0: 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f    }.  pExpr->iCo
85e0: 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20  lumn = x;.  if( 
85f0: 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  x>db->aLimit[SQL
8600: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
8610: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
8620: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8630: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8640: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
8650: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
8660: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
8670: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
8680: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  on tree..*/.stat
8690: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
86a0: 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  NE void sqlite3E
86b0: 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69  xprDeleteNN(sqli
86c0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
86d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
86e0: 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  0 );.  /* Sanity
86f0: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
8700: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
8710: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
8720: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
8730: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
8740: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8750: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
8760: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
8770: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8780: 45 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48  EBUG.  if( ExprH
8790: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
87a0: 5f 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48  _Leaf) && !ExprH
87b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
87c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
87d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
87e0: 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  eft==0 );.    as
87f0: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
8800: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
8810: 28 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d  ( p->x.pSelect==
8820: 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0 );.  }.#endif.
8830: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
8840: 6f 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f  operty(p, (EP_To
8850: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
8860: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
8870: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
8880: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
8890: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
88a0: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
88b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70    assert( p->x.p
88c0: 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  List==0 || p->pR
88d0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ight==0 );.    i
88e0: 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70  f( p->pLeft && p
88f0: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op!=TK_SELECT_
8900: 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33  COLUMN ) sqlite3
8910: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8920: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20   p->pLeft);.    
8930: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b  if( p->pRight ){
8940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
8950: 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70  prDeleteNN(db, p
8960: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
8970: 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73  else if( ExprHas
8980: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
8990: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
89a0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
89b0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
89c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
89d0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
89e0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
89f0: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
8a00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8a10: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8a20: 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  y(p, EP_MemToken
8a30: 29 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  ) ) sqlite3DbFre
8a40: 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e(db, p->u.zToke
8a50: 6e 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  n);.  if( !ExprH
8a60: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8a70: 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  _Static) ){.    
8a80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
8a90: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  db, p);.  }.}.vo
8aa0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
8ab0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
8ac0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
8ad0: 28 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70  ( p ) sqlite3Exp
8ae0: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29  rDeleteNN(db, p)
8af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8b00: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8b10: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
8b20: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
8b30: 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  on structure .**
8b40: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
8b50: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
8b60: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  his is always on
8b70: 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49  e of EXPR_FULLSI
8b80: 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55  ZE,.** EXPR_REDU
8b90: 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f  CEDSIZE or EXPR_
8ba0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a  TOKENONLYSIZE..*
8bb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
8bc0: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
8bd0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
8be0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8bf0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72  P_TokenOnly) ) r
8c00: 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e  eturn EXPR_TOKEN
8c10: 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20  ONLYSIZE;.  if( 
8c20: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8c30: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  p, EP_Reduced) )
8c40: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44   return EXPR_RED
8c50: 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75  UCEDSIZE;.  retu
8c60: 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  rn EXPR_FULLSIZE
8c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
8c80: 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20  upedExpr*Size() 
8c90: 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65  routines each re
8ca0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8cb0: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
8cc0: 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20  d.** to store a 
8cd0: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
8ce0: 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73  ssion or express
8cf0: 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20  ion tree.  They 
8d00: 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77  differ in.** how
8d10: 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65   much of the tre
8d20: 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a  e is measured..*
8d30: 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  *.**     dupedEx
8d40: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20  prStructSize()  
8d50: 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20     Size of only 
8d60: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
8d70: 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  re .**     duped
8d80: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20  ExprNodeSize()  
8d90: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70       Size of Exp
8da0: 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f  r + space for to
8db0: 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  ken.**     duped
8dc0: 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20  ExprSize()      
8dd0: 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65       Expr + toke
8de0: 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70  n + subtree comp
8df0: 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  onents.**.******
8e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e40: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
8e50: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
8e60: 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72  ize() function r
8e70: 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65  eturns two value
8e80: 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72  s OR-ed together
8e90: 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73  :  .** (1) the s
8ea0: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
8eb0: 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  r a copy of the 
8ec0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f  Expr structure o
8ed0: 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20  nly and .** (2) 
8ee0: 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73  the EP_xxx flags
8ef0: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77   that indicate w
8f00: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
8f10: 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  e size should be
8f20: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
8f30: 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73  values is always
8f40: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
8f50: 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a      EXPR_FULLSIZ
8f60: 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52  E.**      EXPR_R
8f70: 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45  EDUCEDSIZE   | E
8f80: 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20  P_Reduced.**    
8f90: 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59    EXPR_TOKENONLY
8fa0: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
8fb0: 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  nly.**.** The si
8fc0: 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ze of the struct
8fd0: 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ure can be found
8fe0: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20   by masking the 
8ff0: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
9000: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
9010: 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65  with 0xfff.  The
9020: 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f   flags can be fo
9030: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
9040: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
9050: 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63  ue with EP_Reduc
9060: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e  ed|EP_TokenOnly.
9070: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
9080: 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50   with flags==EXP
9090: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69  RDUP_REDUCE, thi
90a0: 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73  s routines works
90b0: 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a   on full-size.**
90c0: 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70   (unreduced) Exp
90d0: 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65  r objects as the
90e0: 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20  y or originally 
90f0: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
9100: 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75  he parser..** Du
9110: 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  ring expression 
9120: 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20  analysis, extra 
9130: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63  information is c
9140: 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65  omputed and move
9150: 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20  d into.** later 
9160: 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70  parts of teh Exp
9170: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  r object and tha
9180: 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  t extra informat
9190: 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68  ion might get ch
91a0: 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20  opped.** off if 
91b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
91c0: 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65  s reduced.  Note
91d0: 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f   also that it do
91e0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a  es not work to.*
91f0: 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55  * make an EXPRDU
9200: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
9210: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
9220: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
9230: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
9240: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
9250: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
9260: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
9270: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
9280: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
9290: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
92a0: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
92b0: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
92c0: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
92d0: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
92e0: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
92f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
9300: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
9310: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
9320: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
9330: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
9340: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
9350: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
9360: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
9370: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
9380: 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  owed */.  assert
9390: 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c  ( EXPR_FULLSIZE<
93a0: 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65  =0xfff );.  asse
93b0: 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50  rt( (0xfff & (EP
93c0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
93d0: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
93e0: 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20  if( 0==flags || 
93f0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
9400: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6e  _COLUMN ){.    n
9410: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
9420: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
9430: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9440: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9450: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
9460: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
9470: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9480: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
9490: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
94a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
94b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
94c0: 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20  emToken) );.    
94d0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
94e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
94f0: 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20  oReduce) );.    
9500: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20  if( p->pLeft || 
9510: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
9520: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
9530: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45  _REDUCEDSIZE | E
9540: 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d  P_Reduced;.    }
9550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
9560: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
9570: 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   );.      nSize 
9580: 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  = EXPR_TOKENONLY
9590: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
95a0: 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nly;.    }.  }. 
95b0: 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d   return nSize;.}
95c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
95d0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
95e0: 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  e space in bytes
95f0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
9600: 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20  re the copy .** 
9610: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
9620: 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79  cture and a copy
9630: 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a   of the Expr.u.z
9640: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
9650: 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20   that.** string 
9660: 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a  is defined.).*/.
9670: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
9680: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70  ExprNodeSize(Exp
9690: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
96a0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
96b0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
96c0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20  ize(p, flags) & 
96d0: 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78  0xfff;.  if( !Ex
96e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
96f0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9700: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9710: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
9720: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
9730: 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d  u.zToken)+1;.  }
9740: 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
9750: 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (nByte);.}../*.*
9760: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
9770: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
9780: 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20  uired to create 
9790: 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74  a duplicate of t
97a0: 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  he .** expressio
97b0: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
97c0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
97d0: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
97e0: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b  ent is a.** mask
97f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52   containing EXPR
9800: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
9810: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
9820: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
9830: 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65   space to create
9840: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
9850: 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74  xpr struct.** it
9860: 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66  self and the buf
9870: 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20  fer referred to 
9880: 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  by Expr.u.zToken
9890: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  , if any..**.** 
98a0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
98b0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
98c0: 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  t, then the retu
98d0: 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65  rn value include
98e0: 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64  s .** space to d
98f0: 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70  uplicate all Exp
9900: 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74  r nodes in the t
9910: 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78  ree formed by Ex
9920: 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64  pr.pLeft .** and
9930: 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72   Expr.pRight var
9940: 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20  iables (but not 
9950: 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72  for any structur
9960: 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72  es pointed to or
9970: 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66   .** descended f
9980: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
9990: 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70  List or Expr.x.p
99a0: 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73  Select variables
99b0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
99c0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45   dupedExprSize(E
99d0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
99e0: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
99f0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
9a00: 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65      nByte = dupe
9a10: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
9a20: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
9a30: 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52   flags&EXPRDUP_R
9a40: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e  EDUCE ){.      n
9a50: 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70  Byte += dupedExp
9a60: 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20  rSize(p->pLeft, 
9a70: 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78  flags) + dupedEx
9a80: 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74  prSize(p->pRight
9a90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
9aa0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79    }.  return nBy
9ab0: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  te;.}../*.** Thi
9ac0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
9ad0: 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
9ae0: 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70  ExprDup(), excep
9af0: 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66  t that if pzBuff
9b00: 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55  er .** is not NU
9b10: 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65  LL then *pzBuffe
9b20: 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
9b30: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
9b40: 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a  r large enough .
9b50: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ** to store the 
9b60: 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
9b70: 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73  on p, the copies
9b80: 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a   of p->u.zToken.
9b90: 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c  ** (if applicabl
9ba0: 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69  e), and the copi
9bb0: 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65  es of the p->pLe
9bc0: 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74  ft and p->pRight
9bd0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
9be0: 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20   if any. Before 
9bf0: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75  returning, *pzBu
9c00: 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74  ffer is set to t
9c10: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
9c20: 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f  st the.** portio
9c30: 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  n of the buffer 
9c40: 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74  copied into by t
9c50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
9c60: 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78  .static Expr *ex
9c70: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
9c80: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
9c90: 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70  dupFlags, u8 **p
9ca0: 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72  zBuffer){.  Expr
9cb0: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
9cc0: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
9cd0: 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41  turn */.  u8 *zA
9ce0: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
9cf0: 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20  /* Memory space 
9d00: 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62 75  from which to bu
9d10: 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20  ild Expr object 
9d20: 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63 46  */.  u32 staticF
9d30: 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45 50  lag;       /* EP
9d40: 5f 53 74 61 74 69 63 20 69 66 20 73 70 61 63 65  _Static if space
9d50: 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66 72   not obtained fr
9d60: 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20  om malloc */..  
9d70: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
9d80: 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a  .  assert( p );.
9d90: 20 20 61 73 73 65 72 74 28 20 64 75 70 46 6c 61    assert( dupFla
9da0: 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67  gs==0 || dupFlag
9db0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
9dc0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
9dd0: 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75  zBuffer==0 || du
9de0: 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f  pFlags==EXPRDUP_
9df0: 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20  REDUCE );..  /* 
9e00: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
9e10: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
9e20: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
9e30: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75 66  . */.  if( pzBuf
9e40: 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f  fer ){.    zAllo
9e50: 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20  c = *pzBuffer;. 
9e60: 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20     staticFlag = 
9e70: 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c  EP_Static;.  }el
9e80: 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  se{.    zAlloc =
9e90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
9ea0: 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64 45  RawNN(db, dupedE
9eb0: 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  xprSize(p, dupFl
9ec0: 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74 69  ags));.    stati
9ed0: 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  cFlag = 0;.  }. 
9ee0: 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29   pNew = (Expr *)
9ef0: 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70  zAlloc;..  if( p
9f00: 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  New ){.    /* Se
9f10: 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68  t nNewSize to th
9f20: 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64  e size allocated
9f30: 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
9f40: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20  re pointed to.  
9f50: 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68    ** by pNew. Th
9f60: 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58 50  is is either EXP
9f70: 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52  R_FULLSIZE, EXPR
9f80: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a  _REDUCEDSIZE or.
9f90: 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45      ** EXPR_TOKE
9fa0: 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65  NONLYSIZE. nToke
9fb0: 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
9fc0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9fd0: 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20  consumed.    ** 
9fe0: 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  by the copy of t
9ff0: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
a000: 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a  tring (if any)..
a010: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74      */.    const
a020: 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63   unsigned nStruc
a030: 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70  tSize = dupedExp
a040: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 64  rStructSize(p, d
a050: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f  upFlags);.    co
a060: 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65  nst int nNewSize
a070: 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26   = nStructSize &
a080: 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74 20   0xfff;.    int 
a090: 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20  nToken;.    if( 
a0a0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a0b0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
a0c0: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
a0d0: 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  ){.      nToken 
a0e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
a0f0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b  0(p->u.zToken) +
a100: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
a110: 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b       nToken = 0;
a120: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
a130: 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  upFlags ){.     
a140: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
a150: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
a160: 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
a170: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
a180: 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b  c, p, nNewSize);
a190: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a1a0: 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28 75    u32 nSize = (u
a1b0: 33 32 29 65 78 70 72 53 74 72 75 63 74 53 69 7a  32)exprStructSiz
a1c0: 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  e(p);.      memc
a1d0: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53  py(zAlloc, p, nS
a1e0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
a1f0: 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53  nSize<EXPR_FULLS
a200: 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20  IZE ){ .        
a210: 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e  memset(&zAlloc[n
a220: 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46  Size], 0, EXPR_F
a230: 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a  ULLSIZE-nSize);.
a240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
a250: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50     /* Set the EP
a260: 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b  _Reduced, EP_Tok
a270: 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53  enOnly, and EP_S
a280: 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72  tatic flags appr
a290: 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  opriately. */.  
a2a0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d    pNew->flags &=
a2b0: 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50   ~(EP_Reduced|EP
a2c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74  _TokenOnly|EP_St
a2d0: 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e  atic|EP_MemToken
a2e0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  );.    pNew->fla
a2f0: 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a  gs |= nStructSiz
a300: 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  e & (EP_Reduced|
a310: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20  EP_TokenOnly);. 
a320: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
a330: 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20  = staticFlag;.. 
a340: 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70     /* Copy the p
a350: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
a360: 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  g, if any. */.  
a370: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a    if( nToken ){.
a380: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b        char *zTok
a390: 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f  en = pNew->u.zTo
a3a0: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41  ken = (char*)&zA
a3b0: 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a  lloc[nNewSize];.
a3c0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f        memcpy(zTo
a3d0: 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken, p->u.zToken
a3e0: 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d  , nToken);.    }
a3f0: 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70  ..    if( 0==((p
a400: 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c  ->flags|pNew->fl
a410: 61 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e  ags) & (EP_Token
a420: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20 29  Only|EP_Leaf)) )
a430: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20  {.      /* Fill 
a440: 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70  in the pNew->x.p
a450: 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e  Select or pNew->
a460: 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20  x.pList member. 
a470: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  */.      if( Exp
a480: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a490: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
a4a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
a4b0: 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  .pSelect = sqlit
a4c0: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
a4d0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75  p->x.pSelect, du
a4e0: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d  pFlags);.      }
a4f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
a500: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
a510: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a520: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
a530: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
a540: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
a550: 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e  * Fill in pNew->
a560: 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e  pLeft and pNew->
a570: 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69  pRight. */.    i
a580: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a590: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
a5a0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
a5b0: 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  ) ){.      zAllo
a5c0: 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  c += dupedExprNo
a5d0: 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  deSize(p, dupFla
a5e0: 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gs);.      if( !
a5f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a600: 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  pNew, EP_TokenOn
a610: 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20  ly|EP_Leaf) ){. 
a620: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
a630: 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a  ft = p->pLeft ?.
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62        exprDup(db
a660: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
a670: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
a680: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
a690: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
a6a0: 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20 20   p->pRight ?.   
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20      exprDup(db, 
a6d0: 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44  p->pRight, EXPRD
a6e0: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
a6f0: 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d  oc) : 0;.      }
a700: 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66  .      if( pzBuf
a710: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  fer ){.        *
a720: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
a730: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
a740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
a750: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a760: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
a770: 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20  |EP_Leaf) ){.   
a780: 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f       if( pNew->o
a790: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
a7a0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
a7b0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
a7c0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
a7d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43     assert( p->iC
a7e0: 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70  olumn==0 || p->p
a7f0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
a800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a810: 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70  >pRight==0  || p
a820: 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65  ->pRight==p->pLe
a830: 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ft );.        }e
a840: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
a850: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  New->pLeft = sql
a860: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
a870: 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  p->pLeft, 0);.  
a880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a890: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73  pNew->pRight = s
a8a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a8b0: 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b  , p->pRight, 0);
a8c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a8d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
a8e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
a8f0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  e and return a d
a900: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
a910: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
a920: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
a930: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20  argument. If an 
a940: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
a950: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55   encountered, NU
a960: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  LL is returned.*
a970: 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61  * and the db->ma
a980: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
a990: 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  set..*/.#ifndef 
a9a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
a9b0: 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74  static With *wit
a9c0: 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  hDup(sqlite3 *db
a9d0: 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69  , With *p){.  Wi
a9e0: 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  th *pRet = 0;.  
a9f0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
aa00: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
aa10: 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e  *p) + sizeof(p->
aa20: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65  a[0]) * (p->nCte
aa30: 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  -1);.    pRet = 
aa40: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
aa50: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
aa60: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
aa70: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
aa80: 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20     pRet->nCte = 
aa90: 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66  p->nCte;.      f
aaa0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
aab0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
aac0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pRet->a[i].pSel
aad0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
aae0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  ectDup(db, p->a[
aaf0: 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  i].pSelect, 0);.
ab00: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
ab10: 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74  i].pCols = sqlit
ab20: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
ab30: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c  , p->a[i].pCols,
ab40: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
ab50: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
ab60: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ab70: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  db, p->a[i].zNam
ab80: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
ab90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
aba0: 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Ret;.}.#else.# d
abb0: 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c  efine withDup(x,
abc0: 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y) 0.#endif../*.
abd0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
abe0: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
abf0: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
ac00: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
ac10: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
ac20: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
ac30: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
ac40: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
ac50: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
ac60: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
ac70: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
ac80: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
ac90: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
aca0: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
acb0: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
acc0: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
acd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
ace0: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
acf0: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
ad00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ad10: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
ad20: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
ad30: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
ad40: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
ad50: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
ad60: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
ad70: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
ad80: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
ad90: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
ada0: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
adb0: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
adc0: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
add0: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
ade0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
adf0: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
ae00: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
ae10: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
ae20: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
ae30: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
ae40: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
ae50: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
ae60: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
ae70: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
ae80: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
ae90: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
aea0: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
aeb0: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
aec0: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
aed0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
aee0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
aef0: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
af00: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
af10: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
af20: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
af30: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  s){.  assert( fl
af40: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
af50: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
af60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20  );.  return p ? 
af70: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66  exprDup(db, p, f
af80: 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a  lags, 0) : 0;.}.
af90: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
afa0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
afb0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
afc0: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
afd0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
afe0: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
aff0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
b000: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
b010: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
b020: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20  pPriorSelectCol 
b030: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64  = 0;.  assert( d
b040: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
b050: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b060: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
b070: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
b080: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
b090: 53 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20 20  Size(db, p));.  
b0a0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
b0b0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
b0c0: 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72  nExpr = p->nExpr
b0d0: 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e 65 77  ;.  pItem = pNew
b0e0: 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d 20  ->a;.  pOldItem 
b0f0: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
b100: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
b110: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
b120: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
b130: 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70  pr *pOldExpr = p
b140: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  OldItem->pExpr;.
b150: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
b160: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
b170: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
b180: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
b190: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
b1a0: 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20  if( pOldExpr .  
b1b0: 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e     && pOldExpr->
b1c0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op==TK_SELECT_CO
b1d0: 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e  LUMN.     && (pN
b1e0: 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  ewExpr = pItem->
b1f0: 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29  pExpr)!=0 .    )
b200: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b210: 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pNewExpr->iColum
b220: 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20  n==0 || i>0 );. 
b230: 20 20 20 20 20 69 66 28 20 70 4e 65 77 45 78 70       if( pNewExp
b240: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
b250: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b260: 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74   pOldExpr->pLeft
b270: 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67  ==pOldExpr->pRig
b280: 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ht );.        pP
b290: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20  riorSelectCol = 
b2a0: 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20  pNewExpr->pLeft 
b2b0: 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67  = pNewExpr->pRig
b2c0: 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ht;.      }else{
b2d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b2e0: 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20   i>0 );.        
b2f0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31  assert( pItem[-1
b300: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
b310: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
b320: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
b330: 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72  =pItem[-1].pExpr
b340: 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20  ->iColumn+1 );. 
b350: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b360: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d  PriorSelectCol==
b370: 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d  pItem[-1].pExpr-
b380: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
b390: 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66    pNewExpr->pLef
b3a0: 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74  t = pPriorSelect
b3b0: 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
b3c0: 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e   }.    pItem->zN
b3d0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
b3e0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b3f0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
b400: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
b410: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b420: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70  b, pOldItem->zSp
b430: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
b440: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
b450: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
b460: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
b470: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d   = 0;.    pItem-
b480: 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f  >bSpanIsTab = pO
b490: 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54  ldItem->bSpanIsT
b4a0: 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75  ab;.    pItem->u
b4b0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a   = pOldItem->u;.
b4c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
b4d0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
b4e0: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
b4f0: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
b500: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
b510: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
b520: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
b530: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
b540: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
b550: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
b560: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
b570: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
b580: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
b590: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
b5a0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
b5b0: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
b5c0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
b5d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
b5e0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
b5f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
b600: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
b610: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
b620: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
b630: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
b640: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b650: 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74   SrcList *p, int
b660: 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69   flags){.  SrcLi
b670: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
b680: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
b690: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
b6a0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
b6b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74  return 0;.  nByt
b6c0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
b6d0: 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69   (p->nSrc>0 ? si
b6e0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
b6f0: 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29  (p->nSrc-1) : 0)
b700: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
b710: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
b720: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
b730: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
b740: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
b750: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
b760: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
b770: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
b780: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
b790: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
b7a0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
b7b0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
b7c0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
b7d0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
b7e0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
b7f0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
b800: 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20  ewItem->pSchema 
b810: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68  = pOldItem->pSch
b820: 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ema;.    pNewIte
b830: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
b840: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b850: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
b860: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
b870: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
b880: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b890: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
b8a0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
b8b0: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
b8c0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b8d0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
b8e0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b8f0: 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  >fg = pOldItem->
b900: 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  fg;.    pNewItem
b910: 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64  ->iCursor = pOld
b920: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
b930: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64     pNewItem->add
b940: 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49  rFillSub = pOldI
b950: 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
b960: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b970: 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64  regReturn = pOld
b980: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
b990: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65  .    if( pNewIte
b9a0: 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
b9b0: 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49  y ){.      pNewI
b9c0: 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
b9d0: 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  By = sqlite3DbSt
b9e0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b9f0: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
ba00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
ba10: 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20  wItem->pIBIndex 
ba20: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49  = pOldItem->pIBI
ba30: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e  ndex;.    if( pN
ba40: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62  ewItem->fg.isTab
ba50: 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e  Func ){.      pN
ba60: 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ewItem->u1.pFunc
ba70: 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20  Arg = .         
ba80: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ba90: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
baa0: 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66  ->u1.pFuncArg, f
bab0: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lags);.    }.   
bac0: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
bad0: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
bae0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
baf0: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
bb00: 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
bb10: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
bb20: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
bb30: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
bb40: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  b, pOldItem->pSe
bb50: 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  lect, flags);.  
bb60: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20    pNewItem->pOn 
bb70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
bb80: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
bb90: 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  On, flags);.    
bba0: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
bbb0: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
bbc0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bbd0: 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70  ->pUsing);.    p
bbe0: 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  NewItem->colUsed
bbf0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c   = pOldItem->col
bc00: 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Used;.  }.  retu
bc10: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
bc20: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
bc30: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
bc40: 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49   IdList *p){.  I
bc50: 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  dList *pNew;.  i
bc60: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
bc70: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
bc80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bc90: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
bca0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
bcb0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
bcc0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
bcd0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
bce0: 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49  New->nId = p->nI
bcf0: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
bd00: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
bd10: 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73  wNN(db, p->nId*s
bd20: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
bd30: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
bd40: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
bd50: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e  3DbFreeNN(db, pN
bd60: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
bd70: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65  0;.  }.  /* Note
bd80: 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68   that because th
bd90: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c  e size of the al
bda0: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e  location for p->
bdb0: 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  a[] is not.  ** 
bdc0: 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f  necessarily a po
bdd0: 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69  wer of two, sqli
bde0: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
bdf0: 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c  ) may not be cal
be00: 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  led.  ** on the 
be10: 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65  duplicate create
be20: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
be30: 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  on. */.  for(i=0
be40: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
be50: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
be60: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
be70: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
be80: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
be90: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
bea0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
beb0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
bec0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
bed0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
bee0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
bef0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
bf00: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
bf10: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
bf20: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
bf30: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
bf40: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
bf50: 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73  *pDup, int flags
bf60: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65  ){.  Select *pRe
bf70: 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20  t = 0;.  Select 
bf80: 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65  *pNext = 0;.  Se
bf90: 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65  lect **pp = &pRe
bfa0: 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a  t;.  Select *p;.
bfb0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
bfc0: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70   );.  for(p=pDup
bfd0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72  ; p; p=p->pPrior
bfe0: 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
bff0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
c000: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
c010: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20  izeof(*p) );.   
c020: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62   if( pNew==0 ) b
c030: 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  reak;.    pNew->
c040: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
c050: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
c060: 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73  p->pEList, flags
c070: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72  );.    pNew->pSr
c080: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
c090: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
c0a0: 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  c, flags);.    p
c0b0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
c0c0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c0d0: 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67   p->pWhere, flag
c0e0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47  s);.    pNew->pG
c0f0: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
c100: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
c110: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
c120: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
c130: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
c140: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
c150: 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a  Having, flags);.
c160: 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72      pNew->pOrder
c170: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
c180: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
c190: 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b  OrderBy, flags);
c1a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  .    pNew->op = 
c1b0: 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  p->op;.    pNew-
c1c0: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a  >pNext = pNext;.
c1d0: 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
c1e0: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
c1f0: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
c200: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
c210: 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Limit, flags);. 
c220: 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20     pNew->iLimit 
c230: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
c240: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
c250: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
c260: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e   p->selFlags & ~
c270: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
c280: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
c290: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
c2a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
c2b0: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
c2c0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c  ;.    pNew->nSel
c2d0: 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c  ectRow = p->nSel
c2e0: 65 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77  ectRow;.    pNew
c2f0: 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75  ->pWith = withDu
c300: 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  p(db, p->pWith);
c310: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
c320: 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
c330: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20  p->zSelName);.  
c340: 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20    *pp = pNew;.  
c350: 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50    pp = &pNew->pP
c360: 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20  rior;.    pNext 
c370: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72  = pNew;.  }..  r
c380: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
c390: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
c3a0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
c3b0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
c3c0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
c3d0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
c3e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
c3f0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
c400: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
c410: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
c420: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
c430: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
c440: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
c450: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
c460: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
c470: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   list..**.** The
c480: 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20   pList argument 
c490: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
c4a0: 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  ULL or a pointer
c4b0: 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a   to an ExprList.
c4c0: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
c4d0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
c4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c4f0: 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20  Append().  This 
c500: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e  routine.** may n
c510: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
c520: 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61  an ExprList obta
c530: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
c540: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a  3ExprListDup()..
c550: 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73  ** Reason:  This
c560: 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
c570: 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
c580: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69   of slots in pLi
c590: 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20  st->a[].** is a 
c5a0: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54  power of two.  T
c5b0: 68 61 74 20 69 73 20 74 72 75 65 20 66 6f 72 20  hat is true for 
c5c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
c5d0: 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a  ppend() returns.
c5e0: 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65  ** but is not ne
c5f0: 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 66  cessarily true f
c600: 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76  rom the return v
c610: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45  alue of sqlite3E
c620: 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a  xprListDup()..**
c630: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
c640: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
c650: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74   occurs, the ent
c660: 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65  ire list is free
c670: 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73  d and.** NULL is
c680: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e   returned.  If n
c690: 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  on-NULL is retur
c6a0: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
c6b0: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68  guaranteed.** th
c6c0: 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  at the new entry
c6d0: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
c6e0: 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45  y appended..*/.E
c6f0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
c700: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a  ExprListAppend(.
c710: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
c730: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c740: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
c750: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
c760: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
c770: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
c780: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
c790: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
c7a0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
c7b0: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
c7c0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c7d0: 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
c7e0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
c7f0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
c800: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c810: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
c820: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
c830: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
c840: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c850: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  wNN(db, sizeof(E
c860: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
c870: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
c880: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
c890: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
c8a0: 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20  st->nExpr = 0;. 
c8b0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73   }else if( (pLis
c8c0: 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73  t->nExpr & (pLis
c8d0: 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20  t->nExpr-1))==0 
c8e0: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
c8f0: 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20  *pNew;.    pNew 
c900: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
c910: 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20  oc(db, pList, . 
c920: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
c930: 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c  of(*pList)+(2*pL
c940: 69 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a  ist->nExpr - 1)*
c950: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
c960: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  0]));.    if( pN
c970: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  ew==0 ){.      g
c980: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
c990: 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  }.    pList = pN
c9a0: 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  ew;.  }.  pItem 
c9b0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
c9c0: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61  t->nExpr++];.  a
c9d0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
c9e0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
c9f0: 69 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a  item,zName)==siz
ca00: 65 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  eof(pItem->pExpr
ca10: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ) );.  assert( o
ca20: 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45  ffsetof(struct E
ca30: 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78  xprList_item,pEx
ca40: 70 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  pr)==0 );.  mems
ca50: 65 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  et(&pItem->zName
ca60: 2c 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  ,0,sizeof(*pItem
ca70: 29 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63  )-offsetof(struc
ca80: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c  t ExprList_item,
ca90: 7a 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d  zName));.  pItem
caa0: 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
cab0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
cac0: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
cad0: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
cae0: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
caf0: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
cb00: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
cb10: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
cb20: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
cb30: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
cb40: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
cb50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75  ;.}../*.** pColu
cb60: 6d 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f  mns and pExpr fo
cb70: 72 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69  rm a vector assi
cb80: 67 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gnment which is 
cb90: 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a  part of the SET.
cba0: 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20  ** clause of an 
cbb0: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
cbc0: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
cbd0: 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c  .**        (a,b,
cbe0: 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72  c) = (expr1,expr
cbf0: 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20  2,expr3).** Or: 
cc00: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45     (a,b,c) = (SE
cc10: 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20  LECT x,y,z FROM 
cc20: 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ....).**.** For 
cc30: 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
cc40: 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65   vector assignme
cc50: 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65  nt, append new e
cc60: 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a  ntries to the.**
cc70: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
cc80: 20 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20   pList.  In the 
cc90: 63 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65  case of a subque
cca0: 72 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61  ry on the RHS, a
ccb0: 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45  ppend.** TK_SELE
ccc0: 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73  CT_COLUMN expres
ccd0: 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69  sions..*/.ExprLi
cce0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
ccf0: 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28  istAppendVector(
cd00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cd10: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
cd20: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
cd30: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
cd40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
cd50: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
cd60: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
cd70: 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  LL */.  IdList *
cd80: 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f  pColumns,      /
cd90: 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  * List of names 
cda0: 6f 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73  of LHS of the as
cdb0: 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  signment */.  Ex
cdc0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
cdd0: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65       /* Vector e
cde0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
cdf0: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
ce00: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
ce10: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ce20: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
ce30: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
ce40: 74 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74  t iFirst = pList
ce50: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
ce60: 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d  : 0;.  /* pColum
ce70: 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e  ns can only be N
ce80: 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f  ULL due to an OO
ce90: 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c  M but an OOM wil
cea0: 6c 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20  l cause an.  ** 
ceb0: 65 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68  exit prior to th
cec0: 69 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67  is routine being
ced0: 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66   invoked */.  if
cee0: 28 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73  ( NEVER(pColumns
cef0: 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74  ==0) ) goto vect
cf00: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
cf10: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
cf20: 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70  ) goto vector_ap
cf30: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f  pend_error;..  /
cf40: 2a 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20  * If the RHS is 
cf50: 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77  a vector, then w
cf60: 65 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c  e can immediatel
cf70: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  y check to see t
cf80: 68 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69  hat .  ** the si
cf90: 7a 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e  ze of the RHS an
cfa0: 64 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75  d LHS match.  Bu
cfb0: 74 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  t if the RHS is 
cfc0: 61 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20  a SELECT, .  ** 
cfd0: 77 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20  wildcards ("*") 
cfe0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
cff0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
d000: 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
d010: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20   before.  ** we 
d020: 63 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20  can do the size 
d030: 63 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20  check, so defer 
d040: 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75  the size check u
d050: 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
d060: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
d070: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53   pExpr->op!=TK_S
d080: 45 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e  ELECT && pColumn
d090: 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74  s->nId!=(n=sqlit
d0a0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
d0b0: 28 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20  (pExpr)) ){.    
d0c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d0d0: 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
d0e0: 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
d0f0: 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
d110: 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a  lumns->nId, n);.
d120: 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f      goto vector_
d130: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20  append_error;.  
d140: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
d150: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69  pColumns->nId; i
d160: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d170: 53 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65  SubExpr = sqlite
d180: 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69  3ExprForVectorFi
d190: 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70  eld(pParse, pExp
d1a0: 72 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74  r, i);.    pList
d1b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
d1c0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
d1d0: 20 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72   pList, pSubExpr
d1e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
d1f0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
d200: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
d210: 69 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20  iFirst+i+1 );.  
d220: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69      pList->a[pLi
d230: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  st->nExpr-1].zNa
d240: 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61  me = pColumns->a
d250: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
d260: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e   pColumns->a[i].
d270: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  zName = 0;.    }
d280: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d  .  }..  if( !db-
d290: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
d2a0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
d2b0: 45 4c 45 43 54 20 26 26 20 41 4c 57 41 59 53 28  ELECT && ALWAYS(
d2c0: 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  pList!=0) ){.   
d2d0: 20 45 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20   Expr *pFirst = 
d2e0: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d  pList->a[iFirst]
d2f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
d300: 72 74 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b  rt( pFirst!=0 );
d310: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
d320: 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  rst->op==TK_SELE
d330: 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  CT_COLUMN );.   
d340: 20 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20    .    /* Store 
d350: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
d360: 6d 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73  ment in pRight s
d370: 6f 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c  o it will be del
d380: 65 74 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a  eted when.    **
d390: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d3a0: 44 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c  Delete() is call
d3b0: 65 64 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74  ed */.    pFirst
d3c0: 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  ->pRight = pExpr
d3d0: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b  ;.    pExpr = 0;
d3e0: 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65  ..    /* Remembe
d3f0: 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
d400: 65 20 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20  e LHS in iTable 
d410: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63  so that we can c
d420: 68 65 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a  heck that.    **
d430: 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53   the RHS and LHS
d440: 20 73 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72   sizes match dur
d450: 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ing code generat
d460: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72  ion. */.    pFir
d470: 73 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f  st->iTable = pCo
d480: 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a  lumns->nId;.  }.
d490: 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65  .vector_append_e
d4a0: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45  rror:.  sqlite3E
d4b0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
d4c0: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  xpr);.  sqlite3I
d4d0: 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
d4e0: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74  pColumns);.  ret
d4f0: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
d500: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74  .** Set the sort
d510: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c   order for the l
d520: 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74  ast element on t
d530: 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73  he given ExprLis
d540: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d550: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72  e3ExprListSetSor
d560: 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74 20  tOrder(ExprList 
d570: 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64  *p, int iSortOrd
d580: 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  er){.  if( p==0 
d590: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
d5a0: 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e  rt( SQLITE_SO_UN
d5b0: 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c  DEFINED<0 && SQL
d5c0: 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26  ITE_SO_ASC>=0 &&
d5d0: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e   SQLITE_SO_DESC>
d5e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
d5f0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69  ->nExpr>0 );.  i
d600: 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20  f( iSortOrder<0 
d610: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d620: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
d630: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
d640: 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20  E_SO_ASC );.    
d650: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d  return;.  }.  p-
d660: 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73  >a[p->nExpr-1].s
d670: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69  ortOrder = (u8)i
d680: 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a  SortOrder;.}../*
d690: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
d6a0: 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65  List.a[].zName e
d6b0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
d6c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
d6d0: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
d6e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d6f0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
d700: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
d710: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
d720: 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73  or.  But pName s
d730: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
d740: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
d750: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
d760: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
d770: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
d780: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
d790: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
d7a0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
d7b0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
d7c0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
d7d0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d7e0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d7f0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
d800: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
d810: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
d820: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
d830: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
d840: 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64  Name to be added
d850: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
d860: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
d870: 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74   True to cause t
d880: 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65  he name to be de
d890: 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  quoted */.){.  a
d8a0: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
d8b0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
d8c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
d8d0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
d8e0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
d8f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
d900: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
d910: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
d920: 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69      pItem = &pLi
d930: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
d940: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
d950: 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d  t( pItem->zName=
d960: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
d970: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
d980: 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65  DbStrNDup(pParse
d990: 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ->db, pName->z, 
d9a0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
d9b0: 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c  f( dequote ) sql
d9c0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65  ite3Dequote(pIte
d9d0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d  m->zName);.  }.}
d9e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
d9f0: 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70  ExprList.a[].zSp
da00: 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  an element of th
da10: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
da20: 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e  added item.** on
da30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
da40: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  list..**.** pLis
da50: 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
da60: 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d  following an OOM
da70: 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70   error.  But pSp
da80: 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  an should never 
da90: 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20  be.** NULL.  If 
daa0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
dab0: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70  ion fails, the p
dac0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
dad0: 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20  cFailed flag.** 
dae0: 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  is set..*/.void 
daf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
db00: 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20  etSpan(.  Parse 
db10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
db20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
db30: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
db40: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
db50: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
db60: 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70  ch to add the sp
db70: 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  an. */.  const c
db80: 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20  har *zStart,    
db90: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65   /* Start of the
dba0: 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74   span */.  const
dbb0: 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 20   char *zEnd     
dbc0: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
dbd0: 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71   span */.){.  sq
dbe0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
dbf0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
dc00: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
dc10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
dc20: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
dc30: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
dc40: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
dc50: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
dc60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
dc70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
dc80: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
dc90: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
dca0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
dcb0: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  n);.    pItem->z
dcc0: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
dcd0: 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61  SpanDup(db, zSta
dce0: 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a 7d  rt, zEnd);.  }.}
dcf0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
dd00: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
dd10: 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d  EList contains m
dd20: 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20  ore than iLimit 
dd30: 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61  elements,.** lea
dd40: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
dd50: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
dd60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
dd70: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
dd80: 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  h(.  Parse *pPar
dd90: 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
dda0: 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20  pEList,.  const 
ddb0: 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b  char *zObject.){
ddc0: 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72  .  int mx = pPar
ddd0: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
dde0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
ddf0: 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  MN];.  testcase(
de00: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
de10: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a  t->nExpr==mx );.
de20: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
de30: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
de40: 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69  xpr==mx+1 );.  i
de50: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
de60: 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b  ist->nExpr>mx ){
de70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
de80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
de90: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
dea0: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
deb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
dec0: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65  lete an entire e
ded0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
dee0: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
def0: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65  _NOINLINE void e
df00: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
df10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
df20: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
df30: 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e   int i = pList->
df40: 6e 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20  nExpr;.  struct 
df50: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
df60: 49 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61  Item =  pList->a
df70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
df80: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
df90: 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  do{.    sqlite3E
dfa0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
dfb0: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
dfc0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
dfd0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
dfe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
dff0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e000: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
e010: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d  ++;.  }while( --
e020: 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  i>0 );.  sqlite3
e030: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
e040: 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  st);.}.void sqli
e050: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
e060: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
e070: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
e080: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 65  .  if( pList ) e
e090: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
e0a0: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
e0b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
e0c0: 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c  bitwise-OR of al
e0d0: 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65  l Expr.flags fie
e0e0: 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e  lds in the given
e0f0: 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f  .** ExprList..*/
e100: 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70 72  .u32 sqlite3Expr
e110: 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20  ListFlags(const 
e120: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
e130: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32  {.  int i;.  u32
e140: 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74   m = 0;.  assert
e150: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
e160: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
e170: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
e180: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
e190: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
e1a0: 78 70 72 3b 0a 20 20 20 20 20 61 73 73 65 72 74  xpr;.     assert
e1b0: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
e1c0: 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66     m |= pExpr->f
e1d0: 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75  lags;.  }.  retu
e1e0: 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn m;.}../*.** T
e1f0: 68 69 73 20 69 73 20 61 20 53 45 4c 45 43 54 2d  his is a SELECT-
e200: 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f  node callback fo
e210: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
e220: 20 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20   walker that.** 
e230: 61 6c 77 61 79 73 20 22 66 61 69 6c 73 22 2e 20  always "fails". 
e240: 20 42 79 20 22 66 61 69 6c 22 20 69 6e 20 74 68   By "fail" in th
e250: 69 73 20 63 61 73 65 2c 20 77 65 20 6d 65 61 6e  is case, we mean
e260: 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d   set.** pWalker-
e270: 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61  >eCode to zero a
e280: 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20  nd abort..**.** 
e290: 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73  This callback is
e2a0: 20 75 73 65 64 20 62 79 20 6d 75 6c 74 69 70 6c   used by multipl
e2b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c  e expression wal
e2c0: 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  kers..*/.int sql
e2d0: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
e2e0: 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  il(Walker *pWalk
e2f0: 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  er, Select *NotU
e300: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
e310: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
e320: 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  );.  pWalker->eC
e330: 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ode = 0;.  retur
e340: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a  n WRC_Abort;.}..
e350: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
e360: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ut expression is
e370: 20 61 6e 20 49 44 20 77 69 74 68 20 74 68 65 20   an ID with the 
e380: 6e 61 6d 65 20 22 74 72 75 65 22 20 6f 72 20 22  name "true" or "
e390: 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65 6e 20 63  false".** then c
e3a0: 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61  onvert it into a
e3b0: 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 74  n TK_TRUEFALSE t
e3c0: 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  erm.  Return non
e3d0: 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74 68 65 20  -zero if.** the 
e3e0: 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61 70 70 65  conversion happe
e3f0: 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f 20 69 66  ned, and zero if
e400: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e410: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 0a 2a 2f  is unaltered..*/
e420: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
e430: 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 45 78  IdToTrueFalse(Ex
e440: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73  pr *pExpr){.  as
e450: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
e460: 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78 70 72 2d  =TK_ID || pExpr-
e470: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op==TK_STRING )
e480: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
e490: 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
e4a0: 7a 54 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d  zToken, "true")=
e4b0: 3d 30 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  =0.   || sqlite3
e4c0: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
e4d0: 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73 65 22  .zToken, "false"
e4e0: 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 45  )==0.  ){.    pE
e4f0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52 55  xpr->op = TK_TRU
e500: 45 46 41 4c 53 45 3b 0a 20 20 20 20 72 65 74 75  EFALSE;.    retu
e510: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
e520: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
e530: 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  he argument must
e540: 20 62 65 20 61 20 54 4b 5f 54 52 55 45 46 41 4c   be a TK_TRUEFAL
e550: 53 45 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 52  SE Expr node.  R
e560: 65 74 75 72 6e 20 31 20 69 66 20 69 74 20 69 73  eturn 1 if it is
e570: 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20 69   TRUE.** and 0 i
e580: 66 20 69 74 20 69 73 20 46 41 4c 53 45 2e 0a 2a  f it is FALSE..*
e590: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
e5a0: 72 54 72 75 74 68 56 61 6c 75 65 28 63 6f 6e 73  rTruthValue(cons
e5b0: 74 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  t Expr *pExpr){.
e5c0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
e5d0: 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53  >op==TK_TRUEFALS
e5e0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
e5f0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
e600: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74  xpr->u.zToken,"t
e610: 72 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 20 20  rue")==0.       
e620: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
e630: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
e640: 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30 20 29 3b  n,"false")==0 );
e650: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d  .  return pExpr-
e660: 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b  >u.zToken[4]==0;
e670: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  .}.../*.** These
e680: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
e690: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75  lker callbacks u
e6a0: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70  sed to check exp
e6b0: 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73  ressions to.** s
e6c0: 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22  ee if they are "
e6d0: 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f  constant" for so
e6e0: 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  me definition of
e6f0: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a   constant.  The.
e700: 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  ** Walker.eCode 
e710: 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73  value determines
e720: 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f   the type of "co
e730: 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c  nstant" we are l
e740: 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a  ooking.** for..*
e750: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
e760: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
e770: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
e780: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
e790: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
e7a0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
e7b0: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
e7c0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
e7d0: 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71  ode==1.**     sq
e7e0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
e7f0: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20  antNotJoin()    
e800: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
e810: 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20  eCode==2.**     
e820: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
e830: 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  leConstant()    
e840: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
e850: 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20  ->eCode==3.**   
e860: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
e870: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
e880: 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b  n()        pWalk
e890: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
e8a0: 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63  5.**.** In all c
e8b0: 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61  ases, the callba
e8c0: 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65  cks set Walker.e
e8d0: 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74  Code=0 and abort
e8e0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
e8f0: 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74  on.** is found t
e900: 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74  o not be a const
e910: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ant..**.** The s
e920: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
e930: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
e940: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61   is used for eva
e950: 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69  luating expressi
e960: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ons.** in a CREA
e970: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
e980: 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e  nt.  The Walker.
e990: 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35  eCode value is 5
e9a0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
e9b0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
e9c0: 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70  ema and 4 when p
e9d0: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
e9e0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
e9f0: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
ea00: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
ea10: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
ea20: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
ea30: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
ea40: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
ea50: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
ea60: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
ea70: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
ea80: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
ea90: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
eaa0: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
eab0: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
eac0: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
ead0: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
eae0: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
eaf0: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
eb00: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
eb10: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
eb20: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
eb30: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
eb40: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
eb50: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
eb60: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
eb70: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
eb80: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73  Walker->eCode is
eb90: 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   2 then any term
eba0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
ebb0: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
ebc0: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
ebd0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
ebe0: 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64  of a left join d
ebf0: 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20  isqualifies the 
ec00: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
ec10: 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69  from being consi
ec20: 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20  dered constant. 
ec30: 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  */.  if( pWalker
ec40: 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78  ->eCode==2 && Ex
ec50: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
ec60: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
ec70: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
ec80: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
ec90: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
eca0: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
ecb0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
ecc0: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
ecd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
ece0: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
ecf0: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
ed00: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
ed10: 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57  ** and either pW
ed20: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
ed30: 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63  or 5 or the func
ed40: 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20  tion has the.   
ed50: 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ** SQLITE_FUNC_
ed60: 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20  CONST flag. */. 
ed70: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
ed80: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
ed90: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34  Walker->eCode>=4
eda0: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
edb0: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
edc0: 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  stFunc) ){.     
edd0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
ede0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
edf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61  lse{.        pWa
ee00: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
ee10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ee20: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
ee30: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
ee40: 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  D:.      /* Conv
ee50: 65 72 74 20 22 74 72 75 65 22 20 6f 72 20 22 66  ert "true" or "f
ee60: 61 6c 73 65 22 20 69 6e 20 61 20 44 45 46 41 55  alse" in a DEFAU
ee70: 4c 54 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 74  LT clause into t
ee80: 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 70 70 72  he.      ** appr
ee90: 6f 70 72 69 61 74 65 20 54 4b 5f 54 52 55 45 46  opriate TK_TRUEF
eea0: 41 4c 53 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ALSE operator */
eeb0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
eec0: 65 33 45 78 70 72 49 64 54 6f 54 72 75 65 46 61  e3ExprIdToTrueFa
eed0: 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
eee0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
eef0: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
ef00: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
ef10: 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
ef20: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
ef30: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
ef40: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
ef50: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
ef60: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
ef70: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
ef80: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ef90: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
efa0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
efb0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
efc0: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
efd0: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
efe0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
eff0: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
f000: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  ;.      if( pWal
f010: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26  ker->eCode==3 &&
f020: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
f030: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20  pWalker->u.iCur 
f040: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f050: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
f060: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
f070: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
f080: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f  .    case TK_IF_
f090: 4e 55 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 20 20  NULL_ROW:.      
f0a0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
f0b0: 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  >op==TK_IF_NULL_
f0c0: 52 4f 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61  ROW );.      pWa
f0d0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
f0e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
f0f0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73  C_Abort;.    cas
f100: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
f110: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
f120: 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20  ->eCode==5 ){.  
f130: 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c        /* Silentl
f140: 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20  y convert bound 
f150: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
f160: 61 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66  appear inside of
f170: 20 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20   CREATE.        
f180: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ** statements in
f190: 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70  to a NULL when p
f1a0: 61 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54  arsing the CREAT
f1b0: 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74  E statement text
f1c0: 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   out.        ** 
f1d0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  of the sqlite_ma
f1e0: 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
f1f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
f200: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  = TK_NULL;.     
f210: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b   }else if( pWalk
f220: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a  er->eCode==4 ){.
f230: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75          /* A bou
f240: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20  nd parameter in 
f250: 61 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  a CREATE stateme
f260: 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  nt that originat
f270: 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20  es from.        
f280: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
f290: 72 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65  re() causes an e
f2a0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
f2b0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
f2c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
f2d0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
f2e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
f2f0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
f300: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
f310: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
f320: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
f330: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65   ); /* sqlite3Se
f340: 6c 65 63 74 57 61 6c 6b 46 61 69 6c 20 77 69 6c  lectWalkFail wil
f350: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
f360: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
f370: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
f380: 54 53 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33  TS ); /* sqlite3
f390: 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 20 77  SelectWalkFail w
f3a0: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
f3b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f3c0: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
f3d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
f3e0: 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
f3f0: 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69   int initFlag, i
f400: 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b  nt iCur){.  Walk
f410: 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
f420: 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e  = initFlag;.  w.
f430: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
f440: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
f450: 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  nt;.  w.xSelectC
f460: 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
f470: 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b  3SelectWalkFail;
f480: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
f490: 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74  EBUG.  w.xSelect
f4a0: 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69  Callback2 = sqli
f4b0: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73  te3SelectWalkAss
f4c0: 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 77  ert2;.#endif.  w
f4d0: 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  .u.iCur = iCur;.
f4e0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
f4f0: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
f500: 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
f510: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
f520: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
f530: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
f540: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
f550: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
f560: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
f570: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
f580: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
f590: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
f5a0: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
f5b0: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
f5c0: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
f5d0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
f5e0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
f5f0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
f600: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
f610: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
f620: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
f630: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
f640: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
f650: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
f660: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
f670: 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 1, 0);.}../*.*
f680: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
f690: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
f6a0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
f6b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f6c0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
f6d0: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
f6e0: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
f6f0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
f700: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
f710: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
f720: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
f730: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
f740: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
f750: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
f760: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
f770: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
f780: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
f790: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
f7a0: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
f7b0: 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
f7c0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
f7d0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
f7e0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
f7f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
f800: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
f810: 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  any single row o
f820: 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
f830: 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49   cursor iCur.  I
f840: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
f850: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
f860: 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20   must not refer 
f870: 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72  to any non-deter
f880: 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
f890: 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62  n nor any.** tab
f8a0: 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43  le other than iC
f8b0: 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
f8c0: 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
f8d0: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69  stant(Expr *p, i
f8e0: 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75  nt iCur){.  retu
f8f0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
f900: 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a  , 3, iCur);.}...
f910: 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c  /*.** sqlite3Wal
f920: 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b  kExpr() callback
f930: 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
f940: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
f950: 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74  GroupBy()..*/.st
f960: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
f970: 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  eIsConstantOrGro
f980: 75 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  upBy(Walker *pWa
f990: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
f9a0: 72 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  r){.  ExprList *
f9b0: 70 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b  pGroupBy = pWalk
f9c0: 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a  er->u.pGroupBy;.
f9d0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43    int i;..  /* C
f9e0: 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73  heck if pExpr is
f9f0: 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e   identical to an
fa00: 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e  y GROUP BY term.
fa10: 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72   If so, consider
fa20: 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e  .  ** it constan
fa30: 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  t.  */.  for(i=0
fa40: 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
fa50: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
fa60: 78 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42  xpr *p = pGroupB
fa70: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
fa80: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
fa90: 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78  prCompare(0, pEx
faa0: 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a  pr, p, -1)<2 ){.
fab0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
fac0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
fad0: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c  prNNCollSeq(pWal
fae0: 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b  ker->pParse, p);
faf0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
fb00: 65 33 5f 73 74 72 69 63 6d 70 28 22 42 49 4e 41  e3_stricmp("BINA
fb10: 52 59 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  RY", pColl->zNam
fb20: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
fb30: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
fb40: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
fb50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
fb60: 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 73   if pExpr is a s
fb70: 75 62 2d 73 65 6c 65 63 74 2e 20 49 66 20 73 6f  ub-select. If so
fb80: 2c 20 63 6f 6e 73 69 64 65 72 20 69 74 20 76 61  , consider it va
fb90: 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28  riable. */.  if(
fba0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
fbb0: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
fbc0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 57 61  lect) ){.    pWa
fbd0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
fbe0: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
fbf0: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  Abort;.  }..  re
fc00: 74 75 72 6e 20 65 78 70 72 4e 6f 64 65 49 73 43  turn exprNodeIsC
fc10: 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b 65 72 2c  onstant(pWalker,
fc20: 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
fc30: 2a 20 57 61 6c 6b 20 74 68 65 20 65 78 70 72 65  * Walk the expre
fc40: 73 73 69 6f 6e 20 74 72 65 65 20 70 61 73 73 65  ssion tree passe
fc50: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
fc60: 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  rgument. Return 
fc70: 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 66 20 74  non-zero.** if t
fc80: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  he expression co
fc90: 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
fca0: 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 6f 72 20  of constants or 
fcb0: 63 6f 70 69 65 73 20 6f 66 20 74 65 72 6d 73 20  copies of terms 
fcc0: 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70 42 79 20  .** in pGroupBy 
fcd0: 74 68 61 74 20 73 6f 72 74 20 77 69 74 68 20 74  that sort with t
fce0: 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74  he BINARY collat
fcf0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ion sequence..**
fd00: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fd10: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
fd20: 72 6d 69 6e 65 20 69 66 20 61 20 74 65 72 6d 20  rmine if a term 
fd30: 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  of the HAVING cl
fd40: 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62 65 20 70  ause can.** be p
fd50: 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20 74 68 65  romoted into the
fd60: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
fd70: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 73 75 63  In order for suc
fd80: 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e 20 74 6f  h a promotion to
fd90: 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65 20 76 61   work,.** the va
fda0: 6c 75 65 20 6f 66 20 74 68 65 20 48 41 56 49 4e  lue of the HAVIN
fdb0: 47 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6d 75  G clause term mu
fdc0: 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 66  st be the same f
fdd0: 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  or all members o
fde0: 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70 22 2e 20  f.** a "group". 
fdf0: 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   The requirement
fe00: 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20   that the GROUP 
fe10: 42 59 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  BY term must be 
fe20: 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73 75 6d 65  BINARY.** assume
fe30: 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  s that no other 
fe40: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fe50: 63 65 20 77 69 6c 6c 20 68 61 76 65 20 61 20 66  ce will have a f
fe60: 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a 2a 2a 20  iner-grained.** 
fe70: 67 72 6f 75 70 69 6e 67 20 74 68 61 6e 20 62 69  grouping than bi
fe80: 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  nary.  In other 
fe90: 77 6f 72 64 73 20 28 41 3d 42 20 43 4f 4c 4c 41  words (A=B COLLA
fea0: 54 45 20 62 69 6e 61 72 79 29 20 69 6d 70 6c 69  TE binary) impli
feb0: 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20 65 76 65  es.** A=B in eve
fec0: 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69  ry other collati
fed0: 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  ng sequence.  Th
fee0: 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68  e requirement th
fef0: 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20  at the.** GROUP 
ff00: 42 59 20 62 65 20 42 49 4e 41 52 59 20 69 73 20  BY be BINARY is 
ff10: 73 74 72 69 63 74 65 72 20 74 68 61 6e 20 6e 65  stricter than ne
ff20: 63 65 73 73 61 72 79 2e 20 20 49 74 20 77 6f 75  cessary.  It wou
ff30: 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a 2a 2a 20  ld also work.** 
ff40: 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41 56 49 4e  to promote HAVIN
ff50: 47 20 63 6c 61 75 73 65 73 20 74 68 61 74 20 75  G clauses that u
ff60: 73 65 20 74 68 65 20 73 61 6d 65 20 61 6c 74 65  se the same alte
ff70: 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
ff80: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 61 73  g.** sequence as
ff90: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
ffa0: 72 6d 2c 20 62 75 74 20 74 68 61 74 20 69 73 20  rm, but that is 
ffb0: 6d 75 63 68 20 68 61 72 64 65 72 20 74 6f 20 63  much harder to c
ffc0: 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65 72 6e 61  heck,.** alterna
ffd0: 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  tive collating s
ffe0: 65 71 75 65 6e 63 65 73 20 61 72 65 20 75 6e 63  equences are unc
fff0: 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73 20  ommon, and this 
10000 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a 20 6f 70  is only an.** op
10010 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73 6f 20 77  timization, so w
10020 65 20 74 61 6b 65 20 74 68 65 20 65 61 73 79 20  e take the easy 
10030 77 61 79 20 6f 75 74 20 61 6e 64 20 73 69 6d 70  way out and simp
10040 6c 79 20 72 65 71 75 69 72 65 20 74 68 65 0a 2a  ly require the.*
10050 2a 20 47 52 4f 55 50 20 42 59 20 74 6f 20 75 73  * GROUP BY to us
10060 65 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c  e the BINARY col
10070 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
10080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
10090 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  xprIsConstantOrG
100a0 72 6f 75 70 42 79 28 50 61 72 73 65 20 2a 70 50  roupBy(Parse *pP
100b0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 45  arse, Expr *p, E
100c0 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
100d0 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  y){.  Walker w;.
100e0 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20    w.eCode = 1;. 
100f0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
10100 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e   = exprNodeIsCon
10110 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 3b 0a  stantOrGroupBy;.
10120 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
10130 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70  ack = 0;.  w.u.p
10140 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
10150 42 79 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  By;.  w.pParse =
10160 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
10170 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
10180 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
10190 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ode;.}../*.** Wa
101a0 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
101b0 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
101c0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
101d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
101e0 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75  stant.** or a fu
101f0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68  nction call with
10200 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
10210 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64  nts.  Return and
10220 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61   0 if there.** a
10230 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73  re any variables
10240 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
10250 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
10260 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
10270 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
10280 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
10290 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
102a0 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
102b0 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
102c0 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
102d0 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
102e0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
102f0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
10300 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a  rFunction(Expr *
10310 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20  p, u8 isInit){. 
10320 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d   assert( isInit=
10330 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20  =0 || isInit==1 
10340 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  );.  return expr
10350 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49  IsConst(p, 4+isI
10360 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64  nit, 0);.}..#ifd
10370 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10380 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a  _CURSOR_HINTS./*
10390 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
103a0 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
103b0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
103c0 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
103d0 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  s a.** subquery 
103e0 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52  of some kind.  R
103f0 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65  eturn 0 if there
10400 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69   are no subqueri
10410 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
10420 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75  e3ExprContainsSu
10430 62 71 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b  bquery(Expr *p){
10440 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
10450 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e  .eCode = 1;.  w.
10460 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
10470 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
10480 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  oop;.  w.xSelect
10490 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
104a0 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
104b0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
104c0 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63  DEBUG.  w.xSelec
104d0 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c  tCallback2 = sql
104e0 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73  ite3SelectWalkAs
104f0 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20  sert2;.#endif.  
10500 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
10510 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
10520 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23   w.eCode==0;.}.#
10530 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
10540 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
10550 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e   codes a constan
10560 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  t integer that i
10570 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a  s small enough.*
10580 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32  * to fit in a 32
10590 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
105a0 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74  turn 1 and put t
105b0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
105c0 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70  integer.** in *p
105d0 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65  Value.  If the e
105e0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
105f0 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69   an integer or i
10600 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a  f it is too big.
10610 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73  ** to fit in a s
10620 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74  igned 32-bit int
10630 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61  eger, return 0 a
10640 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65  nd leave *pValue
10650 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
10660 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
10670 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c  Integer(Expr *p,
10680 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20   int *pValue){. 
10690 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69   int rc = 0;.  i
106a0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
106b0 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79   0;  /* Can only
106c0 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e   happen followin
106d0 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f  g on OOM */..  /
106e0 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69  * If an expressi
106f0 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
10700 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69   literal that fi
10710 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  ts in a signed 3
10720 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67  2-bit.  ** integ
10730 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f  er, then the EP_
10740 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69  IntValue flag wi
10750 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
10760 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73  been set */.  as
10770 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
10780 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66  INTEGER || (p->f
10790 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
107a0 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ue)!=0.         
107b0 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
107c0 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
107d0 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20  , &rc)==0 );..  
107e0 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
107f0 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
10800 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75    *pValue = p->u
10810 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74  .iValue;.    ret
10820 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69  urn 1;.  }.  swi
10830 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
10840 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
10850 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
10860 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
10870 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
10880 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
10890 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
108a0 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
108b0 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
108c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
108d0 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
108e0 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
108f0 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28      assert( v!=(
10900 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29  -2147483647-1) )
10910 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  ;.        *pValu
10920 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
10930 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
10940 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10950 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
10960 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
10970 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10980 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
10990 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
109a0 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70  nce that the exp
109b0 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e  ression can be N
109c0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ULL..**.** If th
109d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67  e expression mig
109e0 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66  ht be NULL or if
109f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10a00 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a  is too complex.*
10a10 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e  * to tell return
10a20 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54   TRUE.  .**.** T
10a30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
10a40 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69  sed as an optimi
10a50 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20  zation, to skip 
10a60 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65  OP_IsNull opcode
10a70 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f  s.** when we kno
10a80 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63  w that a value c
10a90 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20  annot be NULL.  
10aa0 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70  Hence, a false p
10ab0 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75  ositive.** (retu
10ac0 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20  rning TRUE when 
10ad0 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72  in fact the expr
10ae0 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72  ession can never
10af0 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a   be NULL) might.
10b00 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65  ** be a small pe
10b10 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75  rformance hit bu
10b20 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68  t is otherwise h
10b30 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65  armless.  On the
10b40 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20   other.** hand, 
10b50 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  a false negative
10b60 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53   (returning FALS
10b70 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  E when the resul
10b80 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29  t could be NULL)
10b90 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  .** will likely 
10ba0 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
10bb0 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20  orrect answer.  
10bc0 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74  So when in doubt
10bd0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45  , return.** TRUE
10be0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10bf0 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f  ExprCanBeNull(co
10c00 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  nst Expr *p){.  
10c10 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20  u8 op;.  while( 
10c20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
10c30 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
10c40 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
10c50 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
10c60 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
10c70 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
10c80 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
10c90 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
10ca0 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
10cb0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
10cc0 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  G:.    case TK_F
10cd0 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LOAT:.    case T
10ce0 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65  K_BLOB:.      re
10cf0 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65  turn 0;.    case
10d00 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
10d10 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73    return ExprHas
10d20 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43  Property(p, EP_C
10d30 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20  anBeNull) ||.   
10d40 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 54 61            p->pTa
10d50 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20 52 65 66 65  b==0 ||  /* Refe
10d60 72 65 6e 63 65 20 74 6f 20 63 6f 6c 75 6d 6e 20  rence to column 
10d70 6f 66 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72  of index on expr
10d80 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
10d90 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75         (p->iColu
10da0 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62  mn>=0 && p->pTab
10db0 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d  ->aCol[p->iColum
10dc0 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a  n].notNull==0);.
10dd0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
10de0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
10df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10e00 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
10e10 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
10e20 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63   a constant whic
10e30 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e  h would be.** un
10e40 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66  changed by OP_Af
10e50 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20  finity with the 
10e60 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69  affinity given i
10e70 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  n the second.** 
10e80 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
10e90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10ea0 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
10eb0 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69  e if the OP_Affi
10ec0 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  nity operation.*
10ed0 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  * can be omitted
10ee0 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  .  When in doubt
10ef0 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20   return FALSE.  
10f00 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
10f10 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  .** is harmless.
10f20 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
10f30 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e  ve, however, can
10f40 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77   result in the w
10f50 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a  rong.** answer..
10f60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
10f70 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
10f80 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78  yChange(const Ex
10f90 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29  pr *p, char aff)
10fa0 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28  {.  u8 op;.  if(
10fb0 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
10fc0 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31  _BLOB ) return 1
10fd0 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
10fe0 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
10ff0 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
11000 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
11010 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
11020 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
11030 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
11040 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
11050 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
11060 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
11070 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
11080 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
11090 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
110a0 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
110b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
110c0 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  LOAT: {.      re
110d0 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
110e0 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66  _AFF_REAL || aff
110f0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
11100 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
11110 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
11120 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11130 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
11140 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  EXT;.    }.    c
11150 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
11160 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
11170 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11180 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
11190 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62   assert( p->iTab
111a0 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63  le>=0 );  /* p c
111b0 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66  annot be part of
111c0 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61   a CHECK constra
111d0 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  int */.      ret
111e0 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  urn p->iColumn<0
111f0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61  .          && (a
11200 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
11210 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
11220 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
11230 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  C);.    }.    de
11240 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
11250 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
11260 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
11270 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
11280 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
11290 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
112a0 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
112b0 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
112c0 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
112d0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
112e0 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
112f0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
11300 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
11310 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
11320 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
11330 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
11340 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
11350 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
11360 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
11370 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f 66  pX is the RHS of
11380 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e   an IN operator.
11390 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45 4c    If pX is a SEL
113a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a  ECT statement .*
113b0 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 69  * that can be si
113c0 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69  mplified to a di
113d0 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65 73  rect table acces
113e0 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  s, then return.*
113f0 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
11400 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
11410 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e  ent.  If pX is n
11420 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ot a SELECT stat
11430 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20  ement,.** or if 
11440 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
11450 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65  ment needs to be
11460 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f   manifested into
11470 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20   a transient.** 
11480 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75  table, then retu
11490 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e  rn NULL..*/.#ifn
114a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
114b0 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20  SUBQUERY.static 
114c0 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64  Select *isCandid
114d0 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72  ateForInOpt(Expr
114e0 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20   *pX){.  Select 
114f0 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  *p;.  SrcList *p
11500 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Src;.  ExprList 
11510 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
11520 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b   *pTab;.  int i;
11530 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
11540 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
11550 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74 75  IsSelect) ) retu
11560 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20  rn 0;  /* Not a 
11570 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  subquery */.  if
11580 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
11590 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65  y(pX, EP_VarSele
115a0 63 74 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b  ct)  ) return 0;
115b0 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20    /* Correlated 
115c0 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58  subq */.  p = pX
115d0 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69  ->x.pSelect;.  i
115e0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72  f( p->pPrior ) r
115f0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
11600 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63        /* Not a c
11610 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
11620 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
11630 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
11640 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
11650 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
11660 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
11670 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
11680 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
11690 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
116a0 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
116b0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
116c0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
116d0 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
116e0 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ate );.    retur
116f0 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49  n 0; /* No DISTI
11700 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20  NCT keyword and 
11710 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
11720 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20  ctions */.  }.  
11730 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
11740 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  pBy==0 );       
11750 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
11760 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
11770 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
11780 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
117a0 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61  Has no LIMIT cla
117b0 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
117c0 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
117d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
117e0 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20  /* Has no WHERE 
117f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63  clause */.  pSrc
11800 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
11810 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
11820 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
11830 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
11840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
11850 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d  gle term in FROM
11860 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
11870 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
11880 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ect ) return 0; 
11890 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e      /* FROM is n
118a0 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72  ot a subquery or
118b0 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20   view */.  pTab 
118c0 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
118d0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  b;.  assert( pTa
118e0 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
118f0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
11900 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
11910 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
11920 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f  is not a view */
11930 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
11940 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
11950 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f  0;        /* FRO
11960 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76  M clause not a v
11970 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
11980 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
11990 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
119a0 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f  pEList!=0 );.  /
119b0 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73  * All SELECT res
119c0 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c  ults must be col
119d0 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  umns. */.  for(i
119e0 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
119f0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
11a00 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69  xpr *pRes = pELi
11a10 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
11a20 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70      if( pRes->op
11a30 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
11a40 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65  turn 0;.    asse
11a50 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65  rt( pRes->iTable
11a60 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  ==pSrc->a[0].iCu
11a70 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20  rsor );  /* Not 
11a80 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
11a90 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72  query */.  }.  r
11aa0 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69  eturn p;.}.#endi
11ab0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11ac0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
11ad0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11ae0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
11af0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
11b00 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  hat checks the l
11b10 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
11b20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69  of index table i
11b30 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a  Cur to see if.**
11b40 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79   it contains any
11b50 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20   NULL entries.  
11b60 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74  Cause the regist
11b70 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c  er at regHasNull
11b80 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f   to be set.** to
11b90 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
11ba0 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69  e if iCur contai
11bb0 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61  ns no NULLs.  Ca
11bc0 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67  use register reg
11bd0 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65  HasNull.** to be
11be0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20   set to NULL if 
11bf0 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  iCur contains on
11c00 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
11c10 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
11c20 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74   void sqlite3Set
11c30 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65  HasNullFlag(Vdbe
11c40 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69   *v, int iCur, i
11c50 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a  nt regHasNull){.
11c60 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73    int addr1;.  s
11c70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11c80 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11c90 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
11ca0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
11cb0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11cc0 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b  P_Rewind, iCur);
11cd0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
11ce0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
11cf0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
11d00 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67  mn, iCur, 0, reg
11d10 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69  HasNull);.  sqli
11d20 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
11d30 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  v, OPFLAG_TYPEOF
11d40 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ARG);.  VdbeComm
11d50 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65  ent((v, "first_e
11d60 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43  ntry_in(%d)", iC
11d70 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ur));.  sqlite3V
11d80 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
11d90 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ddr1);.}.#endif.
11da0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11db0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
11dc0 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
11dd0 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  t is an IN opera
11de0 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20  tor with a list 
11df0 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
11e00 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68   on the .** righ
11e10 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65  t-hand side.  Re
11e20 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61  turn TRUE if tha
11e30 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61  t list is consta
11e40 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
11e50 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  t sqlite3InRhsIs
11e60 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
11e70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48  In){.  Expr *pLH
11e80 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  S;.  int res;.  
11e90 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
11ea0 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50  Property(pIn, EP
11eb0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
11ec0 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65   pLHS = pIn->pLe
11ed0 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  ft;.  pIn->pLeft
11ee0 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71   = 0;.  res = sq
11ef0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
11f00 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d  ant(pIn);.  pIn-
11f10 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20  >pLeft = pLHS;. 
11f20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23   return res;.}.#
11f30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
11f40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
11f50 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
11f60 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
11f70 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f  IN (...) operato
11f80 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72  r..** The pX par
11f90 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78  ameter is the ex
11fa0 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20  pression on the 
11fb0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
11fc0 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a  erator, which.**
11fd0 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
11fe0 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
11ff0 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71  ssions or a subq
12000 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
12010 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
12020 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  ine is to find o
12030 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
12040 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61  e object that ca
12050 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74  n.** be used eit
12060 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
12070 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68  membership in th
12080 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20  e RHS set or to 
12090 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
120a0 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  ** all members o
120b0 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73  f the RHS set, s
120c0 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74  kipping duplicat
120d0 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73  es..**.** A curs
120e0 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  or is opened on 
120f0 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
12100 74 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48  t that is the RH
12110 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
12120 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e  ator.** and pX->
12130 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
12140 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
12150 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  at cursor..**.**
12160 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
12170 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
12180 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74  tion indicates t
12190 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20  he b-tree type, 
121a0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
121b0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  *   IN_INDEX_ROW
121c0 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75  ID      - The cu
121d0 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
121e0 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61  on a database ta
121f0 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
12200 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20  EX_INDEX_ASC  - 
12210 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
12220 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65  pened on an asce
12230 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
12240 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
12250 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73  _DESC - The curs
12260 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
12270 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
12280 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
12290 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20  EX_EPH        - 
122a0 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
122b0 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69  pened on a speci
122c0 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  ally created and
122d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
122e0 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75              popu
122f0 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20  lated epheremal 
12300 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
12310 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20  NDEX_NOOP       
12320 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20  - No cursor was 
12330 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20  allocated.  The 
12340 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  IN operator must
12350 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
12370 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
12380 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70  sequence of comp
12390 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41  arisons..**.** A
123a0 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65  n existing b-tre
123b0 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  e might be used 
123c0 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65  if the RHS expre
123d0 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69  ssion pX is a si
123e0 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79  mple.** subquery
123f0 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20   such as:.**.** 
12400 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75      SELECT <colu
12410 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e  mn1>, <column2>.
12420 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  .. FROM <table>.
12430 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
12440 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
12450 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
12460 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
12470 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
12480 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
12490 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
124a0 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
124b0 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
124c0 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
124d0 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
124e0 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  t to the ephemer
124f0 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  al table instead
12500 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69   of an.** existi
12510 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ng table..**.** 
12520 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61  The inFlags para
12530 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61  meter must conta
12540 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69 6d 75 6d  in, at a minimum
12550 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74  , one of the bit
12560 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  s.** IN_INDEX_ME
12570 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49  MBERSHIP or IN_I
12580 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74 20 6e 6f  NDEX_LOOP but no
12590 74 20 62 6f 74 68 2e 20 20 49 66 20 69 6e 46 6c  t both.  If inFl
125a0 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ags contains.** 
125b0 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
125c0 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65  HIP, then the ge
125d0 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20 77 69  nerated table wi
125e0 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ll be used for a
125f0 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62 65 72 73   fast.** members
12600 68 69 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20  hip test.  When 
12610 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  the IN_INDEX_LOO
12620 50 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68  P bit is set, th
12630 65 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 0a  e IN index will.
12640 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f  ** be used to lo
12650 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  op over all valu
12660 65 73 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66  es of the RHS of
12670 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
12680 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
12690 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73  INDEX_LOOP is us
126a0 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
126b0 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
126c0 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
126d0 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
126e0 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20  mbers) then the 
126f0 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20  b-tree must not 
12700 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74  contain duplicat
12710 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65  es..** An ephere
12720 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  mal table will b
12730 65 20 63 72 65 61 74 65 64 20 75 6e 6c 65 73 73  e created unless
12740 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f   the selected co
12750 6c 75 6d 6e 73 20 61 72 65 20 67 75 61 72 61 6e  lumns are guaran
12760 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e  teed.** to be un
12770 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65  ique - either be
12780 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49  cause it is an I
12790 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
127a0 45 59 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20  EY or due to.** 
127b0 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  a UNIQUE constra
127c0 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  int or index..**
127d0 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
127e0 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20  X_MEMBERSHIP is 
127f0 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
12800 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
12810 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73  d .** for fast s
12820 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
12830 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68  sts) then an eph
12840 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
12850 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e  t .** be used un
12860 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69  less <columns> i
12870 73 20 61 20 73 69 6e 67 6c 65 20 49 4e 54 45 47  s a single INTEG
12880 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
12890 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20  olumn or an .** 
128a0 69 6e 64 65 78 20 63 61 6e 20 62 65 20 66 6f 75  index can be fou
128b0 6e 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  nd with the spec
128c0 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20  ified <columns> 
128d0 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74  as its left-most
128e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49  ..**.** If the I
128f0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20  N_INDEX_NOOP_OK 
12900 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  and IN_INDEX_MEM
12910 42 45 52 53 48 49 50 20 61 72 65 20 62 6f 74 68  BERSHIP are both
12920 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74   set and.** if t
12930 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
12940 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
12950 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75  ist (not a subqu
12960 65 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a  ery) then this.*
12970 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  * routine might 
12980 64 65 63 69 64 65 20 74 68 61 74 20 63 72 65 61  decide that crea
12990 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ting an ephemera
129a0 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d  l b-tree for mem
129b0 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69  bership.** testi
129c0 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73  ng is too expens
129d0 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49  ive and return I
129e0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49  N_INDEX_NOOP.  I
129f0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
12a00 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
12a10 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65  ine should imple
12a20 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72  ment the IN oper
12a30 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71  ator using a seq
12a40 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f  uence.** of Eq o
12a50 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  r Ne comparison 
12a60 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
12a70 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65  * When the b-tre
12a80 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  e is being used 
12a90 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74  for membership t
12aa0 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ests, the callin
12ab0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69  g function.** mi
12ac0 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77  ght need to know
12ad0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
12ae0 74 68 65 20 52 48 53 20 73 69 64 65 20 6f 66 20  the RHS side of 
12af0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
12b00 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55  ** contains a NU
12b10 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61 73  LL.  If prRhsHas
12b20 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55  Null is not a NU
12b30 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a  LL pointer and .
12b40 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ** if there is a
12b50 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  ny chance that t
12b60 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63  he (...) might c
12b70 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61  ontain a NULL va
12b80 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  lue at.** runtim
12b90 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74  e, then a regist
12ba0 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
12bb0 61 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72  and the register
12bc0 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a   number written.
12bd0 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e  ** to *prRhsHasN
12be0 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73  ull. If there is
12bf0 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
12c00 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69  the (...) contai
12c10 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  ns a.** NULL val
12c20 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48  ue, then *prRhsH
12c30 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75  asNull is left u
12c40 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
12c50 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73  If a register is
12c60 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69   allocated and i
12c70 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72  ts location stor
12c80 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e  ed in *prRhsHasN
12c90 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ull, then.** the
12ca0 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72   value in that r
12cb0 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20  egister will be 
12cc0 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72  NULL if the b-tr
12cd0 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ee contains one 
12ce0 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20  or more.** NULL 
12cf0 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77  values, and it w
12d00 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d  ill be some non-
12d10 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68  NULL value if th
12d20 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
12d30 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  s no.** NULL val
12d40 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ues..**.** If th
12d50 65 20 61 69 4d 61 70 20 70 61 72 61 6d 65 74 65  e aiMap paramete
12d60 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  r is not NULL, i
12d70 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  t must point to 
12d80 61 6e 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  an array contain
12d90 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65  ing.** one eleme
12da0 6e 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  nt for each colu
12db0 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  mn returned by t
12dc0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
12dd0 65 6e 74 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a  ent on the RHS.*
12de0 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29  * of the IN(...)
12df0 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20 69   operator. The i
12e00 27 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  'th entry of the
12e10 20 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61   array is popula
12e20 74 65 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ted with the.** 
12e30 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 69 6e  offset of the in
12e40 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  dex column that 
12e50 6d 61 74 63 68 65 73 20 74 68 65 20 69 27 74 68  matches the i'th
12e60 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64   column returned
12e70 20 62 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   by the.** SELEC
12e80 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  T. For example, 
12e90 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
12ea0 6e 20 61 6e 64 20 73 65 6c 65 63 74 65 64 20 69  n and selected i
12eb0 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ndex are:.**.** 
12ec0 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45    (?,?,?) IN (SE
12ed0 4c 45 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f  LECT a, b, c FRO
12ee0 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52 45 41 54  M t1).**   CREAT
12ef0 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
12f00 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a  (b, c, a);.**.**
12f10 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73   then aiMap[] is
12f20 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
12f30 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69  {2, 0, 1}..*/.#i
12f40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12f50 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
12f60 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
12f70 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
12f80 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
12f90 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
12fa0 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58  xt */.  Expr *pX
12fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12fc0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
12fd0 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20  hand side (RHS) 
12fe0 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
12ff0 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c  or */.  u32 inFl
13000 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
13010 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c     /* IN_INDEX_L
13020 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50  OOP, _MEMBERSHIP
13030 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f  , and/or _NOOP_O
13040 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68  K */.  int *prRh
13050 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20  sHasNull,       
13060 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
13070 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75  lding NULL statu
13080 73 2e 20 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f  s.  See notes */
13090 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 20 20  .  int *aiMap   
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
130b0 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e   Mapping from In
130c0 64 65 78 20 66 69 65 6c 64 73 20 74 6f 20 52 48  dex fields to RH
130d0 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20  S fields */.){. 
130e0 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20   Select *p;     
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13100 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
13110 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
13120 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
13130 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b    int eType = 0;
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13150 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
13160 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e  of RHS table. IN
13170 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e  _INDEX_* */.  in
13180 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
13190 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20  >nTab++;        
131a0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
131b0 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a   the RHS table *
131c0 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e  /.  int mustBeUn
131d0 69 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ique;           
131e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
131f0 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65  e if RHS must be
13200 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62   unique */.  Vdb
13210 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
13220 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
13230 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61     /* Virtual ma
13240 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65  chine being code
13250 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
13260 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
13270 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20  .  mustBeUnique 
13280 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  = (inFlags & IN_
13290 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a  INDEX_LOOP)!=0;.
132a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53  .  /* If the RHS
132b0 20 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29   of this IN(...)
132c0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 53   operator is a S
132d0 45 4c 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74  ELECT, and if it
132e0 20 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77   matters .  ** w
132f0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
13300 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20  e SELECT result 
13310 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
13320 6c 75 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74  lues, check whet
13330 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20  her.  ** or not 
13340 4e 55 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79  NULL is actually
13350 20 70 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61   possible (it ma
13360 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78  y not be, for ex
13370 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a  ample, due .  **
13380 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e   to NOT NULL con
13390 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
133a0 73 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e  schema). If no N
133b0 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70  ULL values are p
133c0 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65  ossible,.  ** se
133d0 74 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74  t prRhsHasNull t
133e0 6f 20 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  o 0 before conti
133f0 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28  nuing.  */.  if(
13400 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26   prRhsHasNull &&
13410 20 28 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pX->flags & EP
13420 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
13430 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78     int i;.    Ex
13440 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
13450 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e   pX->x.pSelect->
13460 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28  pEList;.    for(
13470 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
13480 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
13490 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
134a0 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73  rCanBeNull(pELis
134b0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
134c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
134d0 20 20 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d    if( i==pEList-
134e0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
134f0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30  prRhsHasNull = 0
13500 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13510 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
13520 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  f an existing ta
13530 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  ble or index can
13540 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a   be used to.  **
13550 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65   satisfy the que
13560 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65  ry.  This is pre
13570 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ferable to gener
13580 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a  ating a new .  *
13590 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  * ephemeral tabl
135a0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  e.  */.  if( pPa
135b0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20  rse->nErr==0 && 
135c0 28 70 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65  (p = isCandidate
135d0 46 6f 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30  ForInOpt(pX))!=0
135e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
135f0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
13600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
13610 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
13620 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62  ction */.    Tab
13630 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13650 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61      /* Table <ta
13660 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36  ble>. */.    i16
13670 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
136a0 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  idx for pTab */.
136b0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
136c0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
136d0 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  ;.    int nExpr 
136e0 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
136f0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
13700 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20  >pEList!=0 );   
13710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
13720 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
13730 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
13740 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
13750 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
13760 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63  xpr!=0 ); /* Bec
13770 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
13780 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
13790 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
137a0 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20  >pSrc!=0 );     
137b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
137c0 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
137d0 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
137e0 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e  /.    pTab = p->
137f0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
13800 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e  ..    /* Code an
13810 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20   OP_Transaction 
13820 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  and OP_TableLock
13830 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f   for <table>. */
13840 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
13850 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
13860 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
13870 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  a);.    sqlite3C
13880 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
13890 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
138a0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
138b0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
138c0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
138d0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
138e0 20 20 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a    assert(v);  /*
138f0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
13900 29 20 68 61 73 20 61 6c 77 61 79 73 20 62 65 65  ) has always bee
13910 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  n previously cal
13920 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  led */.    if( n
13930 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73  Expr==1 && pELis
13940 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69  t->a[0].pExpr->i
13950 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
13960 20 20 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28    /* The "x IN (
13970 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
13980 4d 20 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a  M table)" case *
13990 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64  /.      int iAdd
139a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
139b0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
139c0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
139d0 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20  erage(v);..     
139e0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
139f0 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
13a00 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
13a10 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65  enRead);.      e
13a20 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
13a30 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71  ROWID;..      sq
13a40 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
13a50 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
13a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
13a70 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
13aa0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
13ab0 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b   int affinity_ok
13ac0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
13ad0 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  i;..      /* Che
13ae0 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69  ck that the affi
13af0 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62  nity that will b
13b00 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72  e used to perfor
13b10 6d 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a  m each .      **
13b20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
13b30 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61  he same as the a
13b40 66 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68 20  ffinity of each 
13b50 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a  column in table.
13b60 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
13b70 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
13b80 65 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 6e  erator.  If it n
13b90 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ot, it is not po
13ba0 73 73 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ssible to.      
13bb0 2a 2a 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78  ** use any index
13bc0 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
13bd0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  e.  */.      for
13be0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26  (i=0; i<nExpr &&
13bf0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b   affinity_ok; i+
13c00 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
13c10 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33   *pLhs = sqlite3
13c20 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
13c30 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29  pr(pX->pLeft, i)
13c40 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  ;.        int iC
13c50 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  ol = pEList->a[i
13c60 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
13c70 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 69  ;.        char i
13c80 64 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54  dxaff = sqlite3T
13c90 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
13ca0 74 79 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f  ty(pTab,iCol); /
13cb0 2a 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20  * RHS table */. 
13cc0 20 20 20 20 20 20 20 63 68 61 72 20 63 6d 70 61         char cmpa
13cd0 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
13ce0 61 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73  areAffinity(pLhs
13cf0 2c 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20  , idxaff);.     
13d00 20 20 20 74 65 73 74 63 61 73 65 28 20 63 6d 70     testcase( cmp
13d10 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
13d20 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 20 20  BLOB );.        
13d30 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66  testcase( cmpaff
13d40 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
13d50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69  T );.        swi
13d60 74 63 68 28 20 63 6d 70 61 66 66 20 29 7b 0a 20  tch( cmpaff ){. 
13d70 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
13d80 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20  LITE_AFF_BLOB:. 
13d90 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
13da0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ;.          case
13db0 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
13dc0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  :.            /*
13dd0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
13de0 66 66 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72  ffinity() only r
13df0 65 74 75 72 6e 73 20 54 45 58 54 20 69 66 20 6f  eturns TEXT if o
13e00 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20  ne side or the. 
13e10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74             ** ot
13e20 68 65 72 20 68 61 73 20 6e 6f 20 61 66 66 69 6e  her has no affin
13e30 69 74 79 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ity and the othe
13e40 72 20 73 69 64 65 20 69 73 20 54 45 58 54 2e 20  r side is TEXT. 
13e50 20 48 65 6e 63 65 2c 0a 20 20 20 20 20 20 20 20   Hence,.        
13e60 20 20 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20      ** the only 
13e70 77 61 79 20 66 6f 72 20 63 6d 70 61 66 66 20 74  way for cmpaff t
13e80 6f 20 62 65 20 54 45 58 54 20 69 73 20 66 6f 72  o be TEXT is for
13e90 20 69 64 78 61 66 66 20 74 6f 20 62 65 20 54 45   idxaff to be TE
13ea0 58 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  XT.            *
13eb0 2a 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 65  * and for the te
13ec0 72 6d 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  rm on the LHS of
13ed0 20 74 68 65 20 49 4e 20 74 6f 20 68 61 76 65 20   the IN to have 
13ee0 6e 6f 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  no affinity. */.
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
13f00 72 74 28 20 69 64 78 61 66 66 3d 3d 53 51 4c 49  rt( idxaff==SQLI
13f10 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
13f20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
13f30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61  ;.          defa
13f40 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ult:.           
13f50 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73   affinity_ok = s
13f60 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
13f70 66 66 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b  ffinity(idxaff);
13f80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13f90 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 61 66   }..      if( af
13fa0 66 69 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20  finity_ok ){.   
13fb0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
13fc0 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69  or an existing i
13fd0 6e 64 65 78 20 74 68 61 74 20 77 69 6c 6c 20 77  ndex that will w
13fe0 6f 72 6b 20 66 6f 72 20 74 68 69 73 20 49 4e 20  ork for this IN 
13ff0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
14000 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
14010 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
14020 26 26 20 65 54 79 70 65 3d 3d 30 3b 20 70 49 64  && eType==0; pId
14030 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
14040 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
14050 6b 20 63 6f 6c 55 73 65 64 3b 20 20 20 20 20 20  k colUsed;      
14060 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  /* Columns of th
14070 65 20 69 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a  e index used */.
14080 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
14090 6b 20 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  k mCol;         
140a0 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20  /* Mask for the 
140b0 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a  current column *
140c0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
140d0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45  pIdx->nColumn<nE
140e0 78 70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  xpr ) continue;.
140f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
14100 69 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20  imum nColumn is 
14110 42 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31  BMS-2, not BMS-1
14120 2c 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  , so that we can
14130 20 63 6f 6d 70 75 74 65 0a 20 20 20 20 20 20 20   compute.       
14140 20 20 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45     ** BITMASK(nE
14150 78 70 72 29 20 77 69 74 68 6f 75 74 20 6f 76 65  xpr) without ove
14160 72 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20  rflowing */.    
14170 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14180 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42  pIdx->nColumn==B
14190 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  MS-2 );.        
141a0 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78    testcase( pIdx
141b0 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31  ->nColumn==BMS-1
141c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
141d0 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
141e0 3d 42 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75  =BMS-1 ) continu
141f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
14200 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 29 7b   mustBeUnique ){
14210 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
14220 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e   pIdx->nKeyCol>n
14230 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20  Expr.           
14240 20 20 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75    ||(pIdx->nColu
14250 6d 6e 3e 6e 45 78 70 72 20 26 26 20 21 49 73 55  mn>nExpr && !IsU
14260 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
14270 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b  ).            ){
14280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
14290 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69  ontinue;  /* Thi
142a0 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75  s index is not u
142b0 6e 69 71 75 65 20 6f 76 65 72 20 74 68 65 20 49  nique over the I
142c0 4e 20 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f  N RHS columns */
142d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
142e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
142f0 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20          colUsed 
14300 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  = 0;   /* Column
14310 73 20 6f 66 20 69 6e 64 65 78 20 75 73 65 64 20  s of index used 
14320 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
14330 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
14340 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
14350 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
14360 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  hs = sqlite3Vect
14370 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
14380 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  X->pLeft, i);.  
14390 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
143a0 70 52 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pRhs = pEList->a
143b0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
143c0 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
143d0 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69  pReq = sqlite3Bi
143e0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
143f0 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c  eq(pParse, pLhs,
14400 20 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20   pRhs);.        
14410 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20      int j;.  .  
14420 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
14430 28 20 70 52 65 71 21 3d 30 20 7c 7c 20 70 52 68  ( pReq!=0 || pRh
14440 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52  s->iColumn==XN_R
14450 4f 57 49 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e  OWID || pParse->
14460 6e 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20  nErr );.        
14470 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
14480 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
14490 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
144a0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21  dx->aiColumn[j]!
144b0 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29  =pRhs->iColumn )
144c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
144d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
144e0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
144f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
14500 20 20 69 66 28 20 70 52 65 71 21 3d 30 20 26 26    if( pReq!=0 &&
14510 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
14520 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64  pReq->zName, pId
14530 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30  x->azColl[j])!=0
14540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14550 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
14560 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
14570 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
14580 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
14590 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
145a0 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62 72 65 61   j==nExpr ) brea
145b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  k;.            m
145c0 43 6f 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29  Col = MASKBIT(j)
145d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
145e0 28 20 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64  ( mCol & colUsed
145f0 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63   ) break; /* Eac
14600 68 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e  h column used on
14610 6c 79 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20  ly once */.     
14620 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c         colUsed |
14630 3d 20 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = mCol;.        
14640 20 20 20 20 69 66 28 20 61 69 4d 61 70 20 29 20      if( aiMap ) 
14650 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20  aiMap[i] = j;.  
14660 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
14670 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
14680 3d 3d 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73  ==nExpr || colUs
14690 65 64 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78  ed!=(MASKBIT(nEx
146a0 70 72 29 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  pr)-1) );.      
146b0 20 20 20 20 69 66 28 20 63 6f 6c 55 73 65 64 3d      if( colUsed=
146c0 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29  =(MASKBIT(nExpr)
146d0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
146e0 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
146f0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
14700 61 74 20 6d 65 61 6e 73 20 74 68 65 20 69 6e 64  at means the ind
14710 65 78 20 70 49 64 78 20 69 73 20 75 73 61 62 6c  ex pIdx is usabl
14720 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
14730 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
14740 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
14750 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
14760 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 23 69 66  Coverage(v);.#if
14770 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14780 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 20 20 20  _EXPLAIN.       
14790 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
147a0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
147b0 6c 61 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  lain, 0, 0, 0,. 
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
147d0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
147e0 22 55 53 49 4e 47 20 49 4e 44 45 58 20 25 73 20  "USING INDEX %s 
147f0 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22  FOR IN-OPERATOR"
14800 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20  ,pIdx->zName),. 
14810 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
14820 44 59 4e 41 4d 49 43 29 3b 0a 23 65 6e 64 69 66  DYNAMIC);.#endif
14830 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
14840 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14850 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
14860 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
14870 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20   iDb);.         
14880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
14890 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
148a0 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
148b0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
148c0 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
148d0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
148e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49         assert( I
148f0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
14900 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  SC == IN_INDEX_I
14910 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20  NDEX_ASC+1 );.  
14920 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
14930 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
14940 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f  _ASC + pIdx->aSo
14950 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20  rtOrder[0];.  . 
14960 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
14970 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23  rRhsHasNull ){.#
14980 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
14990 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
149a0 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 20 20 20  MASK.           
149b0 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20 28 31     i64 mask = (1
149c0 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20 20 20  <<nExpr)-1;.    
149d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
149e0 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
149f0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  v, OP_ColumnsUse
14a00 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
14a10 20 20 20 20 20 20 69 54 61 62 2c 20 30 2c 20 30        iTab, 0, 0
14a20 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34  , (u8*)&mask, P4
14a30 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a  _INT64);.#endif.
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
14a50 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b  rRhsHasNull = ++
14a60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14a70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14a80 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
14a90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14aa0 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
14ab0 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68  g(v, iTab, *prRh
14ac0 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
14ad0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14ae0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14af0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14b00 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
14b10 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
14b20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64          } /* End
14b30 20 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65 78   loop over index
14b40 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a  es */.      } /*
14b50 20 45 6e 64 20 69 66 28 20 61 66 66 69 6e 69 74   End if( affinit
14b60 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20  y_ok ) */.    } 
14b70 2f 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e  /* End if not an
14b80 20 72 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a   rowid index */.
14b90 20 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d    } /* End attem
14ba0 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75  pt to optimize u
14bb0 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f  sing an index */
14bc0 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65  ..  /* If no pre
14bd0 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69  existing index i
14be0 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  s available for 
14bf0 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20  the IN clause.  
14c00 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  ** and IN_INDEX_
14c10 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77  NOOP is an allow
14c20 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e  ed reply.  ** an
14c30 64 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  d the RHS of the
14c40 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
14c50 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75  a list, not a su
14c60 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20  bquery.  ** and 
14c70 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63  the RHS is not c
14c80 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61 73 20 74  onstant or has t
14c90 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d  wo or fewer term
14ca0 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20  s,.  ** then it 
14cb0 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65  is not worth cre
14cc0 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ating an ephemer
14cd0 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c  al table to eval
14ce0 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e  uate.  ** the IN
14cf0 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74   operator so ret
14d00 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  urn IN_INDEX_NOO
14d10 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  P..  */.  if( eT
14d20 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e  ype==0.   && (in
14d30 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
14d40 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20  _NOOP_OK).   && 
14d50 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
14d60 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
14d70 74 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74  t).   && (!sqlit
14d80 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e  e3InRhsIsConstan
14d90 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70  t(pX) || pX->x.p
14da0 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a  List->nExpr<=2).
14db0 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d    ){.    eType =
14dc0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a   IN_INDEX_NOOP;.
14dd0 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
14de0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  ==0 ){.    /* Co
14df0 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20  uld not find an 
14e00 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
14e10 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61  r index to use a
14e20 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65  s the RHS b-tree
14e30 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c  ..    ** We will
14e40 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74   have to generat
14e50 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
14e60 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a  able to do the j
14e70 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ob..    */.    u
14e80 33 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  32 savedNQueryLo
14e90 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
14ea0 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  eryLoop;.    int
14eb0 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
14ec0 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  0;.    eType = I
14ed0 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20  N_INDEX_EPH;.   
14ee0 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49   if( inFlags & I
14ef0 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a  N_INDEX_LOOP ){.
14f00 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51        pParse->nQ
14f10 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20  ueryLoop = 0;.  
14f20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66      if( pX->pLef
14f30 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20  t->iColumn<0 && 
14f40 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
14f50 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
14f60 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54  t) ){.        eT
14f70 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
14f80 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OWID;.      }.  
14f90 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68    }else if( prRh
14fa0 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  sHasNull ){.    
14fb0 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
14fc0 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  = rMayHaveNull =
14fd0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
14fe0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
14ff0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
15000 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79  pParse, pX, rMay
15010 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d  HaveNull, eType=
15020 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29  =IN_INDEX_ROWID)
15030 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51  ;.    pParse->nQ
15040 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64  ueryLoop = saved
15050 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65  NQueryLoop;.  }e
15060 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61  lse{.    pX->iTa
15070 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a  ble = iTab;.  }.
15080 0a 20 20 69 66 28 20 61 69 4d 61 70 20 26 26 20  .  if( aiMap && 
15090 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f  eType!=IN_INDEX_
150a0 49 4e 44 45 58 5f 41 53 43 20 26 26 20 65 54 79  INDEX_ASC && eTy
150b0 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe!=IN_INDEX_IND
150c0 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69  EX_DESC ){.    i
150d0 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d  nt i, n;.    n =
150e0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
150f0 6f 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74  orSize(pX->pLeft
15100 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
15110 69 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b  i<n; i++) aiMap[
15120 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65  i] = i;.  }.  re
15130 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65  turn eType;.}.#e
15140 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
15150 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15160 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  RY./*.** Argumen
15170 74 20 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f  t pExpr is an (?
15180 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20  , ?...) IN(...) 
15190 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73  expression. This
151a0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c   .** function al
151b0 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
151c0 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  rns a nul-termin
151d0 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74  ated string cont
151e0 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61  aining .** the a
151f0 66 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20  ffinities to be 
15200 75 73 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f  used for each co
15210 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70  lumn of the comp
15220 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74  arison..**.** It
15230 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
15240 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
15250 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74  ller to ensure t
15260 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64  hat the returned
15270 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76  .** string is ev
15280 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
15290 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
152a0 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
152b0 63 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69  char *exprINAffi
152c0 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
152d0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
152e0 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20  {.  Expr *pLeft 
152f0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
15300 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
15310 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
15320 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c  ze(pLeft);.  Sel
15330 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28  ect *pSelect = (
15340 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
15350 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70  P_xIsSelect) ? p
15360 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
15370 3a 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  : 0;.  char *zRe
15380 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45  t;..  assert( pE
15390 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29  xpr->op==TK_IN )
153a0 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74  ;.  zRet = sqlit
153b0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50  e3DbMallocRaw(pP
153c0 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31  arse->db, nVal+1
153d0 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  );.  if( zRet ){
153e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
153f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b  for(i=0; i<nVal;
15400 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
15410 72 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56  r *pA = sqlite3V
15420 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
15430 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
15440 20 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69     char a = sqli
15450 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
15460 70 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pA);.      if( p
15470 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
15480 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69    zRet[i] = sqli
15490 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
154a0 74 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  ty(pSelect->pELi
154b0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
154c0 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  a);.      }else{
154d0 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d  .        zRet[i]
154e0 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = a;.      }.  
154f0 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61    }.    zRet[nVa
15500 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  l] = '\0';.  }. 
15510 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
15520 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
15530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
15540 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  UERY./*.** Load 
15550 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
15560 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
15570 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69  irst argument wi
15580 74 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  th an error .** 
15590 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66  message of the f
155a0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75  orm:.**.**   "su
155b0 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
155c0 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70   N columns - exp
155d0 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76  ected M".*/   .v
155e0 6f 69 64 20 73 71 6c 69 74 65 33 53 75 62 73 65  oid sqlite3Subse
155f0 6c 65 63 74 45 72 72 6f 72 28 50 61 72 73 65 20  lectError(Parse 
15600 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63  *pParse, int nAc
15610 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63  tual, int nExpec
15620 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
15630 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65   *zFmt = "sub-se
15640 6c 65 63 74 20 72 65 74 75 72 6e 73 20 25 64 20  lect returns %d 
15650 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
15660 65 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65  ed %d";.  sqlite
15670 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15680 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c  , zFmt, nActual,
15690 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e   nExpect);.}.#en
156a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65  dif../*.** Expre
156b0 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61  ssion pExpr is a
156c0 20 76 65 63 74 6f 72 20 74 68 61 74 20 68 61 73   vector that has
156d0 20 62 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20   been used in a 
156e0 63 6f 6e 74 65 78 74 20 77 68 65 72 65 0a 2a 2a  context where.**
156f0 20 69 74 20 69 73 20 6e 6f 74 20 70 65 72 6d 69   it is not permi
15700 74 74 65 64 2e 20 49 66 20 70 45 78 70 72 20 69  tted. If pExpr i
15710 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 76  s a sub-select v
15720 65 63 74 6f 72 2c 20 74 68 69 73 20 72 6f 75 74  ector, this rout
15730 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73 20 74 68  ine .** loads th
15740 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 77  e Parse object w
15750 69 74 68 20 61 20 6d 65 73 73 61 67 65 20 6f 66  ith a message of
15760 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
15770 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72     "sub-select r
15780 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73  eturns N columns
15790 20 2d 20 65 78 70 65 63 74 65 64 20 31 22 0a 2a   - expected 1".*
157a0 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 74 20 69  *.** Or, if it i
157b0 73 20 61 20 72 65 67 75 6c 61 72 20 73 63 61 6c  s a regular scal
157c0 61 72 20 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a  ar vector:.**.**
157d0 20 20 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69     "row value mi
157e0 73 75 73 65 64 22 0a 2a 2f 20 20 20 0a 76 6f 69  sused".*/   .voi
157f0 64 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45  d sqlite3VectorE
15800 72 72 6f 72 4d 73 67 28 50 61 72 73 65 20 2a 70  rrorMsg(Parse *p
15810 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
15820 70 72 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  pr){.#ifndef SQL
15830 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
15840 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  Y.  if( pExpr->f
15850 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
15860 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
15870 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
15880 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15890 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
158a0 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  t->nExpr, 1);.  
158b0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
158c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
158d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f  rMsg(pParse, "ro
158e0 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
158f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15900 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
15910 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72  r scalar subquer
15920 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75  ies used as a su
15930 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f  bquery expressio
15940 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72  n, EXISTS,.** or
15950 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20   IN operators.  
15960 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
15970 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52      (SELECT a FR
15980 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d  OM b)          -
15990 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  - subquery.**   
159a0 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54    EXISTS (SELECT
159b0 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20   a FROM b)   -- 
159c0 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a  EXISTS subquery.
159d0 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35  **     x IN (4,5
159e0 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20  ,11)            
159f0 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
15a00 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69   with list on ri
15a10 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a  ght-hand side.**
15a20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
15a30 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
15a40 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
15a50 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20  ith subquery on 
15a60 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20  the right.**.** 
15a70 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65  The pExpr parame
15a80 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68  ter describes th
15a90 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
15aa0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
15ab0 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72  N.** operator or
15ac0 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
15ad0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73   If parameter is
15ae0 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
15af0 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69  o, then expressi
15b00 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72  on pExpr is guar
15b10 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
15b20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f  of the form "<ro
15b30 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f  wid> IN (?, ?, ?
15b40 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64  )", where <rowid
15b50 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  > is a reference
15b60 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65  .** to some inte
15b70 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f  ger key column o
15b80 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65  f a table B-Tree
15b90 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
15ba0 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79  use an.** intkey
15bb0 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65   B-Tree to store
15bc0 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e   the set of IN(.
15bd0 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65  ..) values inste
15be0 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a  ad of the usual.
15bf0 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69  ** (slower) vari
15c00 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73  able length keys
15c10 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49   B-Tree..**.** I
15c20 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69  f rMayHaveNull i
15c30 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74  s non-zero, that
15c40 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
15c50 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20  operation is an 
15c60 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c  IN.** (not a SEL
15c70 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20 61  ECT or EXISTS) a
15c80 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53 20  nd that the RHS 
15c90 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e  might contains N
15ca0 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69  ULLs..** All thi
15cb0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69  s routine does i
15cc0 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  s initialize the
15cd0 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20   register given 
15ce0 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a  by rMayHaveNull.
15cf0 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c  ** to NULL.  Cal
15d00 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69  ling routines wi
15d10 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20  ll take care of 
15d20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65  changing this re
15d30 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20  gister.** value 
15d40 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74  to non-NULL if t
15d50 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66  he RHS is NULL-f
15d60 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ree..**.** For a
15d70 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
15d80 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75  S operator, retu
15d90 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
15da0 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a  that holds the.*
15db0 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 61  * result.  For a
15dc0 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53 45   multi-column SE
15dd0 4c 45 43 54 2c 20 74 68 65 20 72 65 73 75 6c 74  LECT, the result
15de0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20   is stored in a 
15df0 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a 20 61 72  contiguous.** ar
15e00 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
15e10 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20   and the return 
15e20 76 61 6c 75 65 20 69 73 20 74 68 65 20 72 65 67  value is the reg
15e30 69 73 74 65 72 20 6f 66 20 74 68 65 20 6c 65 66  ister of the lef
15e40 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73 75 6c 74  t-most.** result
15e50 20 63 6f 6c 75 6d 6e 2e 20 20 52 65 74 75 72 6e   column.  Return
15e60 20 30 20 66 6f 72 20 49 4e 20 6f 70 65 72 61 74   0 for IN operat
15e70 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72  ors or if an err
15e80 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23 69  or occurs..*/.#i
15e90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15ea0 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
15eb0 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
15ec0 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
15ed0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
15ee0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
15ef0 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
15f00 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr,            /
15f10 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54  * The IN, SELECT
15f20 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  , or EXISTS oper
15f30 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 48  ator */.  int rH
15f40 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20 20  asNullFlag,     
15f50 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
15f60 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68  at records wheth
15f70 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69  er NULLs exist i
15f80 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  n RHS */.  int i
15f90 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  sRowid          
15fa0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c     /* If true, L
15fb0 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  HS of IN operato
15fc0 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a  r is a rowid */.
15fd0 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44 79  ){.  int jmpIfDy
15fe0 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20 20  namic = -1;     
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16000 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73   /* One-time tes
16010 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69  t address */.  i
16020 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20  nt rReg = 0;    
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
16050 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c  er storing resul
16060 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ting */.  Vdbe *
16070 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16080 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
16090 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
160a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
160b0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
160c0 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
160d0 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  The evaluation o
160e0 66 20 74 68 65 20 49 4e 2f 45 58 49 53 54 53 2f  f the IN/EXISTS/
160f0 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 72  SELECT must be r
16100 65 70 65 61 74 65 64 20 65 76 65 72 79 20 74 69  epeated every ti
16110 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e  me it.  ** is en
16120 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e 79  countered if any
16130 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
16140 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a  g is true:.  **.
16150 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
16160 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
16170 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
16180 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20  ubquery.  **    
16190 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
161a0 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70  d side is an exp
161b0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
161c0 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65  taining variable
161d0 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20  s.  **    *  We 
161e0 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69  are inside a tri
161f0 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gger.  **.  ** I
16200 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
16210 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68  ve are false, th
16220 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68  en we can run th
16230 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63  is code just onc
16240 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20  e.  ** save the 
16250 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75  results, and reu
16260 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  se the same resu
16270 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74  lt on subsequent
16280 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20   invocations..  
16290 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  */.  if( !ExprHa
162a0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
162b0 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29   EP_VarSelect) )
162c0 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d  {.    jmpIfDynam
162d0 69 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ic = sqlite3Vdbe
162e0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
162f0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
16300 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  (v);.  }..#ifnde
16310 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
16320 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72  PLAIN.  if( pPar
16330 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
16340 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  {.    char *zMsg
16350 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
16360 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45  f(pParse->db, "E
16370 58 45 43 55 54 45 20 25 73 25 73 20 53 55 42 51  XECUTE %s%s SUBQ
16380 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20  UERY %d",.      
16390 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d    jmpIfDynamic>=
163a0 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44  0?"":"CORRELATED
163b0 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70   ",.        pExp
163c0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49  r->op==TK_IN?"LI
163d0 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a 20 20  ST":"SCALAR",.  
163e0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 4e        pParse->iN
163f0 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20  extSelectId.    
16400 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
16410 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
16420 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
16430 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
16440 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72  Select) && pExpr
16450 2d 3e 78 2e 70 53 65 6c 65 63 74 21 3d 30 20 29  ->x.pSelect!=0 )
16460 7b 0a 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  {.       zMsg = 
16470 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
16480 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 7a 20 28  Parse->db, "%z (
16490 25 73 29 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20  %s)", zMsg,.    
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164b0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
164c0 78 2e 70 53 65 6c 65 63 74 2d 3e 7a 53 65 6c 4e  x.pSelect->zSelN
164d0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ame);.    }.#end
164e0 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
164f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
16500 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
16510 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
16520 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
16530 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  C);.  }.#endif..
16540 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
16550 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
16560 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
16570 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
16580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
16590 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
165a0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
165b0 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ction */.      E
165c0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
165d0 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68  pr->pLeft; /* th
165e0 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
165f0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
16600 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
16610 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  nfo = 0;      /*
16620 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   Key information
16630 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56   */.      int nV
16640 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
16650 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
16660 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f   vector pLeft */
16670 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 56  .      .      nV
16680 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
16690 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
166a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
166b0 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61   !isRowid || nVa
166c0 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  l==1 );..      /
166d0 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69  * Whether this i
166e0 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43  s an 'x IN(SELEC
166f0 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20  T...)' or an 'x 
16700 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a  IN(<exprlist>)'.
16710 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
16720 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65  ion it is handle
16730 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20  d the same way. 
16740 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   An ephemeral ta
16750 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  ble is .      **
16760 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e 64   filled with ind
16770 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e  ex keys represen
16780 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
16790 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
167a0 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74 68   ** SELECT or th
167b0 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
167c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
167d0 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
167e0 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
167f0 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
16800 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
16810 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
16820 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
16830 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
16840 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
16850 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
16860 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
16870 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
16880 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
16890 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
168a0 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
168b0 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
168c0 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
168d0 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
168e0 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
168f0 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
16900 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
16910 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
16920 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
16930 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
16940 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
16950 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
16960 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
16970 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
16980 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
16990 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
169a0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
169b0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
169c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
169d0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
169e0 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 45  l, .          pE
169f0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73  xpr->iTable, (is
16a00 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a  Rowid?0:nVal));.
16a10 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
16a20 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73   isRowid ? 0 : s
16a30 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
16a40 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
16a50 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  Val, 1);..      
16a60 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
16a70 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
16a80 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
16a90 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
16aa0 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
16ab0 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
16ac0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
16ad0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
16ae0 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
16af0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
16b00 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
16b10 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
16b20 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
16b30 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
16b40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16b50 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
16b60 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  t = pExpr->x.pSe
16b70 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 45 78  lect;.        Ex
16b80 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
16b90 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
16ba0 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
16bb0 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20  t( !isRowid );. 
16bc0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
16bd0 20 4c 48 53 20 61 6e 64 20 52 48 53 20 6f 66 20   LHS and RHS of 
16be0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
16bf0 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68  do not match, th
16c00 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72  at.        ** er
16c10 72 6f 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ror will have be
16c20 65 6e 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62  en caught long b
16c30 65 66 6f 72 65 20 77 65 20 72 65 61 63 68 20 74  efore we reach t
16c40 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
16c50 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
16c60 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  (pEList->nExpr==
16c70 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  nVal) ){.       
16c80 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
16c90 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  st;.          in
16ca0 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73  t i;.          s
16cb0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
16cc0 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
16cd0 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Set, pExpr->iTab
16ce0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  le);.          d
16cf0 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20 65  est.zAffSdst = e
16d00 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50  xprINAffinity(pP
16d10 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
16d20 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d          pSelect-
16d30 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
16d40 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
16d50 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61   pSelect->selFla
16d60 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
16d70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
16d80 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f  stcase( pKeyInfo
16d90 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64  ==0 ); /* Caused
16da0 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74   by OOM in sqlit
16db0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29  e3KeyInfoAlloc()
16dc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
16dd0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
16de0 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
16df0 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
16e00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
16e10 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
16e20 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b   dest.zAffSdst);
16e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
16e40 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
16e50 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  (pKeyInfo);.    
16e60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
16e70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16e80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
16e90 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
16ea0 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29  , dest.zAffSdst)
16eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
16ec0 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20  rt( pKeyInfo!=0 
16ed0 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63  ); /* OOM will c
16ee0 61 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20  ause exit after 
16ef0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
16f00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
16f10 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
16f20 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
16f30 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt( pEList->nExp
16f40 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  r>0 );.         
16f50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16f60 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
16f70 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a  le(pKeyInfo) );.
16f80 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
16f90 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b  0; i<nVal; i++){
16fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
16fb0 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65  r *p = sqlite3Ve
16fc0 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
16fd0 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  (pLeft, i);.    
16fe0 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
16ff0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  ->aColl[i] = sql
17000 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
17010 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20 20  eCollSeq(.      
17020 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
17030 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  , p, pEList->a[i
17040 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20 20  ].pExpr.        
17050 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
17060 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17070 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
17080 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  AYS(pExpr->x.pLi
17090 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
170a0 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
170b0 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
170c0 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st).        **. 
170d0 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61         ** For ea
170e0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62  ch expression, b
170f0 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65  uild an index ke
17100 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75  y from the evalu
17110 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
17120 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e    ** store it in
17130 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
17140 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20  able. If <expr> 
17150 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
17160 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  n use.        **
17170 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66   that columns af
17180 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c  finity when buil
17190 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e  ding index keys.
171a0 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f   If <expr> is no
171b0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  t.        ** a c
171c0 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72  olumn, use numer
171d0 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  ic affinity..   
171e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
171f0 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
17200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
17210 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53  inity of the LHS
17220 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20   of the IN */.  
17230 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
17240 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
17250 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
17260 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73  pList;.        s
17270 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
17280 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
17290 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
172a0 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 61 66 66  r3;..        aff
172b0 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
172c0 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
172d0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
172e0 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
172f0 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
17300 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
17310 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  B;.        }.   
17320 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
17330 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  o ){.          a
17340 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
17350 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
17360 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20  (pKeyInfo) );.  
17370 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
17380 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c  ->aColl[0] = sql
17390 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
173a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
173b0 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Left);.        }
173c0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
173d0 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
173e0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
173f0 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
17400 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
17410 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
17420 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
17430 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17440 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17450 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
17460 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
17470 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
17480 30 2c 20 72 32 2c 20 30 2c 20 22 22 2c 20 50 34  0, r2, 0, "", P4
17490 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
174a0 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
174b0 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
174c0 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
174d0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
174e0 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
174f0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
17500 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
17510 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
17520 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
17530 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
17540 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
17550 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
17560 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
17570 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
17580 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
17590 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
175a0 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
175b0 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
175c0 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
175d0 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
175e0 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
175f0 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
17600 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
17610 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
17620 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
17630 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
17640 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
17650 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
17660 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
17670 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
17680 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
17690 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49  geToNoop(v, jmpI
176a0 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20  fDynamic);.     
176b0 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
176c0 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mic = -1;.      
176d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
176e0 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
176f0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
17700 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
17710 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
17720 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
17730 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65  sRowid && sqlite
17740 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
17750 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20  E2, &iValToIns) 
17760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
17770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17780 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74  (v, OP_InsertInt
17790 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
177a0 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b   r2, iValToIns);
177b0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
177c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33  {.            r3
177d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
177e0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
177f0 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
17800 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
17810 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
17820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17830 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
17840 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20  BeInt, r3,.     
17850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17860 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17870 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17880 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
17890 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
178a0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
178b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
178c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
178d0 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
178e0 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20  ble, r2, r3);.  
178f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
17900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
17910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17920 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
17930 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
17940 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
17950 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17960 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
17970 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
17980 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r3, 1);.      
17990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
179a0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
179b0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45  OP_IdxInsert, pE
179c0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
179d0 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r3, 1);.       
179e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
179f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17a00 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
17a10 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17a20 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
17a30 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17a40 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
17a50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17a60 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
17a70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17a80 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
17a90 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b  addr, (void *)pK
17aa0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
17ab0 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
17ac0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17ad0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
17ae0 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
17af0 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66  _SELECT:.    def
17b00 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
17b10 20 43 61 73 65 20 33 3a 20 20 20 20 28 53 45 4c   Case 3:    (SEL
17b20 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e  ECT ... FROM ...
17b30 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6f  ).      **     o
17b40 72 3a 20 20 20 20 45 58 49 53 54 53 28 53 45 4c  r:    EXISTS(SEL
17b50 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e  ECT ... FROM ...
17b60 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ).      **.     
17b70 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54   ** For a SELECT
17b80 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
17b90 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75 65  to put the value
17ba0 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  s for all column
17bb0 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  s of.      ** th
17bc0 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74 6f  e first row into
17bd0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
17be0 69 73 74 65 72 73 20 61 6e 64 20 72 65 74 75 72  isters and retur
17bf0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 20  n the index of. 
17c00 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73       ** the firs
17c10 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20  t register..    
17c20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
17c30 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53   this is an EXIS
17c40 54 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e 74  TS, write an int
17c50 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73  eger 0 (not exis
17c60 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73  ts) or 1 (exists
17c70 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ).      ** into 
17c80 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 72  a register and r
17c90 65 74 75 72 6e 20 74 68 61 74 20 72 65 67 69 73  eturn that regis
17ca0 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20  ter number..    
17cb0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e    **.      ** In
17cc0 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65   both cases, the
17cd0 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e   query is augmen
17ce0 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20  ted with "LIMIT 
17cf0 31 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20 20  1".  Any .      
17d00 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 6c  ** preexisting l
17d10 69 6d 69 74 20 69 73 20 64 69 73 63 61 72 64 65  imit is discarde
17d20 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  d in place of th
17d30 65 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20  e new LIMIT 1.. 
17d40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65       */.      Se
17d50 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d70 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
17d80 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64  atement to encod
17d90 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  e */.      Selec
17da0 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
17db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17dc0 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20   /* How to deal 
17dd0 77 69 74 68 20 53 45 4c 45 43 54 20 72 65 73 75  with SELECT resu
17de0 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
17df0 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
17e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e10 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74    /* Registers t
17e20 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
17e30 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
17e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
17e60 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f   limit expressio
17e70 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  n */..      test
17e80 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
17e90 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
17ea0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
17eb0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
17ec0 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
17ed0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
17ee0 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
17ef0 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
17f00 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17f10 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
17f20 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
17f30 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20 20 20  elect) );..     
17f40 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
17f50 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
17f60 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70  nReg = pExpr->op
17f70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53  ==TK_SELECT ? pS
17f80 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  el->pEList->nExp
17f90 72 20 3a 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  r : 1;.      sql
17fa0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
17fb0 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50 61  it(&dest, 0, pPa
17fc0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20  rse->nMem+1);.  
17fd0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
17fe0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20   += nReg;.      
17ff0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
18000 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
18010 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
18020 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20   SRT_Mem;.      
18030 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64    dest.iSdst = d
18040 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
18050 20 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20       dest.nSdst 
18060 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 20 20  = nReg;.        
18070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18080 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
18090 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64   dest.iSDParm, d
180a0 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67  est.iSDParm+nReg
180b0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
180c0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
180d0 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75  it subquery resu
180e0 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lt"));.      }el
180f0 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74  se{.        dest
18100 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69  .eDest = SRT_Exi
18110 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
18120 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18130 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
18140 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
18150 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
18160 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58  ent((v, "Init EX
18170 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a  ISTS result"));.
18180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
18190 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
181a0 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
181b0 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 26  db, TK_INTEGER,&
181c0 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
181d0 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  [1], 0);.      i
181e0 66 28 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20  f( pSel->pLimit 
181f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18200 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
18210 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70  rse->db, pSel->p
18220 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 29 3b 0a 20  Limit->pLeft);. 
18230 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69         pSel->pLi
18240 6d 69 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 69  mit->pLeft = pLi
18250 6d 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mit;.      }else
18260 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e  {.        pSel->
18270 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
18280 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
18290 5f 4c 49 4d 49 54 2c 20 70 4c 69 6d 69 74 2c 20  _LIMIT, pLimit, 
182a0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
182b0 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d    pSel->iLimit =
182c0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   0;.      if( sq
182d0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
182e0 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
182f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
18300 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
18310 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e      rReg = dest.
18320 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45  iSDParm;.      E
18330 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
18340 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
18350 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65  duce);.      bre
18360 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
18370 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61   if( rHasNullFla
18380 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
18390 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
183a0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
183b0 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a   rHasNullFlag);.
183c0 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66    }..  if( jmpIf
183d0 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20  Dynamic>=0 ){.  
183e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
183f0 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79  pHere(v, jmpIfDy
18400 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71  namic);.  }.  sq
18410 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
18420 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65  p(pParse);..  re
18430 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
18440 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
18450 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
18460 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18470 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
18480 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20 61  ** Expr pIn is a
18490 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73  n IN(...) expres
184a0 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  sion. This funct
184b0 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20  ion checks that 
184c0 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65  the .** sub-sele
184d0 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  ct on the RHS of
184e0 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74   the IN() operat
184f0 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  or has the same 
18500 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f  number of .** co
18510 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63  lumns as the vec
18520 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
18530 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f  Or, if the RHS o
18540 66 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f  f the IN() is no
18550 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72  t .** a sub-quer
18560 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53 20  y, that the LHS 
18570 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73  is a vector of s
18580 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ize 1..*/.int sq
18590 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e  lite3ExprCheckIN
185a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
185b0 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e  Expr *pIn){.  in
185c0 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69  t nVector = sqli
185d0 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
185e0 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20  e(pIn->pLeft);. 
185f0 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73   if( (pIn->flags
18600 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
18610 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63   ){.    if( nVec
18620 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c  tor!=pIn->x.pSel
18630 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
18640 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  pr ){.      sqli
18650 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
18660 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78  r(pParse, pIn->x
18670 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
18680 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72  ->nExpr, nVector
18690 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
186a0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
186b0 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20   if( nVector!=1 
186c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65  ){.    sqlite3Ve
186d0 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61  ctorErrorMsg(pPa
186e0 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29  rse, pIn->pLeft)
186f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
18700 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18710 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
18720 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
18730 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
18740 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
18750 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n IN expression.
18760 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
18770 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
18780 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75        x IN (valu
18790 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a  e, value, ...).*
187a0 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61  *.** The left-ha
187b0 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73  nd side (LHS) is
187c0 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63   a scalar or vec
187d0 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  tor expression. 
187e0 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   The .** right-h
187f0 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 69  and side (RHS) i
18800 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65  s an array of ze
18810 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61  ro or more scala
18820 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a  r values, or a.*
18830 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49 66 20  * subquery.  If 
18840 74 68 65 20 52 48 53 20 69 73 20 61 20 73 75 62  the RHS is a sub
18850 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65  query, the numbe
18860 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
18870 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63  mns must.** matc
18880 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
18890 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76  columns in the v
188a0 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ector on the LHS
188b0 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
188c0 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61  .** a list of va
188d0 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75  lues, the LHS mu
188e0 73 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20  st be a scalar. 
188f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70  .**.** The IN op
18900 65 72 61 74 6f 72 20 69 73 20 74 72 75 65 20 69  erator is true i
18910 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20  f the LHS value 
18920 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  is contained wit
18930 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20  hin the RHS..** 
18940 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61  The result is fa
18950 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
18960 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74  s definitely not
18970 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68   in the RHS.  Th
18980 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  e .** result is 
18990 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73  NULL if the pres
189a0 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20  ence of the LHS 
189b0 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f  in the RHS canno
189c0 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69  t be .** determi
189d0 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  ned due to NULLs
189e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
189f0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
18a00 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74  ode that jumps t
18a10 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66  o destIfFalse if
18a20 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
18a30 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
18a40 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49  thin the RHS.  I
18a50 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77  f due to NULLs w
18a60 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
18a70 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a  ne if the LHS.**
18a80 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
18a90 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75   the RHS then ju
18aa0 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c  mp to destIfNull
18ab0 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  .  If the LHS is
18ac0 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69   contained.** wi
18ad0 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  thin the RHS the
18ae0 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a  n fall through..
18af0 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65  **.** See the se
18b00 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74  parate in-operat
18b10 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74  or.md documentat
18b20 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ion file in the 
18b30 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c  canonical.** SQL
18b40 69 74 65 20 73 6f 75 72 63 65 20 74 72 65 65 20  ite source tree 
18b50 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
18b60 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
18b70 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
18b80 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
18b90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
18ba0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
18bb0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
18bc0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
18bd0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
18be0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
18bf0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
18c00 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
18c10 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
18c20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
18c30 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
18c40 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
18c50 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
18c60 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
18c70 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
18c80 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
18c90 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
18ca0 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
18cb0 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
18cc0 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
18cd0 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
18ce0 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
18cf0 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
18d00 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
18d10 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
18d20 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20  t rLhs;         
18d30 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28      /* Register(
18d40 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c  s) holding the L
18d50 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  HS values */.  i
18d60 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20  nt rLhsOrig;    
18d70 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75       /* LHS valu
18d80 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72  es prior to reor
18d90 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b  dering by aiMap[
18da0 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ] */.  Vdbe *v; 
18db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18dc0 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
18dd0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
18de0 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30    int *aiMap = 0
18df0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66  ;       /* Map f
18e00 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64  rom vector field
18e10 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   to index column
18e20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
18e30 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41   = 0;       /* A
18e40 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66  ffinity string f
18e50 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a  or comparisons *
18e60 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b  /.  int nVector;
18e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
18e80 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72  e of vectors for
18e90 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
18ea0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d  r */.  int iDumm
18eb0 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
18ec0 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20  Dummy parameter 
18ed0 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  to exprCodeVecto
18ee0 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  r() */.  Expr *p
18ef0 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Left;          /
18f00 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * The LHS of the
18f10 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
18f20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
18f30 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20          /* loop 
18f40 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
18f50 20 64 65 73 74 53 74 65 70 32 3b 20 20 20 20 20   destStep2;     
18f60 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
18f70 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73  ump when NULLs s
18f80 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f  een in step 2 */
18f90 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 36  .  int destStep6
18fa0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72   = 0;    /* Star
18fb0 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74  t of code for St
18fc0 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ep 6 */.  int ad
18fd0 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20  drTruthOp;      
18fe0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70  /* Address of op
18ff0 63 6f 64 65 20 74 68 61 74 20 64 65 74 65 72 6d  code that determ
19000 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20 74  ines the IN is t
19010 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  rue */.  int des
19020 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f  tNotNull;      /
19030 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61  * Jump here if a
19040 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
19050 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65 70 20  ot true in step 
19060 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  6 */.  int addrT
19070 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
19080 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d  Top of the step-
19090 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c  6 loop */ ..  pL
190a0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
190b0 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ft;.  if( sqlite
190c0 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61  3ExprCheckIN(pPa
190d0 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65  rse, pExpr) ) re
190e0 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65  turn;.  zAff = e
190f0 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50  xprINAffinity(pP
19100 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
19110 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
19120 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
19130 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
19140 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73   aiMap = (int*)s
19150 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
19160 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  ro(.      pParse
19170 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73  ->db, nVector*(s
19180 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a  izeof(int) + siz
19190 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20  eof(char)) + 1. 
191a0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
191b0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
191c0 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65  ed ) goto sqlite
191d0 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f  3ExprCodeIN_oom_
191e0 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74  error;..  /* Att
191f0 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20  empt to compute 
19200 74 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74  the RHS. After t
19210 68 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79  his step, if any
19220 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
19230 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e  .  ** IN_INDEX_N
19240 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c  OOP is returned,
19250 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65   the table opene
19260 64 20 69 74 68 20 63 75 72 73 6f 72 20 70 45 78  d ith cursor pEx
19270 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a  pr->iTable .  **
19280 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
19290 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
192a0 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e  p the RHS. If IN
192b0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
192c0 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68  eturned,.  ** th
192d0 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65  e RHS has not ye
192e0 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a  t been coded.  *
192f0 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
19300 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
19310 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
19320 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
19330 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
19340 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
19350 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
19360 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
19370 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
19380 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
19390 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20  arse, pExpr,.   
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44            IN_IND
193c0 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20  EX_MEMBERSHIP | 
193d0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
193e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
19400 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
19410 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52  IfNull ? 0 : &rR
19420 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70  hsHasNull, aiMap
19430 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
19440 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56  arse->nErr || nV
19450 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70  ector==1 || eTyp
19460 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a  e==IN_INDEX_EPH.
19470 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
19480 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
19490 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e  ASC || eType==IN
194a0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
194b0 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53  C .  );.#ifdef S
194c0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
194d0 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69   Confirm that ai
194e0 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  Map[] contains n
194f0 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76  Vector integer v
19500 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30 20  alues between 0 
19510 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72  and.  ** nVector
19520 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  -1. */.  for(i=0
19530 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
19540 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e  ){.    int j, cn
19550 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a  t;.    for(cnt=j
19560 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a  =0; j<nVector; j
19570 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d  ++) if( aiMap[j]
19580 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20  ==i ) cnt++;.   
19590 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20   assert( cnt==1 
195a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
195b0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53   /* Code the LHS
195c0 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  , the <expr> fro
195d0 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
195e0 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20  .)". If the LHS 
195f0 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f  is a .  ** vecto
19600 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73 74  r, then it is st
19610 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79  ored in an array
19620 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69   of nVector regi
19630 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a  sters starting .
19640 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a    ** at r1..  **
19650 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  .  ** sqlite3Fin
19660 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74  dInIndex() might
19670 20 68 61 76 65 20 72 65 6f 72 64 65 72 65 64 20   have reordered 
19680 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  the fields of th
19690 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a  e LHS vector.  *
196a0 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 69  * so that the fi
196b0 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  elds are in the 
196c0 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e  same order as an
196d0 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e   existing index.
196e0 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61     The.  ** aiMa
196f0 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  p[] array contai
19700 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f  ns a mapping fro
19710 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c  m the original L
19720 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74  HS field order t
19730 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64  o.  ** the field
19740 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61 74 63   order that matc
19750 68 65 73 20 74 68 65 20 52 48 53 20 69 6e 64 65  hes the RHS inde
19760 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
19770 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
19780 50 61 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72  Parse);.  rLhsOr
19790 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63  ig = exprCodeVec
197a0 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  tor(pParse, pLef
197b0 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66  t, &iDummy);.  f
197c0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
197d0 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69  r && aiMap[i]==i
197e0 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20  ; i++){} /* Are 
197f0 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64  LHS fields reord
19800 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69  ered? */.  if( i
19810 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20  ==nVector ){.   
19820 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61   /* LHS fields a
19830 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64  re not reordered
19840 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72   */.    rLhs = r
19850 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65  LhsOrig;.  }else
19860 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
19870 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53   reorder the LHS
19880 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e   fields accordin
19890 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20  g to aiMap */.  
198a0 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33    rLhs = sqlite3
198b0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
198c0 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  rse, nVector);. 
198d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
198e0 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
198f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19900 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
19910 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68   rLhsOrig+i, rLh
19920 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a  s+aiMap[i], 0);.
19930 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
19940 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  If sqlite3FindIn
19950 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20  Index() did not 
19960 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
19970 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  n index that is.
19980 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f    ** suitable fo
19990 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65  r evaluating the
199a0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68   IN operator, th
199b0 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e  en evaluate usin
199c0 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  g a.  ** sequenc
199d0 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73  e of comparisons
199e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
199f0 20 69 73 20 73 74 65 70 20 28 31 29 20 69 6e 20   is step (1) in 
19a00 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e  the in-operator.
19a10 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67  md optimized alg
19a20 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69  orithm..  */.  i
19a30 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
19a40 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45  EX_NOOP ){.    E
19a50 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
19a60 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
19a70 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
19a80 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
19a90 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
19aa0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
19ab0 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20      int labelOk 
19ac0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19ad0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
19ae0 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65  nt r2, regToFree
19af0 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e  ;.    int regCkN
19b00 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ull = 0;.    int
19b10 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28   ii;.    assert(
19b20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
19b30 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
19b40 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
19b50 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  ( destIfNull!=de
19b60 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
19b70 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73     regCkNull = s
19b80 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19b90 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19ba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19bb0 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
19bc0 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43  rLhs, rLhs, regC
19bd0 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  kNull);.    }.  
19be0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
19bf0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  List->nExpr; ii+
19c00 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  +){.      r2 = s
19c10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
19c20 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  mp(pParse, pList
19c30 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26  ->a[ii].pExpr, &
19c40 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  regToFree);.    
19c50 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
19c60 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
19c70 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61  nBeNull(pList->a
19c80 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
19c90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19ca0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
19cb0 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c  itAnd, regCkNull
19cc0 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  , r2, regCkNull)
19cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19ce0 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  if( ii<pList->nE
19cf0 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e  xpr-1 || destIfN
19d00 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
19d10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19d20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19d30 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61   OP_Eq, rLhs, la
19d40 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20  belOk, r2,.     
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d60 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
19d70 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
19d80 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
19d90 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69  rageIf(v, ii<pLi
19da0 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
19db0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
19dc0 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73  geIf(v, ii==pLis
19dd0 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
19de0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19df0 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
19e00 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
19e10 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
19e20 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  t( destIfNull==d
19e30 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20  estIfFalse );.  
19e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19e50 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
19e60 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61  , rLhs, destIfFa
19e70 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lse, r2,.       
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e90 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
19ea0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64   P4_COLLSEQ); Vd
19eb0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19ec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19ed0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
19ee0 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a  ff[0] | SQLITE_J
19ef0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
19f00 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
19f10 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19f20 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65  pParse, regToFre
19f30 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
19f40 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20  ( regCkNull ){. 
19f50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19f60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
19f70 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  ull, regCkNull, 
19f80 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
19f90 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19fa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
19fb0 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
19fc0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se);.    }.    s
19fd0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19fe0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f  eLabel(v, labelO
19ff0 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  k);.    sqlite3R
1a000 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1a010 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  arse, regCkNull)
1a020 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74  ;.    goto sqlit
1a030 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1a040 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ished;.  }..  /*
1a050 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74   Step 2: Check t
1a060 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53  o see if the LHS
1a070 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
1a080 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20  LL columns.  If 
1a090 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65  the.  ** LHS doe
1a0a0 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20  s contain NULLs 
1a0b0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1a0c0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46  must be either F
1a0d0 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20  ALSE or NULL..  
1a0e0 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20  ** We will then 
1a0f0 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20  skip the binary 
1a100 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48  search of the RH
1a110 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
1a120 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
1a130 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73  False ){.    des
1a140 74 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46  tStep2 = destIfF
1a150 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  alse;.  }else{. 
1a160 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
1a170 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74  estStep6 = sqlit
1a180 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1a190 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  v);.  }.  for(i=
1a1a0 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
1a1b0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
1a1c0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
1a1d0 69 65 6c 64 53 75 62 65 78 70 72 28 70 45 78 70  ieldSubexpr(pExp
1a1e0 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  r->pLeft, i);.  
1a1f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1a200 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b  rCanBeNull(p) ){
1a210 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a220 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1a230 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64  sNull, rLhs+i, d
1a240 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20  estStep2);.     
1a250 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a260 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1a270 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c  * Step 3.  The L
1a280 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20  HS is now known 
1a290 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  to be non-NULL. 
1a2a0 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73   Do the binary s
1a2b0 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68  earch.  ** of th
1a2c0 65 20 52 48 53 20 75 73 69 6e 67 20 74 68 65 20  e RHS using the 
1a2d0 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20  LHS as a probe. 
1a2e0 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72   If found, the r
1a2f0 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72  esult is.  ** tr
1a300 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ue..  */.  if( e
1a310 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
1a320 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OWID ){.    /* I
1a330 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
1a340 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49   RHS is the ROWI
1a350 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65  D of table b-tre
1a360 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f  e and so we also
1a370 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61  .    ** know tha
1a380 74 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e  t the RHS is non
1a390 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77  -NULL.  Hence, w
1a3a0 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20  e combine steps 
1a3b0 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69  3 and 4.    ** i
1a3c0 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  nto a single opc
1a3d0 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ode. */.    sqli
1a3e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1a3f0 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70   OP_SeekRowid, p
1a400 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
1a410 73 74 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29  stIfFalse, rLhs)
1a420 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1a430 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54  ge(v);.    addrT
1a440 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33  ruthOp = sqlite3
1a450 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
1a460 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75  _Goto);  /* Retu
1a470 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c  rn True */.  }el
1a480 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
1a490 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1a4a0 41 66 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20  Affinity, rLhs, 
1a4b0 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66  nVector, 0, zAff
1a4c0 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
1a4d0 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d  if( destIfFalse=
1a4e0 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20  =destIfNull ){. 
1a4f0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20       /* Combine 
1a500 53 74 65 70 20 33 20 61 6e 64 20 53 74 65 70 20  Step 3 and Step 
1a510 35 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  5 into a single 
1a520 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  opcode */.      
1a530 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a540 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
1a550 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
1a560 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
1a570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a580 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73              rLhs
1a590 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65  , nVector); Vdbe
1a5a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a5b0 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45     goto sqlite3E
1a5c0 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1a5d0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
1a5e0 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20 33   Ordinary Step 3
1a5f0 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  , for the case w
1a600 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e  here FALSE and N
1a610 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74  ULL are distinct
1a620 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74   */.    addrTrut
1a630 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  hOp = sqlite3Vdb
1a640 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1a650 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
1a660 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20  Table, 0,.      
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20  rLhs, nVector); 
1a6a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a6b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
1a6c0 34 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69  4.  If the RHS i
1a6d0 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f  s known to be no
1a6e0 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69  n-NULL and we di
1a6f0 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20  d not find.  ** 
1a700 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20  an match on the 
1a710 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68  search above, th
1a720 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
1a730 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a  st be FALSE..  *
1a740 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61 73 4e  /.  if( rRhsHasN
1a750 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d  ull && nVector==
1a760 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1a770 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a780 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61  _NotNull, rRhsHa
1a790 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c  sNull, destIfFal
1a7a0 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  se);.    VdbeCov
1a7b0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
1a7c0 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20   /* Step 5.  If 
1a7d0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
1a7e0 62 6f 75 74 20 74 68 65 20 64 69 66 66 65 72 65  bout the differe
1a7f0 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c  nce between NULL
1a800 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c   and.  ** FALSE,
1a810 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
1a820 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20  n false. .  */. 
1a830 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65   if( destIfFalse
1a840 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73  ==destIfNull ) s
1a850 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1a860 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
1a870 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f  .  /* Step 6: Lo
1a880 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20  op through rows 
1a890 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d  of the RHS.  Com
1a8a0 70 61 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f  pare each row to
1a8b0 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49   the LHS..  ** I
1a8c0 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e  f any comparison
1a8d0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
1a8e0 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
1a8f0 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20  L.  If all.  ** 
1a900 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20  comparisons are 
1a910 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66  FALSE then the f
1a920 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46  inal result is F
1a930 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ALSE..  **.  ** 
1a940 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53  For a scalar LHS
1a950 2c 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  , it is sufficie
1a960 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74  nt to check just
1a970 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20   the first row. 
1a980 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a   ** of the RHS..
1a990 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53    */.  if( destS
1a9a0 74 65 70 36 20 29 20 73 71 6c 69 74 65 33 56 64  tep6 ) sqlite3Vd
1a9b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a9c0 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20  , destStep6);.  
1a9d0 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
1a9e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a9f0 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d  P_Rewind, pExpr-
1aa00 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
1aa10 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76  alse);.  VdbeCov
1aa20 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
1aa30 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
1aa40 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73   destNotNull = s
1aa50 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1aa60 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  bel(v);.  }else{
1aa70 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63  .    /* For nVec
1aa80 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20  tor==1, combine 
1aa90 73 74 65 70 73 20 36 20 61 6e 64 20 37 20 62 79  steps 6 and 7 by
1aaa0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
1aab0 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41  urning.    ** FA
1aac0 4c 53 45 20 69 66 20 74 68 65 20 66 69 72 73 74  LSE if the first
1aad0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
1aae0 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64  ot NULL */.    d
1aaf0 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73  estNotNull = des
1ab00 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20  tIfFalse;.  }.  
1ab10 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
1ab20 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  or; i++){.    Ex
1ab30 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53  pr *p;.    CollS
1ab40 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69  eq *pColl;.    i
1ab50 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47  nt r3 = sqlite3G
1ab60 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1ab70 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
1ab80 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
1ab90 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
1aba0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1abb0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1abc0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73  Parse, p);.    s
1abd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1abe0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
1abf0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c  Expr->iTable, i,
1ac00 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   r3);.    sqlite
1ac10 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1ac20 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65  P_Ne, rLhs+i, de
1ac30 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20  stNotNull, r3,. 
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac50 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
1ac60 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1ac70 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ac80 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1ac90 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1aca0 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a  Parse, r3);.  }.
1acb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1acc0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1acd0 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  0, destIfNull);.
1ace0 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
1acf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1ad00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1ad10 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a  , destNotNull);.
1ad20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ad30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
1ad40 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1ad50 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20   addrTop+1);.   
1ad60 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1ad70 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37  ;..    /* Step 7
1ad80 3a 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74  :  If we reach t
1ad90 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
1ada0 6f 77 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ow that the resu
1adb0 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  lt must.    ** b
1adc0 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20  e false. */.    
1add0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ade0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1adf0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1ae00 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68   }..  /* Jumps h
1ae10 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ere in order to 
1ae20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a  return true. */.
1ae30 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1ae40 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 72 75  pHere(v, addrTru
1ae50 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45  thOp);..sqlite3E
1ae60 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1ae70 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d  ed:.  if( rLhs!=
1ae80 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74  rLhsOrig ) sqlit
1ae90 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1aea0 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a  (pParse, rLhs);.
1aeb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1aec0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1aed0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1aee0 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29   "end IN expr"))
1aef0 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ;.sqlite3ExprCod
1af00 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20  eIN_oom_error:. 
1af10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1af20 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70  Parse->db, aiMap
1af30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1af40 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
1af50 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Aff);.}.#endif /
1af60 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
1af70 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
1af80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1af90 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
1afa0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
1afb0 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1afc0 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
1afd0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
1afe0 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
1aff0 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
1b000 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
1b010 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
1b020 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
1b030 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
1b040 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
1b050 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
1b060 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
1b070 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
1b080 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
1b090 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
1b0a0 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
1b0b0 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
1b0c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b0d0 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
1b0e0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
1b0f0 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
1b100 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
1b110 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
1b120 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
1b130 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  ue;.    sqlite3A
1b140 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
1b150 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1b160 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
1b170 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
1b180 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
1b190 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
1b1a0 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
1b1b0 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
1b1c0 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
1b1d0 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
1b1e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b1f0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52  dOp4Dup8(v, OP_R
1b200 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
1b210 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
1b220 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _REAL);.  }.}.#e
1b230 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ndif.../*.** Gen
1b240 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
1b250 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
1b260 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
1b270 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
1b280 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  xt z[0..n-1] int
1b290 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
1b2a0 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54  .**.** Expr.u.zT
1b2b0 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55  oken is always U
1b2c0 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72  TF8 and zero-ter
1b2d0 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  minated..*/.stat
1b2e0 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
1b2f0 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
1b300 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1b310 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
1b320 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a   iMem){.  Vdbe *
1b330 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1b340 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  e;.  if( pExpr->
1b350 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
1b360 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
1b370 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
1b380 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
1b390 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
1b3a0 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
1b3b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b3c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1b3d0 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
1b3e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1b3f0 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c  t c;.    i64 val
1b400 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ue;.    const ch
1b410 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ar *z = pExpr->u
1b420 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73  .zToken;.    ass
1b430 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20  ert( z!=0 );.   
1b440 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f   c = sqlite3DecO
1b450 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61  rHexToI64(z, &va
1b460 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 28 63  lue);.    if( (c
1b470 3d 3d 33 20 26 26 20 21 6e 65 67 46 6c 61 67 29  ==3 && !negFlag)
1b480 20 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e   || (c==2) || (n
1b490 65 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d  egFlag && value=
1b4a0 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29  =SMALLEST_INT64)
1b4b0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1b4c0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1b4d0 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74  OINT.      sqlit
1b4e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b4f0 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e  e, "oversized in
1b500 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65  teger: %s%s", ne
1b510 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22  gFlag ? "-" : ""
1b520 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e  , z);.#else.#ifn
1b530 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b540 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20  HEX_INTEGER.    
1b550 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1b560 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29  rnicmp(z,"0x",2)
1b570 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1b580 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b590 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65  Parse, "hex lite
1b5a0 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25  ral too big: %s%
1b5b0 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a  s", negFlag?"-":
1b5c0 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  "",z);.      }el
1b5d0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
1b5e0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  {.        codeRe
1b5f0 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
1b600 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , iMem);.      }
1b610 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1b620 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  e{.      if( neg
1b630 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
1b640 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==3 ? SMALLEST_
1b650 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
1b660 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1b670 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
1b680 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
1b690 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c  em, 0, (u8*)&val
1b6a0 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  ue, P4_INT64);. 
1b6b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1b6c0 2a 20 45 72 61 73 65 20 63 6f 6c 75 6d 6e 2d 63  * Erase column-c
1b6d0 61 63 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65  ache entry numbe
1b6e0 72 20 69 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  r i.*/.static vo
1b6f0 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65  id cacheEntryCle
1b700 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
1b710 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20  , int i){.  if( 
1b720 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1b730 65 5b 69 5d 2e 74 65 6d 70 52 65 67 20 29 7b 0a  e[i].tempReg ){.
1b740 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1b750 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
1b760 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
1b770 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50  Reg) ){.      pP
1b780 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
1b790 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
1b7a0 2b 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  +] = pParse->aCo
1b7b0 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a  lCache[i].iReg;.
1b7c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
1b7d0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b  se->nColCache--;
1b7e0 0a 20 20 69 66 28 20 69 3c 70 50 61 72 73 65 2d  .  if( i<pParse-
1b7f0 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20  >nColCache ){.  
1b800 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61    pParse->aColCa
1b810 63 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d  che[i] = pParse-
1b820 3e 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73  >aColCache[pPars
1b830 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20  e->nColCache];. 
1b840 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   }.}.../*.** Rec
1b850 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ord in the colum
1b860 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70  n cache that a p
1b870 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e  articular column
1b880 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69   from a.** parti
1b890 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73  cular table is s
1b8a0 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69  tored in a parti
1b8b0 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a  cular register..
1b8c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1b8d0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61  xprCacheStore(Pa
1b8e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1b8f0 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c   iTab, int iCol,
1b900 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
1b910 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72  t i;.  int minLr
1b920 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b  u;.  int idxLru;
1b930 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1b940 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e  che *p;..  /* Un
1b950 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61  less an error ha
1b960 73 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69  s occurred, regi
1b970 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65  ster numbers are
1b980 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65   always positive
1b990 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  . */.  assert( i
1b9a0 52 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d  Reg>0 || pParse-
1b9b0 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
1b9c0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1b9d0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  d );.  assert( i
1b9e0 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c  Col>=-1 && iCol<
1b9f0 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e  32768 );  /* Fin
1ba00 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ite column numbe
1ba10 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  rs */..  /* The 
1ba20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
1ba30 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73  he flag disables
1ba40 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1ba50 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
1ba60 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  .  ** for testin
1ba70 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69  g only - to veri
1ba80 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61  fy that SQLite a
1ba90 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73  lways gets the s
1baa0 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20  ame answer.  ** 
1bab0 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74  with and without
1bac0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1bad0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70  e..  */.  if( Op
1bae0 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1baf0 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
1bb00 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
1bb10 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  e) ) return;..  
1bb20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65  /* First replace
1bb30 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e   any existing en
1bb40 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  try..  **.  ** A
1bb50 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79  ctually, the way
1bb60 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1bb70 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
1bb80 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72  sed, we are guar
1bb90 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74  anteed.  ** that
1bba0 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c   the object will
1bbb0 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62   never already b
1bbc0 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72  e in cache.  Ver
1bbd0 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74  ify this guarant
1bbe0 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ee..  */.#ifndef
1bbf0 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d   NDEBUG.  for(i=
1bc00 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1bc10 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
1bc20 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1bc30 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  , p++){.    asse
1bc40 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69  rt( p->iTable!=i
1bc50 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d  Tab || p->iColum
1bc60 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23  n!=iCol );.  }.#
1bc70 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
1bc80 68 65 20 63 61 63 68 65 20 69 73 20 61 6c 72 65  he cache is alre
1bc90 61 64 79 20 66 75 6c 6c 2c 20 64 65 6c 65 74 65  ady full, delete
1bca0 20 74 68 65 20 6c 65 61 73 74 20 72 65 63 65 6e   the least recen
1bcb0 74 6c 79 20 75 73 65 64 20 65 6e 74 72 79 20 2a  tly used entry *
1bcc0 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
1bcd0 6e 43 6f 6c 43 61 63 68 65 3e 3d 53 51 4c 49 54  nColCache>=SQLIT
1bce0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 20 29 7b 0a  E_N_COLCACHE ){.
1bcf0 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37      minLru = 0x7
1bd00 66 66 66 66 66 66 66 3b 0a 20 20 20 20 69 64 78  fffffff;.    idx
1bd10 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f  Lru = -1;.    fo
1bd20 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1bd30 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
1bd40 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
1bd50 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1bd60 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e    if( p->lru<min
1bd70 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Lru ){.        i
1bd80 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
1bd90 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c     minLru = p->l
1bda0 72 75 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ru;.      }.    
1bdb0 7d 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  }.    p = &pPars
1bdc0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78  e->aColCache[idx
1bdd0 4c 72 75 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Lru];.  }else{. 
1bde0 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
1bdf0 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65  aColCache[pParse
1be00 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a  ->nColCache++];.
1be10 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
1be20 65 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74  e new entry to t
1be30 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61  he end of the ca
1be40 63 68 65 20 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76  che */.  p->iLev
1be50 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
1be60 63 68 65 4c 65 76 65 6c 3b 0a 20 20 70 2d 3e 69  cheLevel;.  p->i
1be70 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
1be80 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
1be90 6c 3b 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20 69  l;.  p->iReg = i
1bea0 52 65 67 3b 0a 20 20 70 2d 3e 74 65 6d 70 52 65  Reg;.  p->tempRe
1beb0 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 6c 72 75 20  g = 0;.  p->lru 
1bec0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1bed0 43 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cnt++;.}../*.** 
1bee0 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65  Indicate that re
1bef0 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20  gisters between 
1bf00 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d  iReg..iReg+nReg-
1bf10 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72  1 are being over
1bf20 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67  written..** Purg
1bf30 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72  e the range of r
1bf40 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68  egisters from th
1bf50 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
1bf60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1bf70 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50  xprCacheRemove(P
1bf80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1bf90 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
1bfa0 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  ){.  int i = 0;.
1bfb0 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73    while( i<pPars
1bfc0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a  e->nColCache ){.
1bfd0 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
1bfe0 61 63 68 65 20 2a 70 20 3d 20 26 70 50 61 72 73  ache *p = &pPars
1bff0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b  e->aColCache[i];
1c000 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
1c010 20 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69   >= iReg && p->i
1c020 52 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20  Reg < iReg+nReg 
1c030 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
1c040 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
1c050 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   i);.    }else{.
1c060 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
1c070 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
1c080 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65  member the curre
1c090 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  nt column cache 
1c0a0 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65  context.  Any ne
1c0b0 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a  w entries added.
1c0c0 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
1c0d0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74  column cache aft
1c0e0 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65  er this call are
1c0f0 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68   removed when th
1c100 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
1c110 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a  ng pop occurs..*
1c120 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1c130 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73  prCachePush(Pars
1c140 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
1c150 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1c160 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  l++;.#ifdef SQLI
1c170 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1c180 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1c190 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
1c1a0 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
1c1b0 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20  printf("PUSH to 
1c1c0 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69  %d\n", pParse->i
1c1d0 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d  CacheLevel);.  }
1c1e0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
1c1f0 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65   Remove from the
1c200 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e   column cache an
1c210 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77  y entries that w
1c220 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20  ere added since 
1c230 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69  the.** the previ
1c240 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43  ous sqlite3ExprC
1c250 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69  achePush operati
1c260 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
1c270 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20  rds, restore.** 
1c280 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65  the cache to the
1c290 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
1c2a0 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20   prior the most 
1c2b0 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a  recent Push..*/.
1c2c0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1c2d0 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a  CachePop(Parse *
1c2e0 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
1c2f0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1c300 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c310 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72  vel>=1 );.  pPar
1c320 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d  se->iCacheLevel-
1c330 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  -;.#ifdef SQLITE
1c340 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1c350 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
1c360 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
1c370 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
1c380 69 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64  intf("POP  to %d
1c390 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61  \n", pParse->iCa
1c3a0 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23  cheLevel);.  }.#
1c3b0 65 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 20 69  endif.  while( i
1c3c0 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1c3d0 68 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  he ){.    if( pP
1c3e0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1c3f0 69 5d 2e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  i].iLevel>pParse
1c400 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
1c410 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
1c420 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69  yClear(pParse, i
1c430 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c440 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20      i++;.    }. 
1c450 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
1c460 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
1c470 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
1c480 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
1c490 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
1c4a0 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
1c4b0 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
1c4c0 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
1c4d0 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
1c4e0 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
1c4f0 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
1c500 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
1c510 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
1c520 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
1c530 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
1c540 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1c550 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
1c560 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1c570 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
1c580 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1c590 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
1c5a0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1c5b0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
1c5c0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1c5d0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
1c5e0 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
1c5f0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
1c600 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
1c610 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74   }.}../* Generat
1c620 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1c630 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73   load into regis
1c640 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c  ter regOut a val
1c650 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70  ue that is.** ap
1c660 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
1c670 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c  e iIdxCol-th col
1c680 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
1c690 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
1c6a0 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e  e3ExprCodeLoadIn
1c6b0 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  dexColumn(.  Par
1c6c0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20  se *pParse,  /* 
1c6d0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1c6e0 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
1c6f0 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20  pIdx,    /* The 
1c700 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75  index whose colu
1c710 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64  mn is to be load
1c720 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
1c730 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f  Cur,    /* Curso
1c740 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  r pointing to a 
1c750 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69  table row */.  i
1c760 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f  nt iIdxCol,    /
1c770 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  * The column of 
1c780 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  the index to be 
1c790 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
1c7a0 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53  regOut      /* S
1c7b0 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63  tore the index c
1c7c0 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74  olumn value in t
1c7d0 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1c7e0 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c  ){.  i16 iTabCol
1c7f0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
1c800 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66  n[iIdxCol];.  if
1c810 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58  ( iTabCol==XN_EX
1c820 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  PR ){.    assert
1c830 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
1c840 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1c850 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1c860 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b  nExpr>iIdxCol );
1c870 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65  .    pParse->iSe
1c880 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 20  lfTab = iTabCur 
1c890 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  + 1;.    sqlite3
1c8a0 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61  ExprCodeCopy(pPa
1c8b0 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45  rse, pIdx->aColE
1c8c0 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e  xpr->a[iIdxCol].
1c8d0 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a  pExpr, regOut);.
1c8e0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
1c8f0 66 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  fTab = 0;.  }els
1c900 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1c910 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
1c920 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70  fTable(pParse->p
1c930 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62  Vdbe, pIdx->pTab
1c940 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20  le, iTabCur,.   
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74   iTabCol, regOut
1c980 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1c990 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1c9a0 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   extract the val
1c9b0 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74  ue of the iCol-t
1c9c0 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  h column of a ta
1c9d0 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
1c9e0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1c9f0 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20  olumnOfTable(.  
1ca00 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
1ca10 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65  /* The VDBE unde
1ca20 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1ca30 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1ca40 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1ca50 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1ca60 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
1ca70 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68  TabCur,    /* Th
1ca80 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20  e table cursor. 
1ca90 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f   Or the PK curso
1caa0 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  r for WITHOUT RO
1cab0 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  WID */.  int iCo
1cac0 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  l,       /* Inde
1cad0 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
1cae0 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20  to extract */.  
1caf0 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
1cb00 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
1cb10 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72  alue into this r
1cb20 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1cb30 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
1cb40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cb50 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1cb60 6e 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c  n, iTabCur, iCol
1cb70 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 72  , regOut);.    r
1cb80 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
1cb90 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d   iCol<0 || iCol=
1cba0 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
1cbb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cbc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
1cbd0 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f  d, iTabCur, regO
1cbe0 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
1cbf0 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
1cc00 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
1cc10 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
1cc20 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  umn;.    int x =
1cc30 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21   iCol;.    if( !
1cc40 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
1cc50 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
1cc60 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20  b) ){.      x = 
1cc70 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
1cc80 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d  ndex(sqlite3Prim
1cc90 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
1cca0 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  ), iCol);.    }.
1ccb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ccc0 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61  ddOp3(v, op, iTa
1ccd0 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29  bCur, x, regOut)
1cce0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
1ccf0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
1cd00 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28  e3ColumnDefault(
1cd10 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72  v, pTab, iCol, r
1cd20 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  egOut);.  }.}../
1cd30 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1cd40 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  de that will ext
1cd50 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e  ract the iColumn
1cd60 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a  -th column from.
1cd70 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  ** table pTab an
1cd80 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  d store the colu
1cd90 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65  mn value in a re
1cda0 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41  gister. .**.** A
1cdb0 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
1cdc0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
1cdd0 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
1cde0 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68  gister iReg.  Th
1cdf0 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72  is.** is not gar
1ce00 61 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74 43  anteeed for GetC
1ce10 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65  olumn() - the re
1ce20 73 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72  sult can be stor
1ce30 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67  ed in.** any reg
1ce40 69 73 74 65 72 2e 20 20 42 75 74 20 74 68 65 20  ister.  But the 
1ce50 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e  result is guaran
1ce60 74 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20  teed to land in 
1ce70 72 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a  register iReg.**
1ce80 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f   for GetColumnTo
1ce90 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Reg()..**.** The
1cea0 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
1ceb0 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61  en cursor to pTa
1cec0 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e  b in iTable when
1ced0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1cee0 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20   is called.  If 
1cef0 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63  iColumn<0 then c
1cf00 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
1cf10 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
1cf20 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  he rowid..*/.int
1cf30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1cf40 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  GetColumn(.  Par
1cf50 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
1cf60 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1cf70 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1cf80 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1cf90 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
1cfa0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1cfb0 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
1cfc0 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
1cfd0 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
1cfe0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1cff0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
1d000 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1d010 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1d020 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
1d030 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1d040 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a   iReg,        /*
1d050 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
1d060 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  ere */.  u8 p5  
1d070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20            /* P5 
1d080 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c  value for OP_Col
1d090 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29  umn + FLAGS */.)
1d0a0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1d0b0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1d0c0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1d0d0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
1d0e0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
1d0f0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
1d100 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1d110 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
1d120 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d    if( p->iTable=
1d130 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43  =iTable && p->iC
1d140 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
1d150 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d  {.      p->lru =
1d160 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
1d170 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
1d180 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52  te3ExprCachePinR
1d190 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
1d1a0 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20  p->iReg);.      
1d1b0 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a  return p->iReg;.
1d1c0 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73      }.  }  .  as
1d1d0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
1d1e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1d1f0 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1d200 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c  v, pTab, iTable,
1d210 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
1d220 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20  .  if( p5 ){.   
1d230 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1d240 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d  geP5(v, p5);.  }
1d250 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c  else{   .    sql
1d260 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1d270 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c  re(pParse, iTabl
1d280 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
1d290 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d2a0 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  iReg;.}.void sql
1d2b0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1d2c0 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61  olumnToReg(.  Pa
1d2d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
1d2e0 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1d2f0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1d300 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
1d310 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
1d320 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1d330 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
1d340 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
1d350 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
1d360 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1d370 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
1d380 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1d390 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1d3a0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
1d3b0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1d3c0 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20 2f  t iReg         /
1d3d0 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
1d3e0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1d3f0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1d400 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
1d410 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f  Parse, pTab, iCo
1d420 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52  lumn, iTable, iR
1d430 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31  eg, 0);.  if( r1
1d440 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65 33  !=iReg ) sqlite3
1d450 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
1d460 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
1d470 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d  py, r1, iReg);.}
1d480 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  .../*.** Clear a
1d490 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  ll column cache 
1d4a0 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64  entries..*/.void
1d4b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1d4c0 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  eClear(Parse *pP
1d4d0 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
1d4e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1d4f0 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1d500 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1d510 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1d520 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1d530 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20  tf("CLEAR\n");. 
1d540 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
1d550 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
1d560 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a  ColCache; i++){.
1d570 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1d580 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d  aColCache[i].tem
1d590 70 52 65 67 0a 20 20 20 20 20 26 26 20 70 50 61  pReg.     && pPa
1d5a0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
1d5b0 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
1d5c0 61 54 65 6d 70 52 65 67 29 0a 20 20 20 20 29 7b  aTempReg).    ){
1d5d0 0a 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  .       pParse->
1d5e0 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
1d5f0 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
1d600 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1d610 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a  [i].iReg;.    }.
1d620 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43    }.  pParse->nC
1d630 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a  olCache = 0;.}..
1d640 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
1d650 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66   fact that an af
1d660 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61  finity change ha
1d670 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43  s occurred on iC
1d680 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  ount.** register
1d690 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
1d6a0 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20  iStart..*/.void 
1d6b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1d6c0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50  AffinityChange(P
1d6d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1d6e0 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43  t iStart, int iC
1d6f0 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  ount){.  sqlite3
1d700 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1d710 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20  pParse, iStart, 
1d720 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCount);.}../*.*
1d730 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d740 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
1d750 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
1d760 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
1d770 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
1d780 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20  To..iTo+nReg-1. 
1d790 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Keep the column 
1d7a0 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65  cache up-to-date
1d7b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d7c0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
1d7d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1d7e0 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
1d7f0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73   int nReg){.  as
1d800 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f  sert( iFrom>=iTo
1d810 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e  +nReg || iFrom+n
1d820 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71  Reg<=iTo );.  sq
1d830 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d840 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1d850 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
1d860 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c  To, nReg);.  sql
1d870 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
1d880 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f  ove(pParse, iFro
1d890 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66  m, nReg);.}..#if
1d8a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1d8b0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1d8c0 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  d(SQLITE_COVERAG
1d8d0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1d8e0 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79  turn true if any
1d8f0 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
1d900 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54   range iFrom..iT
1d910 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a  o (inclusive).**
1d920 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
1d930 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   of the column c
1d940 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
1d950 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1d960 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
1d970 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20   and testcase() 
1d980 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61  macros only.** a
1d990 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  nd does not appe
1d9a0 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62  ar in a normal b
1d9b0 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
1d9c0 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  int usedAsColumn
1d9d0 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
1d9e0 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
1d9f0 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20  int iTo){.  int 
1da00 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1da10 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
1da20 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1da30 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
1da40 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1da50 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
1da60 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t r = p->iReg;. 
1da70 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20     if( r>=iFrom 
1da80 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75  && r<=iTo ) retu
1da90 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45  rn 1;    /*NO_TE
1daa0 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ST*/.  }.  retur
1dab0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
1dac0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c   SQLITE_DEBUG ||
1dad0 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45   SQLITE_COVERAGE
1dae0 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  _TEST */.../*.**
1daf0 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61   Convert a scala
1db00 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  r expression nod
1db10 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  e to a TK_REGIST
1db20 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a  ER referencing.*
1db30 2a 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  * register iReg.
1db40 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73    The caller mus
1db50 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 52  t ensure that iR
1db60 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  eg already conta
1db70 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ins.** the corre
1db80 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  ct value for the
1db90 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
1dba0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
1dbb0 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72 20  ToRegister(Expr 
1dbc0 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  *p, int iReg){. 
1dbd0 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b   p->op2 = p->op;
1dbe0 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  .  p->op = TK_RE
1dbf0 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61  GISTER;.  p->iTa
1dc00 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78  ble = iReg;.  Ex
1dc10 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
1dc20 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a  p, EP_Skip);.}..
1dc30 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61  /*.** Evaluate a
1dc40 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69  n expression (ei
1dc50 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72  ther a vector or
1dc60 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
1dc70 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a  sion) and store.
1dc80 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  ** the result in
1dc90 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d   continguous tem
1dca0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
1dcb0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1dcc0 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  dex of.** the fi
1dcd0 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73 65  rst register use
1dce0 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  d to store the r
1dcf0 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  esult..**.** If 
1dd00 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73  the returned res
1dd10 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
1dd20 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c  a temporary scal
1dd30 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  ar, then also wr
1dd40 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69  ite.** that regi
1dd50 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f  ster number into
1dd60 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49   *piFreeable.  I
1dd70 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1dd80 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a  esult register.*
1dd90 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  * is not a tempo
1dda0 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20 65  rary or if the e
1ddb0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
1ddc0 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65  ector set *piFre
1ddd0 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a  eable.** to 0..*
1dde0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
1ddf0 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
1de00 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1de10 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61  *p, int *piFreea
1de20 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73  ble){.  int iRes
1de30 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75  ult;.  int nResu
1de40 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
1de50 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20  VectorSize(p);. 
1de60 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20   if( nResult==1 
1de70 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d  ){.    iResult =
1de80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1de90 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Temp(pParse, p, 
1dea0 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d  piFreeable);.  }
1deb0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65  else{.    *piFre
1dec0 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69  eable = 0;.    i
1ded0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  f( p->op==TK_SEL
1dee0 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ECT ){.#if SQLIT
1def0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1df00 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20        iResult = 
1df10 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  0;.#else.      i
1df20 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
1df30 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
1df40 61 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  arse, p, 0, 0);.
1df50 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1df60 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1df70 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70       iResult = p
1df80 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1df90 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
1dfa0 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20  m += nResult;.  
1dfb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1dfc0 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20  Result; i++){.  
1dfd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1dfe0 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
1dff0 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69  pParse, p->x.pLi
1e000 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1e010 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  i+iResult);.    
1e020 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1e030 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a  return iResult;.
1e040 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1e050 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
1e060 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
1e070 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
1e080 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1e090 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
1e0a0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1e0b0 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
1e0c0 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1e0d0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1e0e0 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1e0f0 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1e100 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1e110 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1e120 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1e130 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1e140 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1e150 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1e160 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1e170 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1e180 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1e190 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1e1a0 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1e1b0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1e1c0 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1e1d0 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1e1e0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1e1f0 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1e200 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1e210 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e220 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1e230 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1e240 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1e250 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1e260 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1e270 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1e280 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1e290 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1e2a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1e2b0 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1e2c0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1e2d0 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1e2e0 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1e2f0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1e300 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1e310 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1e320 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1e330 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1e340 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1e350 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1e360 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1e370 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1e380 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1e390 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1e3a0 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1e3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1e3c0 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1e3d0 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20  mbers */.  Expr 
1e3e0 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20  tempX;          
1e3f0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
1e400 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  y expression nod
1e410 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20  e */.  int p5 = 
1e420 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  0;..  assert( ta
1e430 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
1e440 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
1e450 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
1e460 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1e470 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1e480 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
1e490 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
1e4a0 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
1e4b0 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
1e4c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
1e4d0 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
1e4e0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1e4f0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1e500 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1e510 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1e520 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
1e530 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
1e540 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1e550 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
1e560 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
1e570 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
1e580 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
1e590 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
1e5a0 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
1e5b0 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  m>0 );.        r
1e5c0 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d  eturn pCol->iMem
1e5d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1e5e0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
1e5f0 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
1e600 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e610 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1e620 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
1e630 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20  ortingIdxPTab,. 
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1e660 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
1e670 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e680 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e6a0 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  /* Otherwise, fa
1e6b0 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
1e6c0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20   TK_COLUMN case 
1e6d0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
1e6e0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
1e6f0 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20       int iTab = 
1e700 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
1e710 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20       if( iTab<0 
1e720 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1e730 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c  Parse->iSelfTab<
1e740 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1e750 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1e760 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1e770 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1e780 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1e790 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1e7a0 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  rn pExpr->iColum
1e7b0 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  n - pParse->iSel
1e7c0 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 65  fTab;.        }e
1e7d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1e7e0 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1e7f0 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1e800 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1e810 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1e820 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1e830 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1e840 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1e850 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1e860 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1e870 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1e880 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1e890 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 1;.        }. 
1e8a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1e8b0 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1e8c0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1e8d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  rse, pExpr->pTab
1e8e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e900 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1e910 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20   iTab, target,. 
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1e940 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d  xpr->op2);.    }
1e950 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
1e960 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
1e970 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1e980 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
1e990 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1e9a0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1e9b0 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 45      case TK_TRUE
1e9c0 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20 20 73  FALSE: {.      s
1e9d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e9e0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1e9f0 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
1ea00 56 61 6c 75 65 28 70 45 78 70 72 29 2c 20 74 61  Value(pExpr), ta
1ea10 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74  rget);.      ret
1ea20 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1ea30 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1ea40 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1ea50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
1ea60 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1ea70 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ea80 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ea90 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1eaa0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1eab0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1eac0 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
1ead0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1eae0 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  et;.    }.#endif
1eaf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
1eb00 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ING: {.      ass
1eb10 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1eb20 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1eb30 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1eb40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f     sqlite3VdbeLo
1eb50 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67  adString(v, targ
1eb60 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  et, pExpr->u.zTo
1eb70 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ken);.      retu
1eb80 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1eb90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1eba0 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
1ebb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ebc0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
1ebd0 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1ebe0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1ebf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ec00 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
1ec10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
1ec20 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
1ec30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
1ec40 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61  ar *z;.      cha
1ec50 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20  r *zBlob;.      
1ec60 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ec70 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ec80 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1ec90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1eca0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
1ecb0 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e  =='x' || pExpr->
1ecc0 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27  u.zToken[0]=='X'
1ecd0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ece0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1ecf0 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  n[1]=='\'' );.  
1ed00 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e      z = &pExpr->
1ed10 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20  u.zToken[2];.   
1ed20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
1ed30 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20  rlen30(z) - 1;. 
1ed40 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e       assert( z[n
1ed50 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
1ed60 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   zBlob = sqlite3
1ed70 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65  HexToBlob(sqlite
1ed80 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e  3VdbeDb(v), z, n
1ed90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1eda0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1edb0 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67  _Blob, n/2, targ
1edc0 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34  et, 0, zBlob, P4
1edd0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
1ede0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1edf0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1ee00 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
1ee10 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
1ee20 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1ee30 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1ee40 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1ee50 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ee60 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
1ee70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1ee80 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
1ee90 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1eea0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1eeb0 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
1eec0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
1eed0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1eee0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1eef0 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
1ef00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1ef10 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75  = sqlite3VListNu
1ef20 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e  mToName(pParse->
1ef30 70 56 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 69  pVList, pExpr->i
1ef40 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
1ef50 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ef60 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27  u.zToken[0]=='?'
1ef70 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72   || strcmp(pExpr
1ef80 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d  ->u.zToken, z)==
1ef90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
1efa0 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d  rse->pVList[0] =
1efb0 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65 20   0; /* Indicate 
1efc0 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e  VList may no lon
1efd0 67 65 72 20 62 65 20 65 6e 6c 61 72 67 65 64 20  ger be enlarged 
1efe0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
1eff0 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
1f000 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53  , (char*)z, P4_S
1f010 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
1f020 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1f030 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
1f040 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
1f050 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1f060 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
1f070 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1f080 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
1f090 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
1f0a0 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
1f0b0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
1f0c0 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
1f0d0 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
1f0e0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1f0f0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1f100 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
1f110 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
1f120 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
1f130 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
1f140 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f150 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1f160 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
1f170 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1f180 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
1f190 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1f1a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f1b0 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20  _Cast, target,. 
1f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66         sqlite3Af
1f1e0 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
1f1f0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b  ->u.zToken, 0));
1f200 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f210 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
1f220 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  he(pParse, inReg
1f230 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20  , inReg) );.    
1f240 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f250 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1f260 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1f270 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
1f280 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65   inReg;.    }.#e
1f290 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1f2a0 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
1f2b0 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
1f2c0 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
1f2d0 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
1f2e0 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
1f2f0 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20  TK_NE;.      p5 
1f300 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
1f310 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74  .      /* fall-t
1f320 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61  hrough */.    ca
1f330 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1f340 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1f350 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1f360 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1f370 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1f380 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1f390 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
1f3a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1f3b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1f3c0 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66  xprIsVector(pLef
1f3d0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  t) ){.        co
1f3e0 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28  deVectorCompare(
1f3f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1f400 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a  arget, op, p5);.
1f410 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f420 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1f430 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f440 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65  arse, pLeft, &re
1f450 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
1f460 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1f470 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f480 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f490 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1f4a0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1f4b0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1f4c0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1f4d0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  p,.            r
1f4e0 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
1f4f0 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70  LITE_STOREP2 | p
1f500 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  5);.        asse
1f510 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
1f520 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f530 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
1f540 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1f550 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
1f560 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
1f570 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f580 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
1f590 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1f5a0 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
1f5b0 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
1f5c0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f5d0 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
1f5e0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1f5f0 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
1f600 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
1f610 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f620 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
1f630 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1f640 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
1f650 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
1f660 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f670 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
1f680 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
1f690 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  q);.        asse
1f6a0 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
1f6b0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f6c0 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
1f6d0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
1f6e0 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
1f6f0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f700 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
1f710 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1f720 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
1f730 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f740 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1f750 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
1f760 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
1f770 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
1f780 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
1f790 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
1f7a0 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
1f7b0 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
1f7c0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
1f7d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
1f7e0 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
1f7f0 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
1f800 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
1f810 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
1f820 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1f830 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
1f840 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65  );            te
1f850 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41  stcase( op==TK_A
1f860 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
1f870 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
1f880 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
1f890 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f8a0 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  K_OR );.      as
1f8b0 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
1f8c0 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20  P_Add );        
1f8d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f8e0 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
1f8f0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
1f900 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
1f910 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28  );     testcase(
1f920 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
1f930 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f940 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
1f950 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74  der );      test
1f960 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
1f970 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f980 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
1f990 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74  BitAnd );      t
1f9a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f9b0 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  BITAND );.      
1f9c0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
1f9d0 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20  ==OP_BitOr );   
1f9e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f9f0 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
1fa00 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1fa10 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
1fa20 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61   );       testca
1fa30 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48  se( op==TK_SLASH
1fa40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1fa50 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
1fa60 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74  ShiftLeft );   t
1fa70 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fa80 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  LSHIFT );.      
1fa90 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
1faa0 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
1fab0 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f   );  testcase( o
1fac0 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a  p==TK_RSHIFT );.
1fad0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1fae0 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
1faf0 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  at );      testc
1fb00 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43  ase( op==TK_CONC
1fb10 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  AT );.      r1 =
1fb20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fb30 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1fb40 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1fb50 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1fb60 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fb70 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1fb80 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1fb90 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73  gFree2);.      s
1fba0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1fbb0 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20  (v, op, r2, r1, 
1fbc0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74  target);.      t
1fbd0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fbe0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1fbf0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1fc00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1fc10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fc20 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
1fc30 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
1fc40 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
1fc50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fc60 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
1fc70 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
1fc80 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
1fc90 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
1fca0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31  pParse, pLeft, 1
1fcb0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1fcc0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1fcd0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1fce0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1fcf0 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65  OINT.      }else
1fd00 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
1fd10 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
1fd20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1fd30 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1fd40 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1fd50 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
1fd60 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75  Real(v, pLeft->u
1fd70 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67  .zToken, 1, targ
1fd80 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1fd90 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64  urn target;.#end
1fda0 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  if.      }else{.
1fdb0 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70          tempX.op
1fdc0 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20   = TK_INTEGER;. 
1fdd0 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61         tempX.fla
1fde0 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs = EP_IntValue
1fdf0 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20  |EP_TokenOnly;. 
1fe00 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69         tempX.u.i
1fe10 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20  Value = 0;.     
1fe20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1fe30 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1fe40 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67  se, &tempX, &reg
1fe50 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
1fe60 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1fe70 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1fe80 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1fe90 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1fea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1feb0 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
1fec0 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72  act, r2, r1, tar
1fed0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  get);.        te
1fee0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1fef0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
1ff00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ff10 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
1ff20 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
1ff30 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
1ff40 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
1ff50 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20  ==OP_BitNot );  
1ff60 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ff70 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20  K_BITNOT );.    
1ff80 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
1ff90 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20  ==OP_Not );     
1ffa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ffb0 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20  ==TK_NOT );.    
1ffc0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1ffd0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1ffe0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1fff0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
20000 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
20010 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
20020 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20030 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69  Op2(v, op, r1, i
20040 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
20050 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20060 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20  se TK_TRUTH: {. 
20070 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b       int isTrue;
20080 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f      /* IS TRUE o
20090 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f  r IS NOT TRUE */
200a0 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 72 6d  .      int bNorm
200b0 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54 52 55 45  al;   /* IS TRUE
200c0 20 6f 72 20 49 53 20 46 41 4c 53 45 20 2a 2f 0a   or IS FALSE */.
200d0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
200e0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
200f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
20100 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
20110 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20120 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
20130 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73        isTrue = s
20140 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56  qlite3ExprTruthV
20150 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67  alue(pExpr->pRig
20160 68 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72 6d  ht);.      bNorm
20170 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d  al = pExpr->op2=
20180 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74 65  =TK_IS;.      te
20190 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26  stcase( isTrue &
201a0 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20 20  & bNormal);.    
201b0 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54    testcase( !isT
201c0 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b  rue && bNormal);
201d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
201e0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
201f0 50 5f 49 73 54 72 75 65 2c 20 72 31 2c 20 69 6e  P_IsTrue, r1, in
20200 52 65 67 2c 20 21 69 73 54 72 75 65 2c 20 69 73  Reg, !isTrue, is
20210 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b  True ^ bNormal);
20220 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20230 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
20240 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
20250 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
20260 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
20270 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
20280 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
20290 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
202a0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
202b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
202c0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
202d0 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
202e0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
202f0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  LL );.      sqli
20300 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20310 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
20320 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
20330 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
20340 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
20350 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
20360 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
20370 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
20380 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  e1==0 );.      a
20390 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
203a0 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72  eAddOp1(v, op, r
203b0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
203c0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
203d0 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
203e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
203f0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
20400 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
20410 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20420 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74  OP_Integer, 0, t
20430 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
20440 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
20450 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
20460 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
20470 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
20480 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
20490 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
204a0 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
204b0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
204c0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
204d0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
204e0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
204f0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
20500 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20510 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20520 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
20530 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45  egate: %s()", pE
20540 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
20550 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20560 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e 66       return pInf
20570 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
20580 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
20590 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
205a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
205b0 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
205c0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
205d0 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
205e0 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
205f0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
20600 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
20610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20620 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
20630 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
20640 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
20650 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
20660 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
20670 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
20680 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
20690 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  *zId;       /* T
206a0 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
206b0 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f   */.      u32 co
206c0 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  nstMask = 0;    
206d0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63   /* Mask of func
206e0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
206f0 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  hat are constant
20700 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
20710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20720 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20730 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
20740 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
20750 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  db;  /* The data
20760 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
20770 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
20780 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20  = ENC(db);      
20790 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f  /* The text enco
207a0 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69  ding used by thi
207b0 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
207c0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
207d0 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20  ll = 0;    /* A 
207e0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
207f0 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  ce */..      if(
20800 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
20810 50 61 72 73 65 29 20 26 26 20 73 71 6c 69 74 65  Parse) && sqlite
20820 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
20830 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b  otJoin(pExpr) ){
20840 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20  .        /* SQL 
20850 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65  functions can be
20860 20 65 78 70 65 6e 73 69 76 65 2e 20 53 6f 20 74   expensive. So t
20870 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73 74  ry to move const
20880 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20  ant functions.  
20890 20 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66 20        ** out of 
208a0 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20  the inner loop, 
208b0 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
208c0 6e 73 20 61 6e 20 65 78 74 72 61 20 4f 50 5f 43  ns an extra OP_C
208d0 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  opy. */.        
208e0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
208f0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
20900 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b  rse, pExpr, -1);
20910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
20920 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
20930 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
20940 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
20950 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
20960 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
20970 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
20980 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
20990 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
209a0 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
209b0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
209c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
209d0 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20  nFarg = pFarg ? 
209e0 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30  pFarg->nExpr : 0
209f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20a00 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
20a10 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
20a20 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49  lue) );.      zI
20a30 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  d = pExpr->u.zTo
20a40 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20  ken;.      pDef 
20a50 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
20a60 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e  ction(db, zId, n
20a70 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23  Farg, enc, 0);.#
20a80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
20a90 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f  BLE_UNKNOWN_SQL_
20aa0 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69  FUNCTION.      i
20ab0 66 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50  f( pDef==0 && pP
20ac0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
20ad0 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
20ae0 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
20af0 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e  ion(db, "unknown
20b00 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  ", nFarg, enc, 0
20b10 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
20b20 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  f.      if( pDef
20b30 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69  ==0 || pDef->xFi
20b40 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20  nalize!=0 ){.   
20b50 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
20b60 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
20b70 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20  known function: 
20b80 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20  %s()", zId);.   
20b90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20ba0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74    }..      /* At
20bb0 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69  tempt a direct i
20bc0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
20bd0 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f   the built-in CO
20be0 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20  ALESCE() and.   
20bf0 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66     ** IFNULL() f
20c00 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  unctions.  This 
20c10 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61  avoids unnecessa
20c20 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66  ry evaluation of
20c30 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  .      ** argume
20c40 6e 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72  nts past the fir
20c50 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75  st non-NULL argu
20c60 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
20c70 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
20c80 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
20c90 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20  E_FUNC_COALESCE 
20ca0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
20cb0 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c  ndCoalesce = sql
20cc0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
20cd0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73  l(v);.        as
20ce0 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29  sert( nFarg>=2 )
20cf0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20d00 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
20d10 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
20d20 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
20d30 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
20d40 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
20d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20d60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20d70 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c  NotNull, target,
20d80 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
20d90 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
20da0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
20db0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20dc0 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
20dd0 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20  e, target, 1);. 
20de0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20df0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
20e00 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
20e10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20e20 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
20e30 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[i].pExpr, targ
20e40 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  et);.          s
20e50 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
20e60 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
20e70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
20e80 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
20e90 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c  Label(v, endCoal
20ea0 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62  esce);.        b
20eb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
20ec0 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49       /* The UNLI
20ed0 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20  KELY() function 
20ee0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65  is a no-op.  The
20ef0 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76   result is the v
20f00 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  alue.      ** of
20f10 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
20f20 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
20f30 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
20f40 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
20f50 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29  _FUNC_UNLIKELY )
20f60 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
20f70 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20  ( nFarg>=1 );.  
20f80 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
20f90 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
20fa0 65 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  et(pParse, pFarg
20fb0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
20fc0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  rget);.      }..
20fd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
20fe0 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  BUG.      /* The
20ff0 20 41 46 46 49 4e 49 54 59 28 29 20 66 75 6e 63   AFFINITY() func
21000 74 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  tion evaluates t
21010 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  o a string that 
21020 64 65 73 63 72 69 62 65 73 0a 20 20 20 20 20 20  describes.      
21030 2a 2a 20 74 68 65 20 74 79 70 65 20 61 66 66 69  ** the type affi
21040 6e 69 74 79 20 6f 66 20 74 68 65 20 61 72 67 75  nity of the argu
21050 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20 75  ment.  This is u
21060 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
21070 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
21080 53 51 4c 69 74 65 20 74 79 70 65 20 6c 6f 67 69  SQLite type logi
21090 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
210a0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
210b0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
210c0 55 4e 43 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a  UNC_AFFINITY ){.
210d0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
210e0 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20  ar *azAff[] = { 
210f0 22 62 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c 20  "blob", "text", 
21100 22 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e 74 65  "numeric", "inte
21110 67 65 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a  ger", "real" };.
21120 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
21130 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
21140 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
21150 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69        aff = sqli
21160 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
21170 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
21180 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
21190 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
211a0 67 28 76 2c 20 74 61 72 67 65 74 2c 20 0a 20 20  g(v, target, .  
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211c0 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66 20              aff 
211d0 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49  ? azAff[aff-SQLI
211e0 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22  TE_AFF_BLOB] : "
211f0 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20  none");.        
21200 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
21210 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
21220 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
21230 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
21240 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
21250 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
21260 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
21270 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
21280 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
21290 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20   i==31 );.      
212a0 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
212b0 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20   MASKBIT32(i);. 
212c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
212d0 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
212e0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
212f0 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30  UNC_NEEDCOLL)!=0
21300 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
21310 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
21320 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
21330 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  eq(pParse, pFarg
21340 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
21350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21360 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
21370 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21380 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20  constMask ){.   
21390 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72         r1 = pPar
213a0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
213b0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
213c0 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20  em += nFarg;.   
213d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
213e0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
213f0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
21400 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20  Parse, nFarg);. 
21410 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
21420 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28    /* For length(
21430 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66  ) and typeof() f
21440 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20  unctions with a 
21450 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c  column argument,
21460 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
21470 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72  the P5 parameter
21480 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d   to the OP_Colum
21490 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c  n opcode to OPFL
214a0 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20  AG_LENGTHARG.   
214b0 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41       ** or OPFLA
214c0 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70  G_TYPEOFARG resp
214d0 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f  ectively, to avo
214e0 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64  id unnecessary d
214f0 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ata.        ** l
21500 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  oading..        
21510 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
21520 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
21530 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  & (SQLITE_FUNC_L
21540 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e  ENGTH|SQLITE_FUN
21550 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b  C_TYPEOF))!=0 ){
21560 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78  .          u8 ex
21570 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  prOp;.          
21580 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31  assert( nFarg==1
21590 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
215a0 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30  sert( pFarg->a[0
215b0 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
215c0 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d          exprOp =
215d0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
215e0 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20  pr->op;.        
215f0 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b    if( exprOp==TK
21600 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f  _COLUMN || exprO
21610 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
21620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21630 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
21640 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c  UNC_LENGTH==OPFL
21650 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
21660 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
21670 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
21680 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54  TYPEOF==OPFLAG_T
21690 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20  YPEOFARG );.    
216a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
216b0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
216c0 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  s & OPFLAG_LENGT
216d0 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
216e0 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e      pFarg->a[0].
216f0 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20  pExpr->op2 = .  
21700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21710 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
21720 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  & (OPFLAG_LENGTH
21730 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f  ARG|OPFLAG_TYPEO
21740 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20  FARG);.         
21750 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
21760 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21770 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
21780 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65  e);     /* Ticke
21790 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a  t 2ea2425d34be *
217a0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
217b0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
217c0 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c  t(pParse, pFarg,
217d0 20 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20   r1, 0,.        
217e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217f0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45          SQLITE_E
21800 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45  CEL_DUP|SQLITE_E
21810 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20  CEL_FACTOR);.   
21820 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21830 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
21840 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  ;      /* Ticket
21850 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
21860 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21870 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20        r1 = 0;.  
21880 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
21890 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
218a0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
218b0 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
218c0 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
218d0 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
218e0 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
218f0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
21900 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
21910 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
21920 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
21930 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
21940 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
21950 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
21960 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
21970 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
21980 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
21990 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
219a0 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
219b0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
219c0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
219d0 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
219e0 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
219f0 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
21a00 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
21a10 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
21a20 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
21a30 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
21a40 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
21a50 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
21a60 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
21a70 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
21a80 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
21a90 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
21aa0 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
21ab0 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
21ac0 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
21ad0 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
21ae0 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
21af0 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
21b00 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
21b10 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
21b20 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
21b30 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
21b40 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
21b50 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66  >=2 && (pExpr->f
21b60 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46  lags & EP_InfixF
21b70 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
21b80 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
21b90 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
21ba0 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
21bb0 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e  rg, pFarg->a[1].
21bc0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
21bd0 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20  lse if( nFarg>0 
21be0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
21bf0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
21c00 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
21c10 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
21c20 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
21c30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
21c40 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  f.      if( pDef
21c50 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
21c60 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
21c70 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  LL ){.        if
21c80 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
21c90 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
21ca0 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
21cb0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
21cc0 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
21cd0 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
21ce0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
21cf0 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
21d00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46  SQLITE_ENABLE_OF
21d10 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20  FSET_SQL_FUNC.  
21d20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
21d30 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
21d40 5f 46 55 4e 43 5f 4f 46 46 53 45 54 20 29 7b 0a  _FUNC_OFFSET ){.
21d50 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 41          Expr *pA
21d60 72 67 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rg = pFarg->a[0]
21d70 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
21d80 69 66 28 20 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b  if( pArg->op==TK
21d90 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
21da0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21db0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66  AddOp3(v, OP_Off
21dc0 73 65 74 2c 20 70 41 72 67 2d 3e 69 54 61 62 6c  set, pArg->iTabl
21dd0 65 2c 20 70 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e  e, pArg->iColumn
21de0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
21df0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21e00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21e10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
21e20 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
21e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
21e40 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
21e50 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
21e60 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
21e70 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
21e80 20 3f 20 4f 50 5f 50 75 72 65 46 75 6e 63 30 20   ? OP_PureFunc0 
21e90 3a 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a  : OP_Function0,.
21ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21eb0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
21ec0 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c  ask, r1, target,
21ed0 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34   (char*)pDef, P4
21ee0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
21ef0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
21f00 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46  angeP5(v, (u8)nF
21f10 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arg);.      }.  
21f20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 26 26      if( nFarg &&
21f30 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b   constMask==0 ){
21f40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21f50 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
21f60 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61  (pParse, r1, nFa
21f70 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
21f80 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
21f90 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
21fa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21fb0 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
21fc0 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
21fd0 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
21fe0 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
21ff0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
22000 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
22010 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22020 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
22030 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
22040 4b 5f 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f  K_SELECT && (nCo
22050 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
22060 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
22070 78 70 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20  xpr)!=1 ){.     
22080 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
22090 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
220a0 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20   nCol, 1);.     
220b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
220c0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6f  return sqlite3Co
220d0 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
220e0 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
220f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22100 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
22110 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f   case TK_SELECT_
22120 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
22130 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69 66 28  int n;.      if(
22140 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
22150 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
22160 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
22170 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  ->iTable = sqlit
22180 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
22190 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
221a0 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Left, 0, 0);.   
221b0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
221c0 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
221d0 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c  ==0 || pExpr->pL
221e0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  eft->op==TK_SELE
221f0 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
22200 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20  pExpr->iTable.  
22210 20 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69       && pExpr->i
22220 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73 71 6c 69  Table!=(n = sqli
22230 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
22240 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 29  e(pExpr->pLeft))
22250 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
22260 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
22270 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63  sg(pParse, "%d c
22280 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20  olumns assigned 
22290 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20  %d values",.    
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
222c0 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20  r->iTable, n);. 
222d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
222e0 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  urn pExpr->pLeft
222f0 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72  ->iTable + pExpr
22300 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d  ->iColumn;.    }
22310 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
22320 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
22330 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
22340 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
22350 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
22360 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
22370 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
22380 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
22390 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
223a0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
223b0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
223c0 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
223d0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
223e0 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
223f0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
22400 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22410 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
22420 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
22430 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
22440 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
22450 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alse);.      sql
22460 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22470 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
22480 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  get, 0);.      s
22490 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
224a0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
224b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  Null);.      ret
224c0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
224d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
224e0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
224f0 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20   */...    /*.   
22500 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   **    x BETWEEN
22510 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a   y AND z.    **.
22520 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65      ** This is e
22530 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20  quivalent to.   
22540 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e   **.    **    x>
22550 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
22560 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73  **.    ** X is s
22570 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
22580 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
22590 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
225a0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
225b0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20  pExpr..    ** Z 
225c0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
225d0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
225e0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  pExpr..    */.  
225f0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
22600 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78 70 72 43  N: {.      exprC
22610 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
22620 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
22630 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  , 0, 0);.      r
22640 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
22650 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
22660 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  SPAN:.    case T
22670 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20  K_COLLATE: .    
22680 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
22690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
226a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
226b0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
226c0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
226d0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  );.    }..    ca
226e0 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
226f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
22700 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
22710 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
22720 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
22730 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
22740 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
22750 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
22760 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
22770 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
22780 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
22790 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
227a0 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
227b0 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
227c0 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
227d0 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
227e0 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
227f0 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
22800 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
22810 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
22820 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
22830 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
22840 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
22850 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
22860 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
22870 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
22880 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  *.      ** The e
22890 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70  xpression is imp
228a0 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
228b0 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64  n OP_Param opcod
228c0 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20  e. The p1.      
228d0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
228e0 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20  set to 0 for an 
228f0 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65  old.rowid refere
22900 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29  nce, or to (i+1)
22910 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66  .      ** to ref
22920 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63  erence another c
22930 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64  olumn of the old
22940 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
22950 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a   where .      **
22960 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   i is the index 
22970 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46  of the column. F
22980 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72  or a new.rowid r
22990 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a  eference, p1 is.
229a0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
229b0 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69  (n+1), where n i
229c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
229d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20  columns in each 
229e0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20  pseudo-table..  
229f0 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66      ** For a ref
22a00 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74  erence to any ot
22a10 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  her column in th
22a20 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  e new.* pseudo-t
22a30 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a  able, p1.      *
22a40 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32  * is set to (n+2
22a50 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64  +i), where n and
22a60 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65   i are as define
22a70 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f  d previously. Fo
22a80 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70  r.      ** examp
22a90 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65  le, if the table
22aa0 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65   on which trigge
22ab0 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72  rs are being fir
22ac0 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ed is.      ** d
22ad0 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20  eclared as:.    
22ae0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
22af0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
22b00 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a  a, b);.      **.
22b10 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31        ** Then p1
22b20 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
22b30 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
22b40 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
22b50 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==0   ->    ol
22b60 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d  d.rowid     p1==
22b70 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f  3   ->    new.ro
22b80 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  wid.      **   p
22b90 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==1   ->    old
22ba0 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34  .a         p1==4
22bb0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20     ->    new.a. 
22bc0 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20       **   p1==2 
22bd0 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20    ->    old.b   
22be0 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e        p1==5   ->
22bf0 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20      new.b       
22c00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22c10 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
22c20 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
22c30 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d   int p1 = pExpr-
22c40 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d  >iTable * (pTab-
22c50 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70  >nCol+1) + 1 + p
22c60 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a  Expr->iColumn;..
22c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
22c80 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
22c90 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  | pExpr->iTable=
22ca0 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =1 );.      asse
22cb0 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
22cc0 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d  mn>=-1 && pExpr-
22cd0 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >iColumn<pTab->n
22ce0 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Col );.      ass
22cf0 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79  ert( pTab->iPKey
22d00 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f  <0 || pExpr->iCo
22d10 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65  lumn!=pTab->iPKe
22d20 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  y );.      asser
22d30 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28  t( p1>=0 && p1<(
22d40 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20  pTab->nCol*2+2) 
22d50 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
22d60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22d70 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72  P_Param, p1, tar
22d80 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  get);.      Vdbe
22d90 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
22da0 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20  %s -> $%d",.    
22db0 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62      (pExpr->iTab
22dc0 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c  le ? "new" : "ol
22dd0 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45  d"),.        (pE
22de0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
22df0 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
22e00 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  ->pTab->aCol[pEx
22e10 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61  pr->iColumn].zNa
22e20 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72  me),.        tar
22e30 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23  get.      ));..#
22e40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22e50 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
22e60 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  T.      /* If th
22e70 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41  e column has REA
22e80 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d  L affinity, it m
22e90 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
22ea0 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20  stored as an.   
22eb0 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55     ** integer. U
22ec0 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  se OP_RealAffini
22ed0 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ty to make sure 
22ee0 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61  it is really rea
22ef0 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  l..      **.    
22f00 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
22f10 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20  : R-60985-57662 
22f20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76  SQLite will conv
22f30 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62 61  ert the value ba
22f40 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66  ck to.      ** f
22f50 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68  loating point wh
22f60 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 74  en extracting it
22f70 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64   from the record
22f80 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
22f90 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
22fa0 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61  0 .       && pTa
22fb0 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
22fc0 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
22fd0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
22fe0 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  L.      ){.     
22ff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23000 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41  dOp1(v, OP_RealA
23010 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29  ffinity, target)
23020 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
23030 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
23040 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
23050 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20  _VECTOR: {.     
23060 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
23070 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61  (pParse, "row va
23080 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20  lue misused");. 
23090 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
230a0 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  }..    case TK_I
230b0 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a 20 20  F_NULL_ROW: {.  
230c0 20 20 20 20 69 6e 74 20 61 64 64 72 49 4e 52 3b      int addrINR;
230d0 0a 20 20 20 20 20 20 61 64 64 72 49 4e 52 20 3d  .      addrINR =
230e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
230f0 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c 6c 52  p1(v, OP_IfNullR
23100 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ow, pExpr->iTabl
23110 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
23120 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
23130 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
23140 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
23150 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
23160 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
23170 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
23180 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
23190 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
231a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
231b0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
231c0 4e 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  NR);.      sqlit
231d0 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
231e0 2c 20 61 64 64 72 49 4e 52 2c 20 69 6e 52 65 67  , addrINR, inReg
231f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
23200 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
23210 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20    ** Form A:.   
23220 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45   **   CASE x WHE
23230 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
23240 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
23250 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
23260 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
23270 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42  **.    ** Form B
23280 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
23290 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
232a0 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
232b0 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
232c0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
232d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
232e0 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72  m A is can be tr
232f0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74  ansformed into t
23300 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  he equivalent fo
23310 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  rm B as follows:
23320 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
23330 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31  HEN x=e1 THEN r1
23340 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20   WHEN x=e2 THEN 
23350 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20  r2 ....    **   
23360 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54       WHEN x=eN T
23370 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
23380 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
23390 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  X (if it exists)
233a0 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
233b0 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
233c0 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65   in the last ele
233d0 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78  ment of pExpr->x
233e0 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d  .pList if pExpr-
233f0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
23400 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20  is.    ** odd.  
23410 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
23420 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20  tional.  If the 
23430 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
23440 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20  ts in x.pList.  
23450 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68    ** is even, th
23460 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20  en Y is omitted 
23470 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77 69  and the "otherwi
23480 73 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55  se" result is NU
23490 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73  LL..    ** Ei is
234a0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
234b0 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20  ->a[i*2] and Ri 
234c0 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  is pExpr->pList-
234d0 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a  >a[i*2+1]..    *
234e0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  *.    ** The res
234f0 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ult of the expre
23500 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20  ssion is the Ri 
23510 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  for the first ma
23520 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a  tching Ei,.    *
23530 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  * or if there is
23540 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c   no matching Ei,
23550 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59   the ELSE term Y
23560 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
23570 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20  .    ** no ELSE 
23580 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20  term, NULL..    
23590 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
235a0 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43  assert( op==TK_C
235b0 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ASE ); {.      i
235c0 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20  nt endLabel;    
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235e0 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
235f0 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73  or end of CASE s
23600 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
23610 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20   nextCase;      
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23630 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
23640 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73   next WHEN claus
23650 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
23660 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
23670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23680 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45  2x number of WHE
23690 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
236a0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
236d0 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  er */.      Expr
236e0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23700 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65   List of WHEN te
23710 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  rms */.      str
23720 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
23730 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f  m *aListelem;  /
23740 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20  * Array of WHEN 
23750 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45  terms */.      E
23760 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20  xpr opCompare;  
23770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23780 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78   /* The X==Ei ex
23790 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
237a0 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
237b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237c0 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70      /* The X exp
237d0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
237e0 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30   Expr *pTest = 0
237f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23800 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72     /* X==Ei (for
23810 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20  m A) or just Ei 
23820 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20  (form B) */.    
23830 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
23840 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50  iCacheLevel = pP
23850 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
23860 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65  l; )..      asse
23870 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
23880 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
23890 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78  IsSelect) && pEx
238a0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20  pr->x.pList );. 
238b0 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
238c0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
238d0 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
238e0 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
238f0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
23900 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
23910 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
23920 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
23930 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20  .      endLabel 
23940 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
23950 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
23960 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72   if( (pX = pExpr
23970 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
23980 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a         tempX = *
23990 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  pX;.        test
239a0 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
239b0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
239c0 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65     exprToRegiste
239d0 72 28 26 74 65 6d 70 58 2c 20 65 78 70 72 43 6f  r(&tempX, exprCo
239e0 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  deVector(pParse,
239f0 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65   &tempX, &regFre
23a00 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e1));.        te
23a10 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
23a20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ==0 );.        m
23a30 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70 61 72 65  emset(&opCompare
23a40 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f  , 0, sizeof(opCo
23a50 6d 70 61 72 65 29 29 3b 0a 20 20 20 20 20 20 20  mpare));.       
23a60 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
23a70 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
23a80 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
23a90 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20   &tempX;.       
23aa0 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70   pTest = &opComp
23ab0 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  are;.        /* 
23ac0 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39  Ticket b351d95f9
23ad0 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31  cd5ef17e9d9dbae1
23ae0 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a  8f5ca8611190001:
23af0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
23b00 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65  value in regFree
23b10 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70  1 might get SCop
23b20 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69  y-ed into the fi
23b30 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20  le result..     
23b40 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75     ** So make su
23b50 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46  re that the regF
23b60 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73  ree1 register is
23b70 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20   not reused for 
23b80 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  other.        **
23b90 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f   purposes and po
23ba0 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74  ssibly overwritt
23bb0 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  en.  */.        
23bc0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
23bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
23be0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20  i=0; i<nExpr-1; 
23bf0 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20  i=i+2){.        
23c00 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
23c10 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
23c20 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a        if( pX ){.
23c30 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23c40 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20  ( pTest!=0 );.  
23c50 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
23c60 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74  e.pRight = aList
23c70 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
23c80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23c90 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
23ca0 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
23cb0 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
23cc0 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d        nextCase =
23cd0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
23ce0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
23cf0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73    testcase( pTes
23d00 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
23d10 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
23d20 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
23d30 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65  Parse, pTest, ne
23d40 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a  xtCase, SQLITE_J
23d50 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
23d60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
23d70 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
23d80 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
23d90 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
23da0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23db0 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
23dc0 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  +1].pExpr, targe
23dd0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
23de0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65  te3VdbeGoto(v, e
23df0 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
23e00 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
23e10 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
23e20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23e30 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
23e40 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
23e50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
23e60 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20  nExpr&1)!=0 ){. 
23e70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23e80 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
23e90 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
23ea0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
23eb0 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e  rse, pEList->a[n
23ec0 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74  Expr-1].pExpr, t
23ed0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
23ee0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
23ef0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
23f00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23f20 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
23f30 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
23f40 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
23f50 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
23f60 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
23f70 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20  arse->nErr>0 .  
23f80 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
23f90 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d  se->iCacheLevel=
23fa0 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a  =iCacheLevel );.
23fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23fc0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
23fd0 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
23fe0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
23ff0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24000 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
24010 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
24020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
24030 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
24040 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20  E_Rollback .    
24050 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
24060 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
24070 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ort.           |
24080 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
24090 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  y==OE_Fail.     
240a0 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
240b0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
240c0 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ore.      );.   
240d0 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
240e0 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
240f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
24100 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24120 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
24130 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
24140 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
24150 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
24160 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
24170 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
24180 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
24190 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
241a0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
241b0 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
241c0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
241d0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
241e0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
241f0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
24200 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
24210 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
24220 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24230 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
24240 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50             v, OP
24250 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  _Halt, SQLITE_OK
24260 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20  , OE_Ignore, 0, 
24270 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
24280 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
24290 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
242a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
242b0 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
242c0 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
242d0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
242e0 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20  T_TRIGGER,.     
242f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24300 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
24310 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d  affinity, pExpr-
24320 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29  >u.zToken, 0, 0)
24330 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
24340 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
24350 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
24360 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
24370 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
24380 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
24390 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
243a0 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
243b0 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
243c0 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f  ../*.** Factor o
243d0 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74  ut the code of t
243e0 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
243f0 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ion to initializ
24400 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a  ation time..**.*
24410 2a 20 49 66 20 72 65 67 44 65 73 74 3e 3d 30 20  * If regDest>=0 
24420 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
24430 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64  is always stored
24440 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
24450 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 73  r and the.** res
24460 75 6c 74 20 69 73 20 6e 6f 74 20 72 65 75 73 61  ult is not reusa
24470 62 6c 65 2e 20 20 49 66 20 72 65 67 44 65 73 74  ble.  If regDest
24480 3c 30 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  <0 then this rou
24490 74 69 6e 65 20 69 73 20 66 72 65 65 20 74 6f 20  tine is free to 
244a0 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 76 61  .** store the va
244b0 6c 75 65 20 77 68 65 72 65 65 76 65 72 20 69 74  lue whereever it
244c0 20 77 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67   wants.  The reg
244d0 69 73 74 65 72 20 77 68 65 72 65 20 74 68 65 20  ister where the 
244e0 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 69  expression .** i
244f0 73 20 73 74 6f 72 65 64 20 69 73 20 72 65 74 75  s stored is retu
24500 72 6e 65 64 2e 20 20 57 68 65 6e 20 72 65 67 44  rned.  When regD
24510 65 73 74 3c 30 2c 20 74 77 6f 20 69 64 65 6e 74  est<0, two ident
24520 69 63 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73  ical expressions
24530 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f   will.** code to
24540 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74   the same regist
24550 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
24560 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
24570 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
24580 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
24590 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
245a0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
245b0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
245c0 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74  n to code when t
245d0 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69  he VDBE initiali
245e0 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zes */.  int reg
245f0 44 65 73 74 20 20 20 20 20 20 20 2f 2a 20 53 74  Dest       /* St
24600 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
24610 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
24620 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
24630 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f  *p;.  assert( Co
24640 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
24650 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61  se) );.  p = pPa
24660 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b  rse->pConstExpr;
24670 0a 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30  .  if( regDest<0
24680 20 26 26 20 70 20 29 7b 0a 20 20 20 20 73 74 72   && p ){.    str
24690 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
246a0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e  m *pItem;.    in
246b0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  t i;.    for(pIt
246c0 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45  em=p->a, i=p->nE
246d0 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b  xpr; i>0; pItem+
246e0 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  +, i--){.      i
246f0 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62  f( pItem->reusab
24700 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  le && sqlite3Exp
24710 72 43 6f 6d 70 61 72 65 28 30 2c 70 49 74 65 6d  rCompare(0,pItem
24720 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31  ->pExpr,pExpr,-1
24730 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
24740 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e  return pItem->u.
24750 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20  iConstExprReg;. 
24760 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24770 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
24780 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
24790 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
247a0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
247b0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
247c0 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a  rse, p, pExpr);.
247d0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
247e0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
247f0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
24800 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b  ->a[p->nExpr-1];
24810 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75  .     pItem->reu
24820 73 61 62 6c 65 20 3d 20 72 65 67 44 65 73 74 3c  sable = regDest<
24830 30 3b 0a 20 20 20 20 20 69 66 28 20 72 65 67 44  0;.     if( regD
24840 65 73 74 3c 30 20 29 20 72 65 67 44 65 73 74 20  est<0 ) regDest 
24850 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
24860 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e  ;.     pItem->u.
24870 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20  iConstExprReg = 
24880 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70  regDest;.  }.  p
24890 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
248a0 72 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20  r = p;.  return 
248b0 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  regDest;.}../*.*
248c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
248d0 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
248e0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
248f0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
24900 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
24910 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
24920 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
24930 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
24940 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
24950 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
24960 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
24970 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
24980 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
24990 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
249a0 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
249b0 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
249c0 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
249d0 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  ster is not.** a
249e0 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e   temporary, then
249f0 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65   set *pReg to ze
24a00 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  ro..**.** If pEx
24a10 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  pr is a constant
24a20 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
24a30 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61  ine might genera
24a40 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20  te this.** code 
24a50 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69  to fill the regi
24a60 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74  ster in the init
24a70 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69  ialization secti
24a80 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42  on of the.** VDB
24a90 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72  E program, in or
24aa0 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74  der to factor it
24ab0 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c   out of the eval
24ac0 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a  uation loop..*/.
24ad0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
24ae0 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70  odeTemp(Parse *p
24af0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
24b00 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a  pr, int *pReg){.
24b10 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70    int r2;.  pExp
24b20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
24b30 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
24b40 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61  );.  if( ConstFa
24b50 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20  ctorOk(pParse). 
24b60 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d    && pExpr->op!=
24b70 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26  TK_REGISTER.   &
24b80 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
24b90 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
24ba0 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 2a  Expr).  ){.    *
24bb0 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 72  pReg  = 0;.    r
24bc0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
24bd0 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
24be0 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20  , pExpr, -1);.  
24bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
24c00 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
24c10 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
24c20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
24c30 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
24c40 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
24c50 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31  ;.    if( r2==r1
24c60 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20   ){.      *pReg 
24c70 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = r1;.    }else{
24c80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
24c90 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
24ca0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
24cb0 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  *pReg = 0;.    }
24cc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
24cd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
24ce0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
24cf0 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
24d00 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
24d10 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
24d20 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
24d30 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
24d40 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
24d50 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
24d60 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
24d70 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  arget..*/.void s
24d80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
24d90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
24da0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
24db0 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
24dc0 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
24dd0 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
24de0 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
24df0 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
24e00 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
24e10 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
24e20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24e30 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
24e40 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
24e50 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
24e60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24e70 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
24e80 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
24e90 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
24ea0 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
24eb0 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
24ec0 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
24ed0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
24ee0 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
24ef0 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
24f00 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
24f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24f20 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
24f30 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
24f40 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
24f50 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
24f60 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74  Make a transient
24f70 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
24f80 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68  ion pExpr and th
24f90 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67  en code it using
24fa0 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43  .** sqlite3ExprC
24fb0 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75  ode().  This rou
24fc0 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20  tine works just 
24fd0 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
24fe0 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74  Code().** except
24ff0 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20   that the input 
25000 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75  expression is gu
25010 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75  aranteed to be u
25020 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
25030 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
25040 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61  eCopy(Parse *pPa
25050 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
25060 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
25070 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
25080 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78  Parse->db;.  pEx
25090 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
250a0 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
250b0 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  );.  if( !db->ma
250c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c  llocFailed ) sql
250d0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
250e0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
250f0 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  et);.  sqlite3Ex
25100 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
25110 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  pr);.}../*.** Ge
25120 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
25130 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
25140 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
25150 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
25160 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
25170 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
25180 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
25190 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
251a0 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
251b0 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68  r target.  If th
251c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
251d0 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
251e0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
251f0 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63  ight choose to c
25200 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ode the expressi
25210 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61  on at initializa
25220 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f  tion time..*/.vo
25230 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
25240 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72  deFactorable(Par
25250 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
25260 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
25270 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72  get){.  if( pPar
25280 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
25290 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  r && sqlite3Expr
252a0 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
252b0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
252c0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
252d0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
252e0 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
252f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25300 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
25310 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a  r, target);.  }.
25320 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
25330 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
25340 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  uates the given 
25350 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
25360 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  uts the result.*
25370 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
25380 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rget..**.** Also
25390 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
253a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
253b0 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74  esults into anot
253c0 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69  her "cache" regi
253d0 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69  ster.** and modi
253e0 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
253f0 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  n so that the ne
25400 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76  xt time it is ev
25410 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20  aluated,.** the 
25420 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79  result is a copy
25430 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65   of the cache re
25440 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  gister..**.** Th
25450 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
25460 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ed for expressio
25470 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ns that are used
25480 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
25490 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65  mes.  They are e
254a0 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e  valuated once an
254b0 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
254c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
254d0 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a  ** are reused..*
254e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
254f0 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
25500 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
25510 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
25520 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
25530 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
25540 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a  e;.  int iMem;..
25550 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
25560 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
25570 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
25580 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69  GISTER );.  sqli
25590 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
255a0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
255b0 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  t);.  iMem = ++p
255c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
255d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
255e0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72  (v, OP_Copy, tar
255f0 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78  get, iMem);.  ex
25600 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45 78  prToRegister(pEx
25610 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a  pr, iMem);.}../*
25620 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
25630 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
25640 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
25650 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
25660 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
25670 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  ion list into a 
25680 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
25690 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
256a0 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  at target..**.**
256b0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
256c0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65  er of elements e
256d0 76 61 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e  valuated.  The n
256e0 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 77  umber returned w
256f0 69 6c 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62  ill.** usually b
25700 65 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62  e pList->nExpr b
25710 75 74 20 6d 69 67 68 74 20 62 65 20 72 65 64 75  ut might be redu
25720 63 65 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43  ced if SQLITE_EC
25730 45 4c 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73  EL_OMITREF.** is
25740 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
25750 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
25760 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74  DUP flag prevent
25770 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s the arguments 
25780 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69  from being.** fi
25790 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43  lled using OP_SC
257a0 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75  opy.  OP_Copy mu
257b0 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  st be used inste
257c0 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ad..**.** The SQ
257d0 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
257e0 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73   argument allows
257f0 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
25800 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63  nts to be.** fac
25810 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69  tored out into i
25820 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f  nitialization co
25830 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  de..**.** The SQ
25840 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c  LITE_ECEL_REF fl
25850 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78  ag means that ex
25860 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
25870 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78   list with.** Ex
25880 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69  prList.a[].u.x.i
25890 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76  OrderByCol>0 hav
258a0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
258b0 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f  valuated and sto
258c0 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  red.** in regist
258d0 65 72 73 20 61 74 20 73 72 63 52 65 67 2c 20 61  ers at srcReg, a
258e0 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20  nd so the value 
258f0 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72  can be copied fr
25900 6f 6d 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20  om there..** If 
25910 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
25920 52 45 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c  REF is also set,
25930 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73   then the values
25940 20 77 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72   with u.x.iOrder
25950 42 79 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73  ByCol>0.** are s
25960 69 6d 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61  imply omitted ra
25970 74 68 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20  ther than being 
25980 63 6f 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52  copied from srcR
25990 65 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  eg..*/.int sqlit
259a0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
259b0 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
259c0 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
259d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
259e0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
259f0 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
25a00 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
25a10 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
25a20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
25a30 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
25a40 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
25a50 74 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20  t srcReg,       
25a60 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73   /* Source regis
25a70 74 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45  ters if SQLITE_E
25a80 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20  CEL_REF */.  u8 
25a90 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
25aa0 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a  /* SQLITE_ECEL_*
25ab0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73   flags */.){.  s
25ac0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
25ad0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
25ae0 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20  t i, j, n;.  u8 
25af0 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20  copyOp = (flags 
25b00 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  & SQLITE_ECEL_DU
25b10 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f  P) ? OP_Copy : O
25b20 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20  P_SCopy;.  Vdbe 
25b30 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
25b40 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  be;.  assert( pL
25b50 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ist!=0 );.  asse
25b60 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
25b70 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
25b80 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f  ->pVdbe!=0 );  /
25b90 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69  * Never gets thi
25ba0 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20  s far otherwise 
25bb0 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  */.  n = pList->
25bc0 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f  nExpr;.  if( !Co
25bd0 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
25be0 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e  se) ) flags &= ~
25bf0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
25c00 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  OR;.  for(pItem=
25c10 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
25c20 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
25c30 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
25c40 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
25c50 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  r;.    if( (flag
25c60 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
25c70 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20  REF)!=0 && (j = 
25c80 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
25c90 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20  rByCol)>0 ){.   
25ca0 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53     if( flags & S
25cb0 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52  QLITE_ECEL_OMITR
25cc0 45 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2d  EF ){.        i-
25cd0 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a  -;.        n--;.
25ce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25cf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25d00 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
25d10 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74 61  , j+srcReg-1, ta
25d20 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d  rget+i);.      }
25d30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
25d40 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25d50 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26  CEL_FACTOR)!=0 &
25d60 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
25d70 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29  onstant(pExpr) )
25d80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
25d90 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
25da0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
25db0 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73  get+i);.    }els
25dc0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52  e{.      int inR
25dd0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
25de0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
25df0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
25e00 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  +i);.      if( i
25e10 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  nReg!=target+i )
25e20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
25e30 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69   *pOp;.        i
25e40 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f  f( copyOp==OP_Co
25e50 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  py.         && (
25e60 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47  pOp=sqlite3VdbeG
25e70 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70  etOp(v, -1))->op
25e80 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  code==OP_Copy.  
25e90 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
25ea0 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52  1+pOp->p3+1==inR
25eb0 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
25ec0 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31  Op->p2+pOp->p3+1
25ed0 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20  ==target+i.     
25ee0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
25ef0 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20  pOp->p3++;.     
25f00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25f20 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
25f30 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69   inReg, target+i
25f40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25f50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
25f60 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
25f70 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
25f80 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
25f90 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
25fa0 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
25fb0 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
25fc0 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
25fd0 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
25fe0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
25ff0 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
26000 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
26010 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
26020 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
26030 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f  ** elimination o
26040 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78  f x..**.** The x
26050 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72  JumpIf parameter
26060 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61   determines deta
26070 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55  ils:.**.**    NU
26080 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
26090 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20        Store the 
260a0 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69  boolean result i
260b0 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20  n reg[dest].**  
260c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
260d0 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74  rue:      Jump t
260e0 6f 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a  o dest if true.*
260f0 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  *    sqlite3Expr
26100 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d  IfFalse:     Jum
26110 70 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c  p to dest if fal
26120 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d  se.**.** The jum
26130 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65  pIfNull paramete
26140 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  r is ignored if 
26150 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e  xJumpIf is NULL.
26160 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26170 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
26180 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
26190 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
261a0 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
261b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
261c0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
261d0 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45     /* The BETWEE
261e0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
261f0 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
26200 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
26210 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61  ination or stora
26220 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20  ge location */. 
26230 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50   void (*xJump)(P
26240 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c  arse*,Expr*,int,
26250 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20  int), /* Action 
26260 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74  to take */.  int
26270 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
26280 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * Take the jump 
26290 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  if the BETWEEN i
262a0 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78  s NULL */.){. Ex
262b0 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20  pr exprAnd;     
262c0 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61  /* The AND opera
262d0 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44  tor in  x>=y AND
262e0 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72   x<=z  */.  Expr
262f0 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a   compLeft;    /*
26300 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d   The  x>=y  term
26310 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52   */.  Expr compR
26320 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20  ight;   /* The  
26330 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x<=z  term */.  
26340 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20  Expr exprX;     
26350 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62    /* The  x  sub
26360 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
26370 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
26380 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75  ; /* Temporary u
26390 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a  se register */..
263a0 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c  .  memset(&compL
263b0 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  eft, 0, sizeof(E
263c0 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  xpr));.  memset(
263d0 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73  &compRight, 0, s
263e0 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
263f0 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c  memset(&exprAnd,
26400 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
26410 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45  );..  assert( !E
26420 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
26430 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
26440 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d  ct) );.  exprX =
26450 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a   *pExpr->pLeft;.
26460 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54    exprAnd.op = T
26470 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64  K_AND;.  exprAnd
26480 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65  .pLeft = &compLe
26490 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52  ft;.  exprAnd.pR
264a0 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68  ight = &compRigh
264b0 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70  t;.  compLeft.op
264c0 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70   = TK_GE;.  comp
264d0 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  Left.pLeft = &ex
264e0 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  prX;.  compLeft.
264f0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
26500 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
26510 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  xpr;.  compRight
26520 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63  .op = TK_LE;.  c
26530 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d  ompRight.pLeft =
26540 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52   &exprX;.  compR
26550 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45  ight.pRight = pE
26560 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
26570 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72  1].pExpr;.  expr
26580 54 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72  ToRegister(&expr
26590 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  X, exprCodeVecto
265a0 72 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  r(pParse, &exprX
265b0 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
265c0 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20   if( xJump ){.  
265d0 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20    xJump(pParse, 
265e0 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
265f0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
26600 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 72  else{.    /* Mar
26610 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  k the expression
26620 20 69 73 20 62 65 69 6e 67 20 66 72 6f 6d 20 74   is being from t
26630 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
26640 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a  lause of a join.
26650 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74      ** so that t
26660 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  he sqlite3ExprCo
26670 64 65 54 61 72 67 65 74 28 29 20 72 6f 75 74 69  deTarget() routi
26680 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  ne will not atte
26690 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20  mpt to move.    
266a0 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20 50  ** it into the P
266b0 61 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72 20  arse.pConstExpr 
266c0 6c 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c 64  list.  We should
266d0 20 75 73 65 20 61 20 6e 65 77 20 62 69 74 20 66   use a new bit f
266e0 6f 72 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a 20  or this,.    ** 
266f0 66 6f 72 20 63 6c 61 72 69 74 79 2c 20 62 75 74  for clarity, but
26700 20 77 65 20 61 72 65 20 6f 75 74 20 6f 66 20 62   we are out of b
26710 69 74 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e  its in the Expr.
26720 66 6c 61 67 73 20 66 69 65 6c 64 20 73 6f 20 77  flags field so w
26730 65 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f  e.    ** have to
26740 20 72 65 75 73 65 20 74 68 65 20 45 50 5f 46 72   reuse the EP_Fr
26750 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d  omJoin bit.  Bum
26760 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70 72  mer. */.    expr
26770 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72  X.flags |= EP_Fr
26780 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69  omJoin;.    sqli
26790 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
267a0 74 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  t(pParse, &exprA
267b0 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20  nd, dest);.  }. 
267c0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
267d0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
267e0 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20  egFree1);..  /* 
267f0 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20  Ensure adequate 
26800 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f  test coverage */
26810 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26820 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26830 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
26840 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
26850 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
26860 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26870 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
26880 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
26890 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
268a0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
268b0 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
268c0 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
268d0 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
268e0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
268f0 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26900 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26910 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21    && jumpIfNull!
26920 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
26930 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26940 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26950 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
26960 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
26970 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26980 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26990 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
269a0 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
269b0 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
269c0 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
269d0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
269e0 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
269f0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
26a00 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26a10 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26a20 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26a30 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
26a40 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
26a50 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
26a60 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b  ase( xJump==0 );
26a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
26a80 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
26a90 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
26aa0 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
26ab0 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
26ac0 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
26ad0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
26ae0 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
26af0 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
26b00 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
26b10 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
26b20 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
26b30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
26b40 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
26b50 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
26b60 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
26b70 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
26b80 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
26b90 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
26ba0 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
26bb0 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FNULL..**.** Thi
26bc0 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
26bd0 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
26be0 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
26bf0 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
26c00 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
26c10 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
26c20 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
26c30 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
26c40 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
26c50 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
26c60 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
26c70 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
26c80 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
26c90 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
26ca0 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
26cb0 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
26cc0 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
26cd0 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
26ce0 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
26cf0 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
26d00 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
26d10 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
26d20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
26d30 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
26d40 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
26d50 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
26d60 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
26d70 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
26d80 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
26d90 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
26da0 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
26db0 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
26dc0 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
26dd0 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
26de0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
26df0 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
26e00 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
26e10 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65  R(v==0) )     re
26e20 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65  turn;  /* Existe
26e30 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
26e40 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
26e50 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
26e60 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  pr==0) ) return;
26e70 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73    /* No way this
26e80 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20   can happen */. 
26e90 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
26ea0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
26eb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
26ec0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
26ed0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
26ee0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
26ef0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
26f00 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
26f10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
26f20 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
26f30 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a  xpr->pLeft, d2,j
26f40 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
26f50 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
26f60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26f70 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
26f80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26f90 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
26fa0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
26fb0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
26fc0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
26fd0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
26fe0 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
26ff0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
27000 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
27010 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27020 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
27030 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
27040 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
27050 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27060 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
27070 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
27080 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
27090 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
270a0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
270b0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
270c0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
270d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
270e0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
270f0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27100 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
27110 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
27120 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27130 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
27140 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
27150 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27160 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
27170 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
27180 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
27190 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
271a0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
271b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
271c0 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20  e TK_TRUTH: {.  
271d0 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20      int isNot;  
271e0 20 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52      /* IS NOT TR
271f0 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c  UE or IS NOT FAL
27200 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  SE */.      int 
27210 69 73 54 72 75 65 3b 20 20 20 20 20 2f 2a 20 49  isTrue;     /* I
27220 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54  S TRUE or IS NOT
27230 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74   TRUE */.      t
27240 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27250 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27260 69 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f  isNot = pExpr->o
27270 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20  p2==TK_ISNOT;.  
27280 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c      isTrue = sql
27290 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c  ite3ExprTruthVal
272a0 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ue(pExpr->pRight
272b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
272c0 65 28 20 69 73 54 72 75 65 20 26 26 20 69 73 4e  e( isTrue && isN
272d0 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ot );.      test
272e0 63 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26  case( !isTrue &&
272f0 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
27300 69 66 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e  if( isTrue ^ isN
27310 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ot ){.        sq
27320 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
27330 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27340 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20  Left, dest,.    
27350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27360 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51        isNot ? SQ
27370 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
27380 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  : 0);.      }els
27390 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
273a0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
273b0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
273c0 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20  ft, dest,.      
273d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273e0 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c       isNot ? SQL
273f0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a  ITE_JUMPIFNULL :
27400 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
27410 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27420 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
27430 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
27440 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  T:.      testcas
27450 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
27460 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27470 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
27480 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
27490 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
274a0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75   TK_NE;.      ju
274b0 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54  mpIfNull = SQLIT
274c0 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
274d0 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
274e0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
274f0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
27500 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
27510 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
27520 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
27530 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
27540 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
27550 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
27560 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20  pExpr->pLeft) ) 
27570 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70  goto default_exp
27580 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  r;.      testcas
27590 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
275a0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
275b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
275c0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
275d0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
275e0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
275f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27600 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27610 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
27620 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
27630 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
27640 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
27650 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
27660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27670 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
27680 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27690 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
276a0 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
276b0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
276c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
276d0 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
276e0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
276f0 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
27700 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
27710 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
27720 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
27730 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
27740 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
27750 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
27760 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
27770 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
27780 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
27790 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
277a0 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
277b0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
277c0 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
277d0 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
277e0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
277f0 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64  OP_Eq);.      Vd
27800 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27810 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
27820 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
27830 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
27840 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27850 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
27860 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
27870 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
27880 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
27890 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
278a0 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
278b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
278c0 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
278d0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
278e0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
278f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27900 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
27910 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
27920 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
27930 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
27940 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
27950 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27960 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
27970 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27980 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
27990 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
279a0 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61  TNULL: {.      a
279b0 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
279c0 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20  ==OP_IsNull );  
279d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
279e0 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
279f0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
27a00 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
27a10 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70   ); testcase( op
27a20 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
27a30 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
27a40 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
27a50 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27a60 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
27a70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27a80 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
27a90 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
27aa0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27ab0 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
27ac0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27ad0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
27ae0 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
27af0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27b00 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
27b10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27b20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
27b30 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
27b40 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
27b50 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
27b60 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
27b70 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
27b80 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
27b90 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ue, jumpIfNull);
27ba0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27bb0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
27bc0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
27bd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
27be0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
27bf0 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
27c00 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
27c10 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
27c20 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49  stIfNull = jumpI
27c30 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64  fNull ? dest : d
27c40 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20  estIfFalse;.    
27c50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
27c60 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
27c70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  r, destIfFalse, 
27c80 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
27c90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
27ca0 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
27cb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
27cc0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
27cd0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
27ce0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
27cf0 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
27d00 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74  t: {.    default
27d10 5f 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28  _expr:.      if(
27d20 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   exprAlwaysTrue(
27d30 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
27d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
27d50 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
27d60 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
27d70 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70  AlwaysFalse(pExp
27d80 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
27d90 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   No-op */.      
27da0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
27db0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
27dc0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
27dd0 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
27de0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
27df0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
27e00 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c  OP_If, r1, dest,
27e10 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
27e20 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
27e30 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
27e40 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27e50 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
27e60 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
27e70 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
27e80 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
27e90 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
27ea0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
27eb0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
27ec0 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
27ed0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
27ee0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
27ef0 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
27f00 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
27f10 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
27f20 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
27f30 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
27f40 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
27f50 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
27f60 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
27f70 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
27f80 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
27f90 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
27fa0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
27fb0 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
27fc0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
27fd0 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
27fe0 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
27ff0 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
28000 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
28010 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
28020 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
28030 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
28040 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
28050 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
28060 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
28070 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
28080 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
28090 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
280a0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
280b0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
280c0 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
280d0 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
280e0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
280f0 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
28100 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
28110 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
28120 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
28130 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
28140 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
28150 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74  return; /* Exist
28160 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
28170 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
28180 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
28190 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20   )    return;.. 
281a0 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
281b0 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
281c0 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
281d0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
281e0 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
281f0 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
28200 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
28210 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
28220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
28230 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
28240 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
28250 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
28260 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
28270 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
28280 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
28290 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
282a0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
282b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
282c0 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
282d0 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
282e0 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
282f0 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
28300 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
28310 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
28320 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
28330 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
28340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
28350 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
28360 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
28370 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
28380 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
28390 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
283a0 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
283b0 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
283c0 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
283d0 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
283e0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
283f0 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
28400 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
28410 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
28420 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
28430 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
28440 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
28450 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
28460 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
28470 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
28480 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
28490 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
284a0 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
284b0 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
284c0 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
284d0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
284e0 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
284f0 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
28500 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28510 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
28520 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
28530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
28540 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
28550 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
28560 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
28570 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
28580 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
28590 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
285a0 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
285b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
285c0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
285d0 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
285e0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
285f0 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
28600 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
28610 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28620 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
28630 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
28640 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
28650 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
28660 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28670 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
28680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
28690 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
286a0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
286b0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
286c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
286d0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
286e0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
286f0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
28700 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28710 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
28720 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
28730 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
28740 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
28750 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28760 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
28770 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
28780 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
28790 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
287a0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
287b0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
287c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
287d0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
287e0 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d  ->pLeft, d2, jum
287f0 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
28800 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
28810 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
28820 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
28830 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28840 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
28850 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
28860 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
28870 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28880 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
28890 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
288a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
288b0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
288c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
288d0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
288e0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
288f0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
28900 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28910 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
28920 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28930 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
28940 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
28950 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
28960 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20  TK_TRUTH: {.    
28970 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20 2f    int isNot;   /
28980 2a 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72  * IS NOT TRUE or
28990 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f   IS NOT FALSE */
289a0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75  .      int isTru
289b0 65 3b 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f  e;  /* IS TRUE o
289c0 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f  r IS NOT TRUE */
289d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
289e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
289f0 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20  ;.      isNot = 
28a00 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49  pExpr->op2==TK_I
28a10 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72  SNOT;.      isTr
28a20 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ue = sqlite3Expr
28a30 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70 72  TruthValue(pExpr
28a40 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
28a50 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75   testcase( isTru
28a60 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
28a70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
28a80 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29  sTrue && isNot )
28a90 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72  ;.      if( isTr
28aa0 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20  ue ^ isNot ){.  
28ab0 20 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45        /* IS TRUE
28ac0 20 61 6e 64 20 49 53 20 4e 4f 54 20 46 41 4c 53   and IS NOT FALS
28ad0 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  E */.        sql
28ae0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
28af0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28b00 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20  Left, dest,.    
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30         isNot ? 0
28b30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   : SQLITE_JUMPIF
28b40 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 7d 65  NULL);..      }e
28b50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
28b60 49 53 20 46 41 4c 53 45 20 61 6e 64 20 49 53 20  IS FALSE and IS 
28b70 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20  NOT TRUE */.    
28b80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
28b90 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
28ba0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
28bb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
28bd0 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a  t ? 0 : SQLITE_J
28be0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
28bf0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
28c00 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
28c10 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
28c20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20  TK_ISNOT:.      
28c30 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
28c40 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
28c50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
28c60 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
28c70 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
28c80 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
28c90 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f  S) ? TK_NE : TK_
28ca0 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66  EQ;.      jumpIf
28cb0 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55  Null = SQLITE_NU
28cc0 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46  LLEQ;.      /* F
28cd0 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
28ce0 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
28cf0 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
28d00 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
28d10 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
28d20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
28d30 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
28d40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
28d50 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70  xprIsVector(pExp
28d60 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f  r->pLeft) ) goto
28d70 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20   default_expr;. 
28d80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
28d90 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
28da0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
28db0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
28dc0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28dd0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
28de0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
28df0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
28e00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28e10 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
28e20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
28e30 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
28e40 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
28e50 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
28e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e70 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
28e80 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
28e90 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
28ea0 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
28eb0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
28ec0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
28ed0 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
28ee0 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
28ef0 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
28f00 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
28f10 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
28f20 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
28f30 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
28f40 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
28f50 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
28f60 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
28f70 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
28f80 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
28f90 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
28fa0 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
28fb0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
28fc0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28fd0 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
28fe0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
28ff0 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  q);.      VdbeCo
29000 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
29010 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
29020 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
29030 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
29040 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
29050 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
29060 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
29070 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LEQ);.      asse
29080 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
29090 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
290a0 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Ne);.      Vdb
290b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
290c0 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
290d0 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
290e0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
290f0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
29100 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
29110 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
29120 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74  NULLEQ);.      t
29130 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
29140 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
29150 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
29160 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
29170 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
29180 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
29190 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
291a0 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  L: {.      r1 = 
291b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
291c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
291d0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
291e0 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
291f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
29200 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
29210 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29220 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
29230 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
29240 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  f(v, op==TK_ISNU
29250 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
29260 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
29270 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65  ULL );  VdbeCove
29280 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
29290 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
292a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
292b0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
292c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
292d0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
292e0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
292f0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
29300 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
29310 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
29320 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
29330 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
29340 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  se, jumpIfNull);
29350 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
29360 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
29370 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
29380 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
29390 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d   {.      if( jum
293a0 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  pIfNull ){.     
293b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
293c0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
293d0 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b  pr, dest, dest);
293e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
293f0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
29400 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
29410 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
29420 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
29430 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
29440 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
29450 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
29460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
29470 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
29480 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
29490 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
294a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
294b0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
294c0 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a   default_expr: .
294d0 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
294e0 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
294f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29500 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
29510 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
29520 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
29530 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
29540 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20         /* no-op 
29550 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
29560 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
29570 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
29580 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
29590 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
295a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
295b0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
295c0 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
295d0 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
295e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
295f0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
29600 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
29610 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
29620 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
29630 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
29640 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
29650 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
29660 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
29670 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
29680 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
29690 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
296a0 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d  se, regFree2);.}
296b0 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c  ../*.** Like sql
296c0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
296d0 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20  ) except that a 
296e0 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
296f0 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20  pExpr before.** 
29700 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c  code generation,
29710 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69   and that copy i
29720 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20  s deleted after 
29730 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
29740 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73   This.** ensures
29750 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
29760 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68  al pExpr is unch
29770 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anged..*/.void s
29780 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
29790 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  eDup(Parse *pPar
297a0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
297b0 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75   int dest,int ju
297c0 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c  mpIfNull){.  sql
297d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
297e0 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
297f0 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78  Copy = sqlite3Ex
29800 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
29810 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
29820 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
29830 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
29840 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
29850 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75   pCopy, dest, ju
29860 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  mpIfNull);.  }. 
29870 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
29880 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d  te(db, pCopy);.}
29890 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
298a0 6f 6e 20 70 56 61 72 20 69 73 20 67 75 61 72 61  on pVar is guara
298b0 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 53  nteed to be an S
298c0 51 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45 78  QL variable. pEx
298d0 70 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a 2a  pr may be any.**
298e0 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73 73   type of express
298f0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ion..**.** If pE
29900 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20  xpr is a simple 
29910 53 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20 69  SQL value - an i
29920 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74  nteger, real, st
29930 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72  ring, blob.** or
29940 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74 68   NULL value - th
29950 65 6e 20 74 68 65 20 56 44 42 45 20 63 75 72 72  en the VDBE curr
29960 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65 70  ently being prep
29970 61 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75 72  ared is configur
29980 65 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65 70  ed.** to re-prep
29990 61 72 65 20 65 61 63 68 20 74 69 6d 65 20 61 20  are each time a 
299a0 6e 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f 75  new value is bou
299b0 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70  nd to variable p
299c0 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74  Var..**.** Addit
299d0 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78 70  ionally, if pExp
299e0 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51  r is a simple SQ
299f0 4c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  L value and the 
29a00 76 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20  value is the.** 
29a10 73 61 6d 65 20 61 73 20 74 68 61 74 20 63 75 72  same as that cur
29a20 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f 20  rently bound to 
29a30 76 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20 6e  variable pVar, n
29a40 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
29a50 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
29a60 65 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 73  e, if the values
29a70 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d   are not the sam
29a80 65 20 6f 72 20 69 66 20 70 45 78 70 72 20 69 73  e or if pExpr is
29a90 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a 2a   not a simple.**
29aa0 20 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72 6f   SQL value, zero
29ab0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
29ac0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
29ad0 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28  CompareVariable(
29ae0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
29af0 78 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72 20  xpr *pVar, Expr 
29b00 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
29b10 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  es = 0;.  int iV
29b20 61 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ar;.  sqlite3_va
29b30 6c 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20 30  lue *pL, *pR = 0
29b40 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56 61  ;.  .  sqlite3Va
29b50 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
29b60 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53  se->db, pExpr, S
29b70 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
29b80 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70 52  TE_AFF_BLOB, &pR
29b90 29 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a 20  );.  if( pR ){. 
29ba0 20 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d 3e     iVar = pVar->
29bb0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c  iColumn;.    sql
29bc0 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
29bd0 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
29be0 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c 20  , iVar);.    pL 
29bf0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
29c00 42 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72 73  BoundValue(pPars
29c10 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69  e->pReprepare, i
29c20 56 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Var, SQLITE_AFF_
29c30 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70  BLOB);.    if( p
29c40 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  L ){.      if( s
29c50 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
29c60 65 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54 45  e(pL)==SQLITE_TE
29c70 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  XT ){.        sq
29c80 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
29c90 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75  (pL); /* Make su
29ca0 72 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  re the encoding 
29cb0 69 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20  is UTF-8 */.    
29cc0 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20    }.      res = 
29cd0 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43 6f   0==sqlite3MemCo
29ce0 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30 29  mpare(pL, pR, 0)
29cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29d00 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 29  te3ValueFree(pR)
29d10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
29d20 75 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d 0a  ueFree(pL);.  }.
29d30 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
29d40 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
29d50 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
29d60 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
29d70 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
29d80 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
29d90 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
29da0 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
29db0 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
29dc0 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
29dd0 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
29de0 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
29df0 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
29e00 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
29e10 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
29e20 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
29e30 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
29e40 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
29e50 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
29e60 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
29e70 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
29e80 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
29e90 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
29ea0 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
29eb0 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
29ec0 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
29ed0 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
29ee0 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
29ef0 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
29f00 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
29f10 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
29f20 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
29f30 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
29f40 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
29f50 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
29f60 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
29f70 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
29f80 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
29f90 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
29fa0 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
29fb0 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
29fc0 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
29fd0 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
29fe0 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
29ff0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
2a000 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
2a010 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
2a020 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
2a030 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
2a040 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
2a050 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
2a060 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
2a070 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
2a080 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
2a090 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
2a0a0 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
2a0b0 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
2a0c0 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
2a0d0 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
2a0e0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
2a0f0 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
2a100 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
2a110 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
2a120 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
2a130 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
2a140 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
2a150 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
2a160 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
2a170 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
2a180 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
2a190 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
2a1a0 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
2a1b0 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
2a1c0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
2a1d0 20 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e   pParse is not N
2a1e0 55 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52 49  ULL then TK_VARI
2a1f0 41 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70 41  ABLE terms in pA
2a200 20 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20 69   with bindings i
2a210 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52 65  n.** pParse->pRe
2a220 70 72 65 70 61 72 65 20 63 61 6e 20 62 65 20 6d  prepare can be m
2a230 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 6c  atched against l
2a240 69 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20 20  iterals in pB.  
2a250 54 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  The .** pParse->
2a260 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 62  pVdbe->expmask b
2a270 69 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74 65  itmask is update
2a280 64 20 66 6f 72 20 65 61 63 68 20 76 61 72 69 61  d for each varia
2a290 62 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e 0a  ble referenced..
2a2a0 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
2a2b0 4e 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61 6c  NULL (the normal
2a2c0 20 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79 20   case) then any 
2a2d0 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d  TK_VARIABLE term
2a2e0 20 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74   in .** Argument
2a2f0 20 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20 6e   pParse should n
2a300 6f 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e  ormally be NULL.
2a310 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
2a320 4c 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a 20  LL and pA or.** 
2a330 70 42 20 63 61 75 73 65 73 20 61 20 72 65 74 75  pB causes a retu
2a340 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a 2a  rn value of 2..*
2a350 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2a360 72 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a  rCompare(Parse *
2a370 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 41  pParse, Expr *pA
2a380 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
2a390 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d  iTab){.  u32 com
2a3a0 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66  binedFlags;.  if
2a3b0 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
2a3c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2a3d0 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
2a3e0 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 20   }.  if( pParse 
2a3f0 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  && pA->op==TK_VA
2a400 52 49 41 42 4c 45 20 26 26 20 65 78 70 72 43 6f  RIABLE && exprCo
2a410 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 70 50  mpareVariable(pP
2a420 61 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29 7b  arse, pA, pB) ){
2a430 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2a440 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61   }.  combinedFla
2a450 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c  gs = pA->flags |
2a460 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66   pB->flags;.  if
2a470 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
2a480 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
2a490 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  .    if( (pA->fl
2a4a0 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50  ags&pB->flags&EP
2a4b0 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26  _IntValue)!=0 &&
2a4c0 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70   pA->u.iValue==p
2a4d0 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
2a4e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2a4f0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2a500 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
2a510 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20  >op!=pB->op ){. 
2a520 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
2a530 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
2a540 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2a550 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66  pParse, pA->pLef
2a560 74 2c 70 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a  t,pB,iTab)<2 ){.
2a570 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2a580 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
2a590 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
2a5a0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
2a5b0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2a5c0 41 2c 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62  A,pB->pLeft,iTab
2a5d0 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
2a5e0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2a5f0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
2a600 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
2a610 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70  COLUMN && pA->op
2a620 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
2a630 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  && pA->u.zToken 
2a640 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
2a650 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
2a660 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
2a670 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75  te3StrICmp(pA->u
2a680 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
2a690 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72  oken)!=0 ) retur
2a6a0 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 2;.    }else i
2a6b0 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e  f( strcmp(pA->u.
2a6c0 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
2a6d0 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ken)!=0 ){.     
2a6e0 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d   return pA->op==
2a6f0 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a  TK_COLLATE ? 1 :
2a700 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
2a710 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
2a720 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28   EP_Distinct)!=(
2a730 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pB->flags & EP_D
2a740 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72  istinct) ) retur
2a750 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  n 2;.  if( ALWAY
2a760 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  S((combinedFlags
2a770 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29   & EP_TokenOnly)
2a780 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ==0) ){.    if( 
2a790 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
2a7a0 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72  EP_xIsSelect ) r
2a7b0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
2a7c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2a7d0 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e  are(pParse, pA->
2a7e0 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
2a7f0 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
2a800 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
2a810 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a820 50 61 72 73 65 2c 20 70 41 2d 3e 70 52 69 67 68  Parse, pA->pRigh
2a830 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69  t, pB->pRight, i
2a840 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
2a850 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2a860 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
2a870 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d  pA->x.pList, pB-
2a880 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20  >x.pList, iTab) 
2a890 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a8a0 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62  if( ALWAYS((comb
2a8b0 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52  inedFlags & EP_R
2a8c0 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70  educed)==0) && p
2a8d0 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47  A->op!=TK_STRING
2a8e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
2a8f0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
2a900 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
2a910 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  2;.      if( pA-
2a920 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
2a930 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28  ble .       && (
2a940 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62  pA->iTable!=iTab
2a950 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54   || NEVER(pB->iT
2a960 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75  able>=0)) ) retu
2a970 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
2a980 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a990 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
2a9a0 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
2a9b0 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
2a9c0 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
2a9d0 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a  al and .** non-z
2a9e0 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66  ero if they diff
2a9f0 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
2aa00 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
2aa10 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
2aa20 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
2aa30 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
2aa40 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
2aa50 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
2aa60 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
2aa70 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
2aa80 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
2aa90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2aaa0 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
2aab0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
2aac0 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
2aad0 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
2aae0 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
2aaf0 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
2ab00 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
2ab10 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
2ab20 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
2ab30 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
2ab40 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
2ab50 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
2ab60 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
2ab70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
2ab80 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
2ab90 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
2aba0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
2abb0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
2abc0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
2abd0 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
2abe0 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
2abf0 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
2ac00 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
2ac10 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
2ac20 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
2ac30 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
2ac40 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
2ac50 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74  0 && pB==0 ) ret
2ac60 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d  urn 0;.  if( pA=
2ac70 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65  =0 || pB==0 ) re
2ac80 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41  turn 1;.  if( pA
2ac90 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78  ->nExpr!=pB->nEx
2aca0 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pr ) return 1;. 
2acb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
2acc0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2acd0 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
2ace0 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pA->a[i].pExpr;.
2acf0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
2ad00 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pB->a[i].pExp
2ad10 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61  r;.    if( pA->a
2ad20 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70  [i].sortOrder!=p
2ad30 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  B->a[i].sortOrde
2ad40 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
2ad50 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2ad60 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70  rCompare(0, pExp
2ad70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62  rA, pExprB, iTab
2ad80 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
2ad90 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2ada0 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
2adb0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29  te3ExprCompare()
2adc0 20 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20   except COLLATE 
2add0 6f 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65  operators at the
2ade0 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72   top-level.** ar
2adf0 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e  e ignored..*/.in
2ae00 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
2ae10 70 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70  pareSkip(Expr *p
2ae20 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
2ae30 20 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e   iTab){.  return
2ae40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2ae50 61 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20 20  are(0,.         
2ae60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
2ae70 6b 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a  kipCollate(pA),.
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2ae90 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2aea0 61 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20 20  ate(pB),.       
2aeb0 20 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a        iTab);.}..
2aec0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
2aed0 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76  e if we can prov
2aee0 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61  e the pE2 will a
2aef0 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66  lways be true if
2af00 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e   pE1 is.** true.
2af10 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
2af20 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70  f we cannot comp
2af30 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f  lete the proof o
2af40 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a  r if pE2 might.*
2af50 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61  * be false.  Exa
2af60 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
2af70 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE1: x==5      
2af80 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE2: x==5      
2af90 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74         Result: t
2afa0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
2afb0 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20  x>0        pE2: 
2afc0 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
2afd0 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
2afe0 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20  *     pE1: x=21 
2aff0 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20        pE2: x=21 
2b000 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75  OR y=43     Resu
2b010 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
2b020 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20  pE1: x!=123     
2b030 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
2b040 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  LL    Result: tr
2b050 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
2b060 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78  !=?1      pE2: x
2b070 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
2b080 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2b090 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55      pE1: x IS NU
2b0a0 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f  LL  pE2: x IS NO
2b0b0 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
2b0c0 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
2b0d0 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70  E1: x IS ?2    p
2b0e0 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
2b0f0 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c  L    Reuslt: fal
2b100 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  se.**.** When co
2b110 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d  mparing TK_COLUM
2b120 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20  N nodes between 
2b130 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20  pE1 and pE2, if 
2b140 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e  pE2 has.** Expr.
2b150 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73  iTable<0 then as
2b160 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d  sume a table num
2b170 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61  ber given by iTa
2b180 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72  b..**.** If pPar
2b190 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  se is not NULL, 
2b1a0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20  then the values 
2b1b0 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c  of bound variabl
2b1c0 65 73 20 69 6e 20 70 45 31 20 61 72 65 20 0a 2a  es in pE1 are .*
2b1d0 2a 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e  * compared again
2b1e0 73 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65  st literal value
2b1f0 73 20 69 6e 20 70 45 32 20 61 6e 64 20 70 50 61  s in pE2 and pPa
2b200 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d  rse->pVdbe->expm
2b210 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69  ask is.** modifi
2b220 65 64 20 74 6f 20 72 65 63 6f 72 64 20 77 68 69  ed to record whi
2b230 63 68 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c  ch bound variabl
2b240 65 73 20 61 72 65 20 72 65 66 65 72 65 6e 63 65  es are reference
2b250 64 2e 20 20 49 66 20 70 50 61 72 73 65 20 0a 2a  d.  If pParse .*
2b260 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  * is NULL, then 
2b270 66 61 6c 73 65 20 77 69 6c 6c 20 62 65 20 72 65  false will be re
2b280 74 75 72 6e 65 64 20 69 66 20 70 45 31 20 63 6f  turned if pE1 co
2b290 6e 74 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64  ntains any bound
2b2a0 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
2b2b0 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  * When in doubt,
2b2c0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20   return false.  
2b2d0 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d  Returning true m
2b2e0 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
2b2f0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f  ormance.** impro
2b300 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69  vement.  Returni
2b310 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63  ng false might c
2b320 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  ause a performan
2b330 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75  ce reduction, bu
2b340 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77  t.** it will alw
2b350 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72  ays give the cor
2b360 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20  rect answer and 
2b370 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20  is hence always 
2b380 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  safe..*/.int sql
2b390 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2b3a0 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  xpr(Parse *pPars
2b3b0 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78  e, Expr *pE1, Ex
2b3c0 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61  pr *pE2, int iTa
2b3d0 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  b){.  if( sqlite
2b3e0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
2b3f0 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2c 20 69  rse, pE1, pE2, i
2b400 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Tab)==0 ){.    r
2b410 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
2b420 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f  f( pE2->op==TK_O
2b430 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33  R.   && (sqlite3
2b440 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
2b450 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
2b460 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20  ->pLeft, iTab). 
2b470 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2b480 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2b490 73 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  sExpr(pParse, pE
2b4a0 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20  1, pE2->pRight, 
2b4b0 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20  iTab) ).  ){.   
2b4c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
2b4d0 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
2b4e0 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31 2d  _NOTNULL && pE1-
2b4f0 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26  >op!=TK_ISNULL &
2b500 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53  & pE1->op!=TK_IS
2b510 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58   ){.    Expr *pX
2b520 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
2b530 69 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e 70  ipCollate(pE1->p
2b540 4c 65 66 74 29 3b 0a 20 20 20 20 74 65 73 74 63  Left);.    testc
2b550 61 73 65 28 20 70 58 21 3d 70 45 31 2d 3e 70 4c  ase( pX!=pE1->pL
2b560 65 66 74 20 29 3b 0a 20 20 20 20 69 66 28 20 73  eft );.    if( s
2b570 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2b580 65 28 70 50 61 72 73 65 2c 20 70 58 2c 20 70 45  e(pParse, pX, pE
2b590 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d  2->pLeft, iTab)=
2b5a0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
2b5b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2b5c0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
2b5d0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2b5e0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
2b5f0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
2b600 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
2b610 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20  determine if an 
2b620 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
2b630 65 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72  e evaluated by r
2b640 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
2b650 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77  ** index only, w
2b660 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
2b670 20 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72   do a search for
2b680 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2b690 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72  ng.** table entr
2b6a0 79 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72  y.  The IdxCover
2b6b0 2e 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74  .pIdx field is t
2b6c0 68 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f  he index.  IdxCo
2b6d0 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74  ver.iCur.** is t
2b6e0 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  he cursor for th
2b6f0 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  e table..*/.stru
2b700 63 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20  ct IdxCover {.  
2b710 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
2b720 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
2b730 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63   be tested for c
2b740 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74  overage */.  int
2b750 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a   iCur;        /*
2b760 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
2b770 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72  or the table cor
2b780 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
2b790 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f  e index */.};../
2b7a0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
2b7b0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72  e if there are r
2b7c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2b7d0 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a  umns in table .*
2b7e0 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  * pWalker->u.pId
2b7f0 78 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e  xCover->iCur can
2b800 20 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73   be satisfied us
2b810 69 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ing the index.**
2b820 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
2b830 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a  Cover->pIdx..*/.
2b840 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
2b850 64 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a  dxCover(Walker *
2b860 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2b870 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
2b880 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
2b890 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  N.   && pExpr->i
2b8a0 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Table==pWalker->
2b8b0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
2b8c0 72 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43  r.   && sqlite3C
2b8d0 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61  olumnOfIndex(pWa
2b8e0 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2b8f0 72 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e  r->pIdx, pExpr->
2b900 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a  iColumn)<0.  ){.
2b910 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
2b920 64 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  de = 1;.    retu
2b930 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2b940 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2b950 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2b960 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
2b970 6e 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20  n index pIdx on 
2b980 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
2b990 72 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  r iCur contains 
2b9a0 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72  will.** the expr
2b9b0 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
2b9c0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2b9d0 65 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76  e index does cov
2b9e0 65 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  er the.** expres
2b9f0 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69  sion and false i
2ba00 66 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  f the pExpr expr
2ba10 65 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65  ession reference
2ba20 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a  s table columns.
2ba30 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
2ba40 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64  found in the ind
2ba50 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41  ex pIdx..**.** A
2ba60 6e 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67  n index covering
2ba70 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
2ba80 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78  eans that the ex
2ba90 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a  pression can be.
2baa0 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69  ** evaluated usi
2bab0 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65  ng only the inde
2bac0 78 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61  x and without ha
2bad0 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74  ving to lookup t
2bae0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
2baf0 69 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e  ing table entry.
2bb00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2bb10 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65  xprCoveredByInde
2bb20 78 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  x(.  Expr *pExpr
2bb30 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2bb40 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74  index to be test
2bb50 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
2bb60 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2bb70 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
2bb80 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
2bb90 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  onding table */.
2bba0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
2bbb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
2bbc0 65 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ex that might be
2bbd0 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61   used for covera
2bbe0 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65  ge */.){.  Walke
2bbf0 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64  r w;.  struct Id
2bc00 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d  xCover xcov;.  m
2bc10 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
2bc20 65 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e  eof(w));.  xcov.
2bc30 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78  iCur = iCur;.  x
2bc40 63 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  cov.pIdx = pIdx;
2bc50 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2bc60 63 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65  ck = exprIdxCove
2bc70 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76  r;.  w.u.pIdxCov
2bc80 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71  er = &xcov;.  sq
2bc90 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
2bca0 2c 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75  , pExpr);.  retu
2bcb0 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  rn !w.eCode;.}..
2bcc0 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2bcd0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2bce0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2bcf0 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
2bd00 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63  e walker.** to c
2bd10 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  ount references 
2bd20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  to table columns
2bd30 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
2bd40 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72  s of an .** aggr
2bd50 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  egate function, 
2bd60 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
2bd70 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c  ement the.** sql
2bd80 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73  ite3FunctionThis
2bd90 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  Src() routine..*
2bda0 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e  /.struct SrcCoun
2bdb0 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  t {.  SrcList *p
2bdc0 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61  Src;   /* One pa
2bdd0 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c  rticular FROM cl
2bde0 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64  ause in a nested
2bdf0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
2be00 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20  nThis;       /* 
2be10 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
2be20 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
2be30 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  in pSrcList */. 
2be40 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20   int nOther;    
2be50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2be60 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2be70 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52  umns in other FR
2be80 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b  OM clauses */.};
2be90 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
2bea0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2beb0 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
2bec0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2bed0 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61   exprSrcCount(Wa
2bee0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2bef0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f  xpr *pExpr){.  /
2bf00 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e  * The NEVER() on
2bf10 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d   the second term
2bf20 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69   is because sqli
2bf30 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
2bf40 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73  hisSrc().  ** is
2bf50 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62   always called b
2bf60 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70  efore sqlite3Exp
2bf70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2bf80 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a  es() and so the.
2bf90 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20    ** TK_COLUMNs 
2bfa0 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
2bfb0 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  n converted into
2bfc0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
2bfd0 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   If.  ** sqlite3
2bfe0 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
2bff0 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69  Src() is used di
2c000 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  fferently in the
2c010 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a   future, the.  *
2c020 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e  * NEVER() will n
2c030 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eed to be remove
2c040 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  d. */.  if( pExp
2c050 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2c060 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d   || NEVER(pExpr-
2c070 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
2c080 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  MN) ){.    int i
2c090 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
2c0a0 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b  Count *p = pWalk
2c0b0 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b  er->u.pSrcCount;
2c0c0 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
2c0d0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
2c0e0 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72    int nSrc = pSr
2c0f0 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a  c ? pSrc->nSrc :
2c100 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
2c110 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20   i<nSrc; i++){. 
2c120 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
2c130 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
2c140 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65  i].iCursor ) bre
2c150 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
2c160 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20  ( i<nSrc ){.    
2c170 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20    p->nThis++;.  
2c180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2c190 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20  ->nOther++;.    
2c1a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
2c1b0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2c1c0 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
2c1d0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72  if any of the ar
2c1e0 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70  guments to the p
2c1f0 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65  Expr Function re
2c200 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c  ference.** pSrcL
2c210 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ist.  Return tru
2c220 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41  e if they do.  A
2c230 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20  lso return true 
2c240 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  if the function.
2c250 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65  ** has no argume
2c260 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20  nts or has only 
2c270 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
2c280 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ts.  Return fals
2c290 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65  e if pExpr.** re
2c2a0 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73  ferences columns
2c2b0 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73   but not columns
2c2c0 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64   of tables found
2c2d0 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f   in pSrcList..*/
2c2e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63  .int sqlite3Func
2c2f0 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2c300 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63  Expr *pExpr, Src
2c310 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b  List *pSrcList){
2c320 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73  .  Walker w;.  s
2c330 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63  truct SrcCount c
2c340 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  nt;.  assert( pE
2c350 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2c360 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e  FUNCTION );.  w.
2c370 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2c380 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20  exprSrcCount;.  
2c390 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2c3a0 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72  k = 0;.  w.u.pSr
2c3b0 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20  cCount = &cnt;. 
2c3c0 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63   cnt.pSrc = pSrc
2c3d0 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69  List;.  cnt.nThi
2c3e0 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74  s = 0;.  cnt.nOt
2c3f0 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  her = 0;.  sqlit
2c400 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26  e3WalkExprList(&
2c410 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  w, pExpr->x.pLis
2c420 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74  t);.  return cnt
2c430 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e  .nThis>0 || cnt.
2c440 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  nOther==0;.}../*
2c450 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
2c460 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
2c470 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
2c480 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
2c490 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
2c4a0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
2c4b0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2c4c0 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
2c4d0 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
2c4e0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
2c4f0 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
2c500 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
2c510 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
2c520 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
2c530 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
2c540 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
2c550 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
2c560 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
2c570 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
2c580 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
2c590 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
2c5a0 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
2c5b0 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
2c5c0 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
2c5d0 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
2c5e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
2c5f0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
2c600 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
2c610 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
2c620 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2c630 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
2c640 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
2c650 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
2c660 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
2c670 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
2c680 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
2c690 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
2c6a0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
2c6b0 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
2c6c0 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
2c6d0 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
2c6e0 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
2c6f0 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
2c700 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
2c710 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
2c720 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
2c730 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
2c740 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
2c750 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
2c760 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
2c770 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
2c780 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2c790 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
2c7a0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2c7b0 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
2c7c0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
2c7d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
2c7e0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2c7f0 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
2c800 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2c810 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
2c820 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
2c830 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
2c840 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
2c850 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
2c860 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
2c870 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
2c880 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
2c890 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2c8a0 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f   = pNC->pAggInfo
2c8b0 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
2c8c0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
2c8d0 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
2c8e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
2c8f0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  LUMN: {.      te
2c900 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c910 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
2c920 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2c930 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2c940 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
2c950 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
2c960 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
2c970 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  is in one of the
2c980 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2c990 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  ROM.      ** cla
2c9a0 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
2c9b0 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
2c9c0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
2c9d0 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  SrcList!=0) ){. 
2c9e0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
2c9f0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2ca00 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
2ca10 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2ca20 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
2ca30 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
2ca40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
2ca50 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
2ca60 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
2ca70 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2ca80 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
2ca90 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
2caa0 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
2cab0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
2cac0 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
2cad0 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >iCursor ){.    
2cae0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
2caf0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
2cb00 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
2cb10 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f   pExpr refers to
2cb20 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20   a table.       
2cb30 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
2cb40 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2cb50 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
2cb60 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20  ate query.  .   
2cb70 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
2cb80 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20          ** Make 
2cb90 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
2cba0 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49   column in pAggI
2cbb0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74  nfo->aCol[] if t
2cbc0 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
2cbd0 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e   ** is not an en
2cbe0 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64  try there alread
2cbf0 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
2cc00 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
2cc10 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
2cc20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f   pCol = pAggInfo
2cc30 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
2cc40 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
2cc50 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
2cc60 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; k++, pCol++){.
2cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2cc80 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d  ( pCol->iTable==
2cc90 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
2cca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ccb0 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
2ccc0 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
2ccd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cce0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2ccf0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2cd00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cd10 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67       if( (k>=pAg
2cd20 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a  gInfo->nColumn).
2cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2cd40 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (k = addAggInfoC
2cd50 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62  olumn(pParse->db
2cd60 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20  , pAggInfo))>=0 
2cd70 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
2cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2cd90 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
2cda0 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  aCol[k];.       
2cdb0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
2cdc0 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
2cdd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2cde0 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  Col->iTable = pE
2cdf0 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
2ce00 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2ce10 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  >iColumn = pExpr
2ce20 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
2ce30 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2ce40 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
2ce50 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
2ce60 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
2ce70 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  rColumn = -1;.  
2ce80 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2ce90 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
2cea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2ceb0 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72  f( pAggInfo->pGr
2cec0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
2ced0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20           int j, 
2cee0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
2cef0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42     ExprList *pGB
2cf00 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72   = pAggInfo->pGr
2cf10 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20  oupBy;.         
2cf20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
2cf30 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
2cf40 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20  rm = pGB->a;.   
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
2cf60 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20   pGB->nExpr;.   
2cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2cf80 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20  (j=0; j<n; j++, 
2cf90 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
2cfb0 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pE = pTerm->pE
2cfc0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
2cfd0 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
2cfe0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
2cff0 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  pE->iTable==pExp
2d000 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
2d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d020 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d     pE->iColumn==
2d030 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
2d040 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2d050 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
2d060 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  terColumn = j;. 
2d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d080 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2d090 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2d0d0 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
2d0e0 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
2d0f0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2d100 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
2d110 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74   pAggInfo->nSort
2d120 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20  ingColumn++;.   
2d130 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2d140 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d150 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20         /* There 
2d160 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20  is now an entry 
2d170 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67  for pExpr in pAg
2d180 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65  gInfo->aCol[] (e
2d190 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  ither.          
2d1a0 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20    ** because it 
2d1b0 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65  was there before
2d1c0 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a   or because we j
2d1d0 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e  ust created it).
2d1e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2d1f0 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70  Convert the pExp
2d200 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47  r to be a TK_AGG
2d210 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e  _COLUMN referrin
2d220 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20  g to that.      
2d230 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66        ** pAggInf
2d240 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e  o->aCol[] entry.
2d250 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
2d260 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
2d270 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2d280 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
2d290 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2d2a0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
2d2b0 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
2d2c0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
2d2d0 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  p = TK_AGG_COLUM
2d2e0 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  N;.            p
2d2f0 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
2d300 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  6)k;.           
2d310 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2d320 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78    } /* endif pEx
2d330 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
2d340 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20  m->iCursor */.  
2d350 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c        } /* end l
2d360 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73  oop over pSrcLis
2d370 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  t */.      }.   
2d380 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2d390 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  une;.    }.    c
2d3a0 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
2d3b0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ION: {.      if(
2d3c0 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26   (pNC->ncFlags &
2d3d0 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d   NC_InAggFunc)==
2d3e0 30 0a 20 20 20 20 20 20 20 26 26 20 70 57 61 6c  0.       && pWal
2d3f0 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
2d400 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20  ==pExpr->op2.   
2d410 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2d420 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2d430 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c   pExpr is a dupl
2d440 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
2d450 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20   aggregate .    
2d460 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
2d470 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
2d480 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20  in the pAggInfo 
2d490 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20  structure.      
2d4a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72    */.        str
2d4b0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
2d4c0 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e   *pItem = pAggIn
2d4d0 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20  fo->aFunc;.     
2d4e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
2d4f0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2d500 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2d510 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2d520 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
2d530 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  , pItem->pExpr, 
2d540 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b  pExpr, -1)==0 ){
2d550 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2d560 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
2d570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d580 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
2d590 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
2d5a0 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
2d5b0 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
2d5c0 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
2d5d0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2d5e0 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
2d5f0 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
2d600 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
2d610 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
2d620 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
2d630 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
2d640 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
2d650 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20    if( i>=0 ){.  
2d660 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2d670 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2d680 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
2d690 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
2d6a0 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26         pItem = &
2d6b0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2d6c0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
2d6d0 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
2d6e0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2d6f0 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20    pItem->iMem = 
2d700 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2d710 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2d720 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2d730 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
2d740 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
2d750 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
2d760 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
2d770 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
2d780 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
2d790 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2d7a0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20  >u.zToken, .    
2d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d7c0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20  Expr->x.pList ? 
2d7d0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
2d7e0 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
2d7f0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2d800 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
2d810 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29   & EP_Distinct )
2d820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2d830 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
2d840 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2d850 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
2d860 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2d870 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
2d880 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
2d890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d8a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d8b0 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70         /* Make p
2d8c0 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68  Expr point to th
2d8d0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41  e appropriate pA
2d8e0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
2d8f0 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f  entry.        */
2d900 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d910 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2d920 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
2d930 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
2d940 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ) );.        Exp
2d950 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2d960 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
2d970 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  ce);.        pEx
2d980 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
2d990 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
2d9a0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
2d9b0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72  gInfo;.        r
2d9c0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2d9d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2d9e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2d9f0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
2da00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
2da10 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2da20 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  ue;.}.static int
2da30 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2da40 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65  esInSelect(Walke
2da50 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
2da60 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
2da70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2da80 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61  (pSelect);.  pWa
2da90 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74  lker->walkerDept
2daa0 68 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  h++;.  return WR
2dab0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74  C_Continue;.}.st
2dac0 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a  atic void analyz
2dad0 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
2dae0 65 63 74 45 6e 64 28 57 61 6c 6b 65 72 20 2a 70  ectEnd(Walker *p
2daf0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
2db00 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53  pSelect){.  UNUS
2db10 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65  ED_PARAMETER(pSe
2db20 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72  lect);.  pWalker
2db30 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 2d 2d 3b  ->walkerDepth--;
2db40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
2db50 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  e the pExpr expr
2db60 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
2db70 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
2db80 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
2db90 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
2dba0 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
2dbb0 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a  d to AggInfo obj
2dbc0 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41  ect that pNC->pA
2dbd0 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73  ggInfo.** points
2dbe0 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c   to.  Additional
2dbf0 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64   entries are mad
2dc00 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  e on the AggInfo
2dc10 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65   object as.** ne
2dc20 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
2dc30 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
2dc40 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2dc50 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
2dc60 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
2dc70 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
2dc80 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
2dc90 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69  rNames()..*/.voi
2dca0 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
2dcb0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e  lyzeAggregates(N
2dcc0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
2dcd0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2dce0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
2dcf0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61  ExprCallback = a
2dd00 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b  nalyzeAggregate;
2dd10 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2dd20 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
2dd30 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
2dd40 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2dd50 6c 62 61 63 6b 32 20 3d 20 61 6e 61 6c 79 7a 65  lback2 = analyze
2dd60 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
2dd70 63 74 45 6e 64 3b 0a 20 20 77 2e 77 61 6c 6b 65  ctEnd;.  w.walke
2dd80 72 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 77 2e  rDepth = 0;.  w.
2dd90 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61  u.pNC = pNC;.  a
2dda0 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
2ddb0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c  List!=0 );.  sql
2ddc0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
2ddd0 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
2dde0 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  * Call sqlite3Ex
2ddf0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2de00 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20  tes() for every 
2de10 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e  expression in an
2de20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
2de30 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ist.  Return the
2de40 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
2de50 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
2de60 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  rror is found, t
2de70 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63  he analysis is c
2de80 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69  ut short..*/.voi
2de90 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
2dea0 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
2deb0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
2dec0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
2ded0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2dee0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2def0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
2df00 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
2df10 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
2df20 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
2df30 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
2df40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2df50 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
2df60 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
2df70 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
2df80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
2df90 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e  ocate a single n
2dfa0 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ew register for 
2dfb0 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65  use to hold some
2dfc0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
2dfd0 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sult..*/.int sql
2dfe0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50  ite3GetTempReg(P
2dff0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
2e000 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
2e010 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  mpReg==0 ){.    
2e020 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d  return ++pParse-
2e030 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74  >nMem;.  }.  ret
2e040 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  urn pParse->aTem
2e050 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e  pReg[--pParse->n
2e060 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a  TempReg];.}../*.
2e070 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
2e080 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67  register, making
2e090 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72   available for r
2e0a0 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  euse for some ot
2e0b0 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a  her.** purpose..
2e0c0 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
2e0d0 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
2e0e0 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74   being used by t
2e0f0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c  he column cache,
2e100 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61   then.** the dea
2e110 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66  llocation is def
2e120 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
2e130 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e  column cache lin
2e140 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74  e that uses.** t
2e150 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f  he register beco
2e160 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f  mes stale..*/.vo
2e170 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
2e180 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
2e190 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
2e1a0 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
2e1b0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2e1c0 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
2e1d0 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
2e1e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2e1f0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
2e200 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
2e210 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
2e220 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d  Cache; i<pParse-
2e230 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c  >nColCache; i++,
2e240 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
2e250 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
2e260 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d  {.        p->tem
2e270 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  pReg = 1;.      
2e280 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
2e290 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
2e2a0 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
2e2b0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
2e2c0 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
2e2d0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
2e2e0 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
2e2f0 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
2e300 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
2e310 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2e320 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50  e3GetTempRange(P
2e330 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2e340 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
2e350 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  , n;.  if( nReg=
2e360 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69  =1 ) return sqli
2e370 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2e380 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50 61  arse);.  i = pPa
2e390 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a  rse->iRangeReg;.
2e3a0 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52    n = pParse->nR
2e3b0 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e  angeReg;.  if( n
2e3c0 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73  Reg<=n ){.    as
2e3d0 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c  sert( !usedAsCol
2e3e0 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
2e3f0 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20   i, i+n-1) );.  
2e400 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
2e410 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
2e420 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
2e430 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
2e440 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
2e450 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
2e460 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2e470 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
2e480 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
2e490 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2e4a0 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
2e4b0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
2e4c0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20  nt nReg){.  if( 
2e4d0 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73  nReg==1 ){.    s
2e4e0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2e4f0 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65  pReg(pParse, iRe
2e500 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  g);.    return;.
2e510 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
2e520 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
2e530 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29  rse, iReg, nReg)
2e540 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61  ;.  if( nReg>pPa
2e550 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29  rse->nRangeReg )
2e560 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  {.    pParse->nR
2e570 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a  angeReg = nReg;.
2e580 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
2e590 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  geReg = iReg;.  
2e5a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  }.}../*.** Mark 
2e5b0 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65  all temporary re
2e5c0 67 69 73 74 65 72 73 20 61 73 20 62 65 69 6e 67  gisters as being
2e5d0 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72   unavailable for
2e5e0 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20   reuse..*/.void 
2e5f0 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
2e600 52 65 67 43 61 63 68 65 28 50 61 72 73 65 20 2a  RegCache(Parse *
2e610 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73  pParse){.  pPars
2e620 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b  e->nTempReg = 0;
2e630 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  .  pParse->nRang
2e640 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  eReg = 0;.}../*.
2e650 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68 61 74  ** Validate that
2e660 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65   no temporary re
2e670 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74  gister falls wit
2e680 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66  hin the range of
2e690 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73  .** iFirst..iLas
2e6a0 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54  t, inclusive.  T
2e6b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
2e6c0 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69  nly call from wi
2e6d0 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a  thin assert().**
2e6e0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
2e6f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2e700 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e  BUG.int sqlite3N
2e710 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61  oTempsInRange(Pa
2e720 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2e730 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61   iFirst, int iLa
2e740 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
2e750 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  if( pParse->nRan
2e760 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50  geReg>0.   && pP
2e770 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b  arse->iRangeReg+
2e780 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2e790 67 20 3e 20 69 46 69 72 73 74 0a 20 20 20 26 26  g > iFirst.   &&
2e7a0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2e7b0 65 67 20 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b  eg <= iLast.  ){
2e7c0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  .     return 0;.
2e7d0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
2e7e0 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  <pParse->nTempRe
2e7f0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  g; i++){.    if(
2e800 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2e810 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20  g[i]>=iFirst && 
2e820 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2e830 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20  [i]<=iLast ){.  
2e840 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2e850 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2e860 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
2e870 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.