/ Hex Artifact Content
Login

Artifact eaf12eb8eb1dcf6358ee32bb21fd31225783a28ca42b27b1cdc497cc6c356493:


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 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
2960: 20 69 66 20 43 6f 6c 6c 53 65 71 20 69 73 20 74   if CollSeq is t
2970: 68 65 20 64 65 66 61 75 6c 74 20 62 75 69 6c 74  he default built
2980: 2d 69 6e 20 42 49 4e 41 52 59 2e 0a 2a 2f 0a 69  -in BINARY..*/.i
2990: 6e 74 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61  nt sqlite3IsBina
29a0: 72 79 28 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  ry(const CollSeq
29b0: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
29c0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
29d0: 72 49 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 73  rICmp(p->zName,s
29e0: 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 29  qlite3StrBINARY)
29f0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ==0;.}../*.** Ge
2a00: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2a10: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
2a20: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
2a30: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
2a40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2a50: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
2a60: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
2a70: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
2a80: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
2a90: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
2aa0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
2ab0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2ac0: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2ad0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
2ae0: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
2af0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
2b00: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
2b10: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
2b20: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
2b30: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
2b40: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
2b50: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
2b60: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
2b70: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
2b80: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
2b90: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
2ba0: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
2bb0: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
2bc0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
2bd0: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
2be0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
2bf0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2c00: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
2c10: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
2c20: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
2c30: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
2c40: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
2c50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c60: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
2c70: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
2c80: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca0: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
2cb0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
2cc0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2cd0: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
2ce0: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
2cf0: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2d00: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2d10: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
2d20: 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20  pr is a vector, 
2d30: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2d40: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74  se..**.** A vect
2d50: 6f 72 20 69 73 20 64 65 66 69 6e 65 64 20 61 73  or is defined as
2d60: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
2d70: 74 68 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20  that results in 
2d80: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  two or more.** c
2d90: 6f 6c 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74  olumns of result
2da0: 2e 20 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54  .  Every TK_VECT
2db0: 4f 52 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65  OR node is an ve
2dc0: 63 74 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  ctor because the
2dd0: 0a 2a 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20  .** parser will 
2de0: 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20 54  not generate a T
2df0: 4b 5f 56 45 43 54 4f 52 20 77 69 74 68 20 66 65  K_VECTOR with fe
2e00: 77 65 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74  wer than two ent
2e10: 72 69 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54  ries..** But a T
2e20: 4b 5f 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62  K_SELECT might b
2e30: 65 20 65 69 74 68 65 72 20 61 20 76 65 63 74 6f  e either a vecto
2e40: 72 20 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49  r or a scalar. I
2e50: 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e  t is only.** con
2e60: 73 69 64 65 72 65 64 20 61 20 76 65 63 74 6f 72  sidered a vector
2e70: 20 69 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f   if it has two o
2e80: 72 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f  r more result co
2e90: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lumns..*/.int sq
2ea0: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2eb0: 72 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  r(Expr *pExpr){.
2ec0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2ed0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
2ee0: 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  Expr)>1;.}../*.*
2ef0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
2f00: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
2f10: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
2f20: 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45  is of type TK_VE
2f30: 43 54 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20  CTOR .** return 
2f40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78  the number of ex
2f50: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
2f60: 20 76 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20   vector. Or, if 
2f70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
2f80: 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
2f90: 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  t, return the nu
2fa0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
2fb0: 69 6e 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  in the sub-selec
2fc0: 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74  t. For.** any ot
2fd0: 68 65 72 20 74 79 70 65 20 6f 66 20 65 78 70 72  her type of expr
2fe0: 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31  ession, return 1
2ff0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3000: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45  ExprVectorSize(E
3010: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75  xpr *pExpr){.  u
3020: 38 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70  8 op = pExpr->op
3030: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
3040: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
3050: 45 78 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28  Expr->op2;.  if(
3060: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29   op==TK_VECTOR )
3070: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  {.    return pEx
3080: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
3090: 70 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pr;.  }else if( 
30a0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
30b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70  .    return pExp
30c0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
30d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
30e0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
30f0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
3100: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
3110: 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65 73  r to a subexpres
3120: 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72 20  sion of pVector 
3130: 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74 68  that is the i-th
3140: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  .** column of th
3150: 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65 72  e vector (number
3160: 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  ed starting with
3170: 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65 72   0).  The caller
3180: 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65 20   must.** ensure 
3190: 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69 6e  that i is within
31a0: 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   range..**.** If
31b0: 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61 6c   pVector is real
31c0: 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e 64  ly a scalar (and
31d0: 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20 69   "scalar" here i
31e0: 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72 69  ncludes subqueri
31f0: 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75 72  es.** that retur
3200: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
3210: 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e 20  n!) then return 
3220: 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66 69  pVector unmodifi
3230: 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74 6f  ed..**.** pVecto
3240: 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73  r retains owners
3250: 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75 72  hip of the retur
3260: 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69 6f  ned subexpressio
3270: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
3280: 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45 4c  vector is a (SEL
3290: 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74 68  ECT ...) then th
32a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74  e expression ret
32b0: 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73 74  urned is.** just
32c0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
32d0: 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65 72  for the i-th ter
32e0: 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
32f0: 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a 20  set, and may.** 
3300: 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f 72  not be ready for
3310: 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63 61   evaluation beca
3320: 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63 75  use the table cu
3330: 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65 74  rsor has not yet
3340: 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69 6f  .** been positio
3350: 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ned..*/.Expr *sq
3360: 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
3370: 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70 56  Subexpr(Expr *pV
3380: 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a 20  ector, int i){. 
3390: 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69 74   assert( i<sqlit
33a0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
33b0: 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20 69  (pVector) );.  i
33c0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
33d0: 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29 20  Vector(pVector) 
33e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
33f0: 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 30 20 7c  Vector->op2==0 |
3400: 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  | pVector->op==T
3410: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
3420: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3430: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c 7c 20  p==TK_SELECT || 
3440: 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 54 4b  pVector->op2==TK
3450: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
3460: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
3470: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
3480: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
3490: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34a0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
34b0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
34c0: 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Expr;.    }.  }.
34d0: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
34e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
34f0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
3500: 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74 20  new Expr object 
3510: 77 68 69 63 68 20 77 68 65 6e 20 70 61 73 73 65  which when passe
3520: 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45  d to.** sqlite3E
3530: 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c 20 67  xprCode() will g
3540: 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65 63 65  enerate all nece
3550: 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20 63 6f  ssary code to co
3560: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69 46 69  mpute.** the iFi
3570: 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  eld-th column of
3580: 20 74 68 65 20 76 65 63 74 6f 72 20 65 78 70 72   the vector expr
3590: 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a  ession pVector..
35a0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66  **.** It is ok f
35b0: 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  or pVector to be
35c0: 20 61 20 73 63 61 6c 61 72 20 28 61 73 20 6c 6f   a scalar (as lo
35d0: 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d 30 29  ng as iField==0)
35e0: 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  .  .** In that c
35f0: 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
3600: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  e works like sql
3610: 69 74 65 33 45 78 70 72 44 75 70 28 29 2e 0a 2a  ite3ExprDup()..*
3620: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
3630: 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72 6e 65  owns the returne
3640: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  d Expr object an
3650: 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  d is responsible
3660: 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67   for.** ensuring
3670: 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
3680: 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74 75 61  ed value eventua
3690: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
36a0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
36b0: 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73 68   retains ownersh
36c0: 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e 20 20  ip of pVector.  
36d0: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
36e0: 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68  TK_SELECT,.** th
36f0: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  en the returned 
3700: 6f 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 66 65  object will refe
3710: 72 65 6e 63 65 20 70 56 65 63 74 6f 72 20 61 6e  rence pVector an
3720: 64 20 73 6f 20 70 56 65 63 74 6f 72 20 6d 75 73  d so pVector mus
3730: 74 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69  t remain.** vali
3740: 64 20 66 6f 72 20 74 68 65 20 6c 69 66 65 20 6f  d for the life o
3750: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f  f the returned o
3760: 62 6a 65 63 74 2e 20 20 49 66 20 70 56 65 63 74  bject.  If pVect
3770: 6f 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54 4f  or is a TK_VECTO
3780: 52 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61 72  R.** or a scalar
3790: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
37a0: 6e 20 69 74 20 63 61 6e 20 62 65 20 64 65 6c 65  n it can be dele
37b0: 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ted as soon as t
37c0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
37d0: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  eturns..**.** A 
37e0: 74 72 69 63 6b 20 74 6f 20 63 61 75 73 65 20 61  trick to cause a
37f0: 20 54 4b 5f 53 45 4c 45 43 54 20 70 56 65 63 74   TK_SELECT pVect
3800: 6f 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  or to be deleted
3810: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a   together with.*
3820: 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45  * the returned E
3830: 78 70 72 20 6f 62 6a 65 63 74 20 69 73 20 74 6f  xpr object is to
3840: 20 61 74 74 61 63 68 20 74 68 65 20 70 56 65 63   attach the pVec
3850: 74 6f 72 20 74 6f 20 74 68 65 20 70 52 69 67 68  tor to the pRigh
3860: 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68  t field.** of th
3870: 65 20 72 65 74 75 72 6e 65 64 20 54 4b 5f 53 45  e returned TK_SE
3880: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72  LECT_COLUMN Expr
3890: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72   object..*/.Expr
38a0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72   *sqlite3ExprFor
38b0: 56 65 63 74 6f 72 46 69 65 6c 64 28 0a 20 20 50  VectorField(.  P
38c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
38d0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
38e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
38f0: 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20   *pVector,      
3900: 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 2e 20   /* The vector. 
3910: 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   List of express
3920: 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d 53 45  ions or a sub-SE
3930: 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46  LECT */.  int iF
3940: 69 65 6c 64 20 20 20 20 20 20 20 20 20 20 20 2f  ield           /
3950: 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f  * Which column o
3960: 66 20 74 68 65 20 76 65 63 74 6f 72 20 74 6f 20  f the vector to 
3970: 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45  return */.){.  E
3980: 78 70 72 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  xpr *pRet;.  if(
3990: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
39a0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 61  _SELECT ){.    a
39b0: 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e  ssert( pVector->
39c0: 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
39d0: 6c 65 63 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  lect );.    /* T
39e0: 68 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  he TK_SELECT_COL
39f0: 55 4d 4e 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20  UMN Expr node:. 
3a00: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65     **.    ** pLe
3a10: 66 74 3a 20 20 20 20 20 20 20 20 20 20 20 70 56  ft:           pV
3a20: 65 63 74 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ector containing
3a30: 20 54 4b 5f 53 45 4c 45 43 54 2e 20 20 4e 6f 74   TK_SELECT.  Not
3a40: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a   deleted..    **
3a50: 20 70 52 69 67 68 74 3a 20 20 20 20 20 20 20 20   pRight:        
3a60: 20 20 6e 6f 74 20 75 73 65 64 2e 20 20 42 75 74    not used.  But
3a70: 20 72 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   recursively del
3a80: 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f  eted..    ** iCo
3a90: 6c 75 6d 6e 3a 20 20 20 20 20 20 20 20 20 49 6e  lumn:         In
3aa0: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
3ab0: 69 6e 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a  in pVector.    *
3ac0: 2a 20 69 54 61 62 6c 65 3a 20 20 20 20 20 20 20  * iTable:       
3ad0: 20 20 20 30 20 6f 72 20 74 68 65 20 6e 75 6d 62     0 or the numb
3ae0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e  er of columns on
3af0: 20 74 68 65 20 4c 48 53 20 6f 66 20 61 6e 20 61   the LHS of an a
3b00: 73 73 69 67 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a  ssignment.    **
3b10: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20   pLeft->iTable: 
3b20: 20 20 46 69 72 73 74 20 69 6e 20 61 6e 20 61 72    First in an ar
3b30: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 20  ray of register 
3b40: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c 20  holding result, 
3b50: 6f 72 20 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  or 0.    **     
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3b70: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
3b80: 74 20 79 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a  t yet computed..
3b90: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71      **.    ** sq
3ba0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3bb0: 29 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20 73  ) specifically s
3bc0: 6b 69 70 73 20 74 68 65 20 72 65 63 75 72 73 69  kips the recursi
3bd0: 76 65 20 64 65 6c 65 74 65 20 6f 66 0a 20 20 20  ve delete of.   
3be0: 20 2a 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f   ** pLeft on TK_
3bf0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f  SELECT_COLUMN no
3c00: 64 65 73 2e 20 20 42 75 74 20 70 52 69 67 68 74  des.  But pRight
3c10: 20 69 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f   is followed, so
3c20: 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20   pVector.    ** 
3c30: 63 61 6e 20 62 65 20 61 74 74 61 63 68 65 64 20  can be attached 
3c40: 74 6f 20 70 52 69 67 68 74 20 74 6f 20 63 61 75  to pRight to cau
3c50: 73 65 20 74 68 69 73 20 6e 6f 64 65 20 74 6f 20  se this node to 
3c60: 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f  take ownership o
3c70: 66 0a 20 20 20 20 2a 2a 20 70 56 65 63 74 6f 72  f.    ** pVector
3c80: 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65  .  Typically the
3c90: 72 65 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69  re will be multi
3ca0: 70 6c 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  ple TK_SELECT_CO
3cb0: 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a  LUMN nodes.    *
3cc0: 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
3cd0: 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 20 74 6f  pLeft pointer to
3ce0: 20 74 68 65 20 70 56 65 63 74 6f 72 2c 20 62 75   the pVector, bu
3cf0: 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68  t only one of th
3d00: 65 6d 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f  em.    ** will o
3d10: 77 6e 20 74 68 65 20 70 56 65 63 74 6f 72 2e 0a  wn the pVector..
3d20: 20 20 20 20 2a 2f 0a 20 20 20 20 70 52 65 74 20      */.    pRet 
3d30: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
3d40: 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54  Parse, TK_SELECT
3d50: 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a  _COLUMN, 0, 0);.
3d60: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
3d70: 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f 6c        pRet->iCol
3d80: 75 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20  umn = iField;.  
3d90: 20 20 20 20 70 52 65 74 2d 3e 70 4c 65 66 74 20      pRet->pLeft 
3da0: 3d 20 70 56 65 63 74 6f 72 3b 0a 20 20 20 20 7d  = pVector;.    }
3db0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
3dc0: 74 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54  t==0 || pRet->iT
3dd0: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  able==0 );.  }el
3de0: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 56 65 63  se{.    if( pVec
3df0: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54  tor->op==TK_VECT
3e00: 4f 52 20 29 20 70 56 65 63 74 6f 72 20 3d 20 70  OR ) pVector = p
3e10: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3e20: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
3e30: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
3e40: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
3e50: 73 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72 2c  se->db, pVector,
3e60: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
3e70: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
3e80: 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   If expression p
3e90: 45 78 70 72 20 69 73 20 6f 66 20 74 79 70 65 20  Expr is of type 
3ea0: 54 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65 72  TK_SELECT, gener
3eb0: 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
3ec0: 75 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75  uate.** it. Retu
3ed0: 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
3ee0: 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73  in which the res
3ef0: 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28 6f  ult is stored (o
3f00: 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75  r, if the .** su
3f10: 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
3f20: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
3f30: 6f 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73 74  olumn, the first
3f40: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20   in an array.** 
3f50: 6f 66 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  of registers in 
3f60: 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c 74  which the result
3f70: 20 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a   is stored)..**.
3f80: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 6e  ** If pExpr is n
3f90: 6f 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65  ot a TK_SELECT e
3fa0: 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72  xpression, retur
3fb0: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
3fc0: 6e 74 20 65 78 70 72 43 6f 64 65 53 75 62 73 65  nt exprCodeSubse
3fd0: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
3fe0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
3ff0: 7b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30 3b  {.  int reg = 0;
4000: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4010: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
4020: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
4030: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
4040: 72 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  reg = sqlite3Cod
4050: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
4060: 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b  e, pExpr, 0, 0);
4070: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
4080: 74 75 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a  turn reg;.}../*.
4090: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 65 63  ** Argument pVec
40a0: 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  tor points to a 
40b0: 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  vector expressio
40c0: 6e 20 2d 20 65 69 74 68 65 72 20 61 20 54 4b 5f  n - either a TK_
40d0: 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f  VECTOR.** or TK_
40e0: 53 45 4c 45 43 54 20 74 68 61 74 20 72 65 74 75  SELECT that retu
40f0: 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  rns more than on
4100: 65 20 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 66  e column. This f
4110: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a  unction returns.
4120: 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ** the register 
4130: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 69  number of a regi
4140: 73 74 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  ster that contai
4150: 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a  ns the value of.
4160: 2a 2a 20 65 6c 65 6d 65 6e 74 20 69 46 69 65 6c  ** element iFiel
4170: 64 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e  d of the vector.
4180: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
4190: 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54  r is a TK_SELECT
41a0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
41b0: 6e 20 63 6f 64 65 20 66 6f 72 20 69 74 20 6d 75  n code for it mu
41c0: 73 74 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72 65  st have .** alre
41d0: 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74  ady been generat
41e0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 65 78 70  ed using the exp
41f0: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 29  rCodeSubselect()
4200: 20 72 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68 69   routine. In thi
4210: 73 0a 2a 2a 20 63 61 73 65 20 70 61 72 61 6d 65  s.** case parame
4220: 74 65 72 20 72 65 67 53 65 6c 65 63 74 20 73 68  ter regSelect sh
4230: 6f 75 6c 64 20 62 65 20 74 68 65 20 66 69 72 73  ould be the firs
4240: 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
4250: 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 63 6f   registers.** co
4260: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73  ntaining the res
4270: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 75 62 2d  ults of the sub-
4280: 73 65 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49  select. .**.** I
4290: 66 20 70 56 65 63 74 6f 72 20 69 73 20 6f 66 20  f pVector is of 
42a0: 74 79 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c 20  type TK_VECTOR, 
42b0: 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 74 68  then code for th
42c0: 65 20 72 65 71 75 65 73 74 65 64 20 66 69 65 6c  e requested fiel
42d0: 64 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65  d.** is generate
42e0: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
42f0: 28 2a 70 52 65 67 46 72 65 65 29 20 6d 61 79 20  (*pRegFree) may 
4300: 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  be set to the nu
4310: 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65 6d  mber of.** a tem
4320: 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
4330: 74 6f 20 62 65 20 66 72 65 65 64 20 62 79 20 74  to be freed by t
4340: 68 65 20 63 61 6c 6c 65 72 20 62 65 66 6f 72 65  he caller before
4350: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
4360: 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
4370: 6e 67 2c 20 6f 75 74 70 75 74 20 70 61 72 61 6d  ng, output param
4380: 65 74 65 72 20 28 2a 70 70 45 78 70 72 29 20 69  eter (*ppExpr) i
4390: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
43a0: 6f 20 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f 62  o the.** Expr ob
43b0: 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
43c0: 6e 67 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69 45  ng to element iE
43d0: 6c 65 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f  lem of the vecto
43e0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
43f0: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4400: 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ter(.  Parse *pP
4410: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
4420: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
4430: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
4440: 72 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20  r *pVector,     
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4460: 56 65 63 74 6f 72 20 74 6f 20 65 78 74 72 61 63  Vector to extrac
4470: 74 20 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 2a  t element from *
4480: 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 2c 20  /.  int iField, 
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44a0: 20 20 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f 20      /* Field to 
44b0: 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70 56 65  extract from pVe
44c0: 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ctor */.  int re
44d0: 67 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  gSelect,        
44e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
44f0: 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72  st in array of r
4500: 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 45 78  egisters */.  Ex
4510: 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20  pr **ppExpr,    
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4530: 20 4f 55 54 3a 20 45 78 70 72 65 73 73 69 6f 6e   OUT: Expression
4540: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   element */.  in
4550: 74 20 2a 70 52 65 67 46 72 65 65 20 20 20 20 20  t *pRegFree     
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4570: 20 4f 55 54 3a 20 54 65 6d 70 20 72 65 67 69 73   OUT: Temp regis
4580: 74 65 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a 29  ter to free */.)
4590: 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 56 65 63  {.  u8 op = pVec
45a0: 74 6f 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65 72  tor->op;.  asser
45b0: 74 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52  t( op==TK_VECTOR
45c0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53   || op==TK_REGIS
45d0: 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53 45  TER || op==TK_SE
45e0: 4c 45 43 54 20 29 3b 0a 20 20 69 66 28 20 6f 70  LECT );.  if( op
45f0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  ==TK_REGISTER ){
4600: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 73  .    *ppExpr = s
4610: 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
4620: 64 53 75 62 65 78 70 72 28 70 56 65 63 74 6f 72  dSubexpr(pVector
4630: 2c 20 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 72  , iField);.    r
4640: 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 69  eturn pVector->i
4650: 54 61 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20 20  Table+iField;.  
4660: 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53  }.  if( op==TK_S
4670: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 2a 70 70  ELECT ){.    *pp
4680: 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e  Expr = pVector->
4690: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
46a0: 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78  t->a[iField].pEx
46b0: 70 72 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20  pr;.     return 
46c0: 72 65 67 53 65 6c 65 63 74 2b 69 46 69 65 6c 64  regSelect+iField
46d0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20  ;.  }.  *ppExpr 
46e0: 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69  = pVector->x.pLi
46f0: 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45  st->a[iField].pE
4700: 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  xpr;.  return sq
4710: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
4720: 70 28 70 50 61 72 73 65 2c 20 2a 70 70 45 78 70  p(pParse, *ppExp
4730: 72 2c 20 70 52 65 67 46 72 65 65 29 3b 0a 7d 0a  r, pRegFree);.}.
4740: 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f  ./*.** Expressio
4750: 6e 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  n pExpr is a com
4760: 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20  parison between 
4770: 74 77 6f 20 76 65 63 74 6f 72 20 76 61 6c 75 65  two vector value
4780: 73 2e 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74 68  s. Compute.** th
4790: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
47a0: 63 6f 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20 30  comparison (1, 0
47b0: 2c 20 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20 77  , or NULL) and w
47c0: 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 72 65 73  rite that.** res
47d0: 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ult into registe
47e0: 72 20 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  r dest..**.** Th
47f0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 73 61  e caller must sa
4800: 74 69 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77  tisfy the follow
4810: 69 6e 67 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e  ing precondition
4820: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20 70  s:.**.**    if p
4830: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a  Expr->op==TK_IS:
4840: 20 20 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51 20        op==TK_EQ 
4850: 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e  and p5==SQLITE_N
4860: 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20 70  ULLEQ.**    if p
4870: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
4880: 4f 54 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20  OT:   op==TK_NE 
4890: 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e  and p5==SQLITE_N
48a0: 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68 65  ULLEQ.**    othe
48b0: 72 77 69 73 65 3a 20 20 20 20 20 20 20 20 20 20  rwise:          
48c0: 20 20 20 20 20 20 6f 70 3d 3d 70 45 78 70 72 2d        op==pExpr-
48d0: 3e 6f 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f  >op and p5==0.*/
48e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
48f0: 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 0a  eVectorCompare(.
4900: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4910: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
4920: 67 65 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65 78  generator contex
4930: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
4940: 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pr,          /* 
4950: 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  The comparison o
4960: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
4970: 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
4980: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
4990: 75 6c 74 73 20 69 6e 74 6f 20 74 68 69 73 20 72  ults into this r
49a0: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20  egister */.  u8 
49b0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
49c0: 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
49d0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75   operator */.  u
49e0: 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20  8 p5            
49f0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e       /* SQLITE_N
4a00: 55 4c 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a 2f  ULLEQ or zero */
4a10: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
4a20: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
4a30: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
4a40: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 45  Expr->pLeft;.  E
4a50: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45  xpr *pRight = pE
4a60: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 69  xpr->pRight;.  i
4a70: 6e 74 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74  nt nLeft = sqlit
4a80: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
4a90: 28 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69  (pLeft);.  int i
4aa0: 3b 0a 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20  ;.  int regLeft 
4ab0: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 52 69  = 0;.  int regRi
4ac0: 67 68 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f 70  ght = 0;.  u8 op
4ad0: 78 20 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61 64  x = op;.  int ad
4ae0: 64 72 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33  drDone = sqlite3
4af0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4b00: 3b 0a 0a 20 20 69 66 28 20 6e 4c 65 66 74 21 3d  ;..  if( nLeft!=
4b10: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
4b20: 72 53 69 7a 65 28 70 52 69 67 68 74 29 20 29 7b  rSize(pRight) ){
4b30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4b40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f  rMsg(pParse, "ro
4b50: 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
4b60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
4b70: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45 78   }.  assert( pEx
4b80: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c  pr->op==TK_EQ ||
4b90: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
4ba0: 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78  E .       || pEx
4bb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c  pr->op==TK_IS ||
4bc0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
4bd0: 53 4e 4f 54 20 0a 20 20 20 20 20 20 20 7c 7c 20  SNOT .       || 
4be0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
4bf0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4c00: 4b 5f 47 54 20 0a 20 20 20 20 20 20 20 7c 7c 20  K_GT .       || 
4c10: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
4c20: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4c30: 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20 61 73 73  K_GE .  );.  ass
4c40: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
4c50: 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70  op || (pExpr->op
4c60: 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d 54  ==TK_IS && op==T
4c70: 4b 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20 20  K_EQ).          
4c80: 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d    || (pExpr->op=
4c90: 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20 6f 70 3d  =TK_ISNOT && op=
4ca0: 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20 61 73 73  =TK_NE) );.  ass
4cb0: 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45  ert( p5==0 || pE
4cc0: 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20  xpr->op!=op );. 
4cd0: 20 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51 4c   assert( p5==SQL
4ce0: 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45  ITE_NULLEQ || pE
4cf0: 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a  xpr->op==op );..
4d00: 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53    p5 |= SQLITE_S
4d10: 54 4f 52 45 50 32 3b 0a 20 20 69 66 28 20 6f 70  TOREP2;.  if( op
4d20: 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d  x==TK_LE ) opx =
4d30: 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28 20 6f 70   TK_LT;.  if( op
4d40: 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d  x==TK_GE ) opx =
4d50: 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65 67 4c 65   TK_GT;..  regLe
4d60: 66 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62  ft = exprCodeSub
4d70: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
4d80: 4c 65 66 74 29 3b 0a 20 20 72 65 67 52 69 67 68  Left);.  regRigh
4d90: 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73  t = exprCodeSubs
4da0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 52  elect(pParse, pR
4db0: 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  ight);..  for(i=
4dc0: 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65 78 69 74  0; 1 /*Loop exit
4dd0: 73 20 62 79 20 22 62 72 65 61 6b 22 2a 2f 3b 20  s by "break"*/; 
4de0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  i++){.    int re
4df0: 67 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67 46  gFree1 = 0, regF
4e00: 72 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 45 78  ree2 = 0;.    Ex
4e10: 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20 20  pr *pL, *pR; .  
4e20: 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20    int r1, r2;.  
4e30: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
4e40: 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20  & i<nLeft );.   
4e50: 20 69 66 28 20 69 3e 30 20 29 20 73 71 6c 69 74   if( i>0 ) sqlit
4e60: 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
4e70: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 31 20  pParse);.    r1 
4e80: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
4e90: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65  ster(pParse, pLe
4ea0: 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c 20  ft, i, regLeft, 
4eb0: 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29 3b  &pL, &regFree1);
4ec0: 0a 20 20 20 20 72 32 20 3d 20 65 78 70 72 56 65  .    r2 = exprVe
4ed0: 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61  ctorRegister(pPa
4ee0: 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69 2c 20  rse, pRight, i, 
4ef0: 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c 20 26  regRight, &pR, &
4f00: 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 63  regFree2);.    c
4f10: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
4f20: 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c 20  e, pL, pR, opx, 
4f30: 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 70 35  r1, r2, dest, p5
4f40: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4f50: 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
4f60: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4f70: 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65 73  =OP_Lt);.    tes
4f80: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
4f90: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4fa0: 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
4fb0: 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d     testcase(op==
4fc0: 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
4fd0: 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
4fe0: 47 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Gt);.    testcas
4ff0: 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
5000: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
5010: 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 74  p==OP_Ge);.    t
5020: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
5030: 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
5040: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
5050: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
5060: 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
5070: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
5080: 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  P_Ne);.    sqlit
5090: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
50a0: 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
50b0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  1);.    sqlite3R
50c0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
50d0: 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
50e0: 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 73  .    if( i>0 ) s
50f0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
5100: 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
5110: 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 31 20 29  if( i==nLeft-1 )
5120: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
5130: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 78     }.    if( opx
5140: 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 20  ==TK_EQ ){.     
5150: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5160: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
5170: 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b  dest, addrDone);
5180: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5190: 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d 20 53 51  ;.      p5 |= SQ
51a0: 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20  LITE_KEEPNULL;. 
51b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 78     }else if( opx
51c0: 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20 20 20 20 20  ==TK_NE ){.     
51d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
51e0: 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 64 65 73  p2(v, OP_If, des
51f0: 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56 64  t, addrDone); Vd
5200: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5210: 20 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54       p5 |= SQLIT
5220: 45 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20  E_KEEPNULL;.    
5230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
5240: 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c  ert( op==TK_LT |
5250: 7c 20 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f  | op==TK_GT || o
5260: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p==TK_LE || op==
5270: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 73  TK_GE );.      s
5280: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5290: 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71  (v, OP_ElseNotEq
52a0: 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a  , 0, addrDone);.
52b0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
52c0: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
52d0: 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
52e0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
52f0: 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64  TK_GT);.      Vd
5300: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
5310: 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20 20 20 20  op==TK_LE);.    
5320: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
5330: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a  (v, op==TK_GE);.
5340: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65        if( i==nLe
5350: 66 74 2d 32 20 29 20 6f 70 78 20 3d 20 6f 70 3b  ft-2 ) opx = op;
5360: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
5370: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
5380: 61 62 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e 65  abel(v, addrDone
5390: 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  );.}..#if SQLITE
53a0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
53b0: 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  0./*.** Check th
53c0: 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69  at argument nHei
53d0: 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ght is less than
53e0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
53f0: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72   maximum.** expr
5400: 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c  ession depth all
5410: 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  owed. If it is n
5420: 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ot, leave an err
5430: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a  or message in.**
5440: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20   pParse..*/.int 
5450: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
5460: 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50  Height(Parse *pP
5470: 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68  arse, int nHeigh
5480: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
5490: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
54a0: 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73  mxHeight = pPars
54b0: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
54c0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
54d0: 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48  DEPTH];.  if( nH
54e0: 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29  eight>mxHeight )
54f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5500: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
5510: 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f        "Expressio
5520: 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61  n tree is too la
5530: 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70  rge (maximum dep
5540: 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68  th %d)", mxHeigh
5550: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20  t.    );.    rc 
5560: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
5570: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5580: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  .}../* The follo
5590: 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74  wing three funct
55a0: 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78  ions, heightOfEx
55b0: 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78  pr(), heightOfEx
55c0: 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20  prList().** and 
55d0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29  heightOfSelect()
55e0: 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65  , are used to de
55f0: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69  termine the maxi
5600: 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66  mum height.** of
5610: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
5620: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20  tree referenced 
5630: 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  by the structure
5640: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
5650: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
5660: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
5670: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69  maximum height i
5680: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
5690: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
56a0: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
56b0: 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20  y pnHeight, the 
56c0: 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
56d0: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65  , then set *pnHe
56e0: 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  ight to that.** 
56f0: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
5700: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
5710: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
5720: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
5730: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
5740: 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69  ->nHeight>*pnHei
5750: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  ght ){.      *pn
5760: 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69  Height = p->nHei
5770: 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ght;.    }.  }.}
5780: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5790: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78  ghtOfExprList(Ex
57a0: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a  prList *p, int *
57b0: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
57c0: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
57d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
57e0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  p->nExpr; i++){.
57f0: 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78        heightOfEx
5800: 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pr(p->a[i].pExpr
5810: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5820: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5830: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c  void heightOfSel
5840: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 53 65 6c  ect(Select *pSel
5850: 65 63 74 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67  ect, int *pnHeig
5860: 68 74 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ht){.  Select *p
5870: 3b 0a 20 20 66 6f 72 28 70 3d 70 53 65 6c 65 63  ;.  for(p=pSelec
5880: 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f  t; p; p=p->pPrio
5890: 72 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  r){.    heightOf
58a0: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
58b0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
58c0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
58d0: 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74  Having, pnHeight
58e0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
58f0: 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70  xpr(p->pLimit, p
5900: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5910: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5920: 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67  ->pEList, pnHeig
5930: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5940: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  fExprList(p->pGr
5950: 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29  oupBy, pnHeight)
5960: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5970: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
5980: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
5990: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
59a0: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
59b0: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
59c0: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
59d0: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
59e0: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
59f0: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
5a00: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
5a10: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
5a20: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
5a30: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
5a40: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
5a50: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
5a60: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
5a70: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
5a80: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
5a90: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
5aa0: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a   plus one..**.**
5ab0: 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20   Also propagate 
5ac0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
5ad0: 67 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e  gs up from Expr.
5ae0: 78 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e  x.pList to Expr.
5af0: 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70  flags,.** if app
5b00: 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
5b10: 74 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74  tic void exprSet
5b20: 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b  Height(Expr *p){
5b30: 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d  .  int nHeight =
5b40: 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78   0;.  heightOfEx
5b50: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48  pr(p->pLeft, &nH
5b60: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
5b70: 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  OfExpr(p->pRight
5b80: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69  , &nHeight);.  i
5b90: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
5ba0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
5bb0: 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ct) ){.    heigh
5bc0: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70  tOfSelect(p->x.p
5bd0: 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74  Select, &nHeight
5be0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
5bf0: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
5c00: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5c10: 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  t(p->x.pList, &n
5c20: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e  Height);.    p->
5c30: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
5c40: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
5c50: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
5c60: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  x.pList);.  }.  
5c70: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
5c80: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
5c90: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
5ca0: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
5cb0: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
5cc0: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
5cd0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
5ce0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
5cf0: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
5d00: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
5d10: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
5d20: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
5d30: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   pParse..**.** A
5d40: 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c  lso propagate al
5d50: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
5d60: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
5d70: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
5d80: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
5d90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
5da0: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
5db0: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
5dc0: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
5dd0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
5de0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70   ) return;.  exp
5df0: 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20  rSetHeight(p);. 
5e00: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
5e10: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
5e20: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a  p->nHeight);.}..
5e30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5e40: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
5e50: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
5e60: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
5e70: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65  d.** by the sele
5e80: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
5e90: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
5ea0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
5eb0: 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
5ec0: 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ht(Select *p){. 
5ed0: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
5ee0: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
5ef0: 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b  ct(p, &nHeight);
5f00: 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68  .  return nHeigh
5f10: 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42  t;.}.#else /* AB
5f20: 4f 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66  OVE:  Height enf
5f30: 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64  orcement enabled
5f40: 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74  .  BELOW: Height
5f50: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66   enforcement off
5f60: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67   */./*.** Propag
5f70: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5f80: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5f90: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5fa0: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
5fb0: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
5fc0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
5fd0: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
5fe0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5ff0: 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
6000: 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78  ->x.pList && !Ex
6010: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
6020: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
6030: 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  {.    p->flags |
6040: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
6050: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6060: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
6070: 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  );.  }.}.#define
6080: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
6090: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
60a0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
60b0: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
60c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
60d0: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
60e0: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
60f0: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
6100: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
6110: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
6120: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
6130: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
6140: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
6150: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
6160: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
6170: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
6180: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
6190: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
61a0: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
61b0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
61c0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
61d0: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
61e0: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
61f0: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
6200: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
6210: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
6220: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
6230: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
6240: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
6250: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
6260: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  ting is performe
6270: 64 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  d.  The deQuote.
6280: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
6290: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
62a0: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
62b0: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
62c0: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
62d0: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
62e0: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
62f0: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
6300: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
6310: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
6320: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
6330: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
6340: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
6350: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
6360: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
6370: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
6380: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
6390: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
63a0: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
63b0: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
63c0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
63d0: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
63e0: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
63f0: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
6400: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
6410: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
6420: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
6430: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
6440: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
6450: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
6460: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
6470: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
6480: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
6490: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
64a0: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
64b0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
64c0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
64e0: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
64f0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29  3DbMallocRawNN()
6500: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6520: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6530: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  de */.  const To
6540: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20  ken *pToken,    
6550: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
6560: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
6570: 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  L */.  int dequo
6580: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
6590: 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74  * True to dequot
65a0: 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  e */.){.  Expr *
65b0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74  pNew;.  int nExt
65c0: 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  ra = 0;.  int iV
65d0: 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  alue = 0;..  ass
65e0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
65f0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
6600: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
6610: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
6620: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
6630: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
6640: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
6650: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
6660: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
6670: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  n->n+1;.      as
6680: 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20  sert( iValue>=0 
6690: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
66a0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
66b0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
66c0: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
66d0: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
66e0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e  ){.    memset(pN
66f0: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ew, 0, sizeof(Ex
6700: 70 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pr));.    pNew->
6710: 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20  op = (u8)op;.   
6720: 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31   pNew->iAgg = -1
6730: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e  ;.    if( pToken
6740: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45   ){.      if( nE
6750: 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xtra==0 ){.     
6760: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
6770: 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  = EP_IntValue|EP
6780: 5f 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 70  _Leaf;.        p
6790: 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
67a0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65  iValue;.      }e
67b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
67c0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
67d0: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
67e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
67f0: 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70  Token->z!=0 || p
6800: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20  Token->n==0 );. 
6810: 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65         if( pToke
6820: 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e  n->n ) memcpy(pN
6830: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54  ew->u.zToken, pT
6840: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
6850: 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  >n);.        pNe
6860: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b  w->u.zToken[pTok
6870: 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  en->n] = 0;.    
6880: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
6890: 26 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74  && sqlite3Isquot
68a0: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
68b0: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
68c0: 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54    if( pNew->u.zT
68d0: 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70  oken[0]=='"' ) p
68e0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
68f0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
6900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
6910: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
6920: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ken);.        }.
6930: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
6940: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
6950: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
6960: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
6970: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
6980: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
6990: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
69a0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
69b0: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
69c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
69d0: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
69e0: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
69f0: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
6a00: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
6a10: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6a20: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
6a30: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6a40: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6a50: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
6a60: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6a70: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6a80: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6a90: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
6aa0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
6ab0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
6ac0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
6ad0: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
6ae0: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
6af0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6b00: 28 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75  (zToken);.  retu
6b10: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
6b20: 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20  loc(db, op, &x, 
6b30: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  0);.}../*.** Att
6b40: 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65  ach subtrees pLe
6b50: 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f  ft and pRight to
6b60: 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70   the Expr node p
6b70: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  Root..**.** If p
6b80: 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Root==NULL that 
6b90: 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d  means that a mem
6ba0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
6bb0: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
6bc0: 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61  d..** In that ca
6bd0: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73  se, delete the s
6be0: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
6bf0: 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69  d pRight..*/.voi
6c00: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74  d sqlite3ExprAtt
6c10: 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73  achSubtrees(.  s
6c20: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78  qlite3 *db,.  Ex
6c30: 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70  pr *pRoot,.  Exp
6c40: 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72  r *pLeft,.  Expr
6c50: 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66   *pRight.){.  if
6c60: 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( pRoot==0 ){.  
6c70: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
6c80: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6c90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6ca0: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
6cb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6cc0: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
6cd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6ce0: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
6cf0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68      pRoot->pRigh
6d00: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
6d10: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
6d20: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
6d30: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a   pRight->flags;.
6d40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
6d50: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  eft ){.      pRo
6d60: 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66  ot->pLeft = pLef
6d70: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6d80: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6d90: 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66  agate & pLeft->f
6da0: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lags;.    }.    
6db0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52  exprSetHeight(pR
6dc0: 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oot);.  }.}../*.
6dd0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45  ** Allocate an E
6de0: 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a  xpr node which j
6df0: 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20  oins as many as 
6e00: 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a  two subtrees..**
6e10: 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20  .** One or both 
6e20: 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20  of the subtrees 
6e30: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65  can be NULL.  Re
6e40: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6e50: 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70  o the new.** Exp
6e60: 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20  r node.  Or, if 
6e70: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
6e80: 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d  urs, set pParse-
6e90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6ea0: 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73  d,.** free the s
6eb0: 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75  ubtrees and retu
6ec0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72  rn NULL..*/.Expr
6ed0: 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a   *sqlite3PExpr(.
6ee0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
6f00: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6f10: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
6f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
6f30: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
6f40: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6f60: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
6f70: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 20 20   Expr *pRight   
6f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
6f90: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a  t operand */.){.
6fa0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28    Expr *p;.  if(
6fb0: 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70   op==TK_AND && p
6fc0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
6fd0: 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 64  {.    /* Take ad
6fe0: 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72 74  vantage of short
6ff0: 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65 20 6f  -circuit false o
7000: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
7010: 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73  AND */.    p = s
7020: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
7030: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c  arse->db, pLeft,
7040: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
7050: 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e{.    p = sqlit
7060: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
7070: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
7080: 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 69  of(Expr));.    i
7090: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  f( p ){.      me
70a0: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
70b0: 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 20 20  f(Expr));.      
70c0: 70 2d 3e 6f 70 20 3d 20 6f 70 20 26 20 54 4b 46  p->op = op & TKF
70d0: 4c 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 20 20 70  LG_MASK;.      p
70e0: 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20  ->iAgg = -1;.   
70f0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
7100: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
7110: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20  (pParse->db, p, 
7120: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
7130: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a    }.  if( p ) {.
7140: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7150: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
7160: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
7170: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
7180: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65  }../*.** Add pSe
7190: 6c 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72  lect to the Expr
71a0: 2e 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64  .x.pSelect field
71b0: 2e 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20  .  Or, if pExpr 
71c0: 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20  is NULL (due.** 
71d0: 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  do a memory allo
71e0: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20  cation failure) 
71f0: 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
7200: 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a  pSelect object..
7210: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
7220: 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61  ExprAddSelect(Pa
7230: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
7240: 72 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74  r *pExpr, Select
7250: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66   *pSelect){.  if
7260: 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ( pExpr ){.    p
7270: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
7280: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45  = pSelect;.    E
7290: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
72a0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
72b0: 63 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b  ct|EP_Subquery);
72c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
72d0: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
72e0: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  s(pParse, pExpr)
72f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7300: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
7310: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7320: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
7330: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
7340: 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  e->db, pSelect);
7350: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  .  }.}.../*.** I
7360: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
7370: 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
7380: 72 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20  r TRUE or FALSE 
7390: 28 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a  (respectively),.
73a0: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31  ** then return 1
73b0: 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  .  If one cannot
73c0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74   determine the t
73d0: 72 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68  ruth value of th
73e0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
73f0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
7400: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
7410: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
7420: 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20  ization.  If is 
7430: 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68  OK to return 0 h
7440: 65 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74  ere even if.** t
7450: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
7460: 61 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66  ally is always f
7470: 61 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61  alse or false (a
7480: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29   false negative)
7490: 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61  ..** But it is a
74a0: 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31   bug to return 1
74b0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
74c0: 6f 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69  on might have di
74d0: 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65  fferent.** boole
74e0: 61 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66  an values in dif
74f0: 66 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61  ferent circumsta
7500: 6e 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f  nces (a false po
7510: 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e  sitive.).**.** N
7520: 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20  ote that if the 
7530: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61  expression is pa
7540: 72 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61  rt of conditiona
7550: 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20  l for a.** LEFT 
7560: 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61  JOIN, then we ca
7570: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61  nnot determine a
7580: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
7590: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
75a0: 20 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66   is it true or f
75b0: 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20  alse, so always 
75c0: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
75d0: 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61  tic int exprAlwa
75e0: 79 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b  ysTrue(Expr *p){
75f0: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
7600: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
7610: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
7620: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
7630: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
7640: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
7650: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
7660: 20 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a   return v!=0;.}.
7670: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
7680: 6c 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20  lwaysFalse(Expr 
7690: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
76a0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
76b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
76c0: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
76d0: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
76e0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
76f0: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
7700: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30  0;.  return v==0
7710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
7720: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
7730: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
7740: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
7750: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
7760: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
7770: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
7780: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
7790: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64  **.** If one sid
77a0: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
77b0: 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f  f the AND is kno
77c0: 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20  wn to be false, 
77d0: 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20  then instead.** 
77e0: 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  of returning an 
77f0: 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  AND expression, 
7800: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
7810: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
7820: 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75  n with.** a valu
7830: 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45  e of false..*/.E
7840: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
7850: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
7860: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
7870: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
7880: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
7890: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
78a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
78b0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
78c0: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
78d0: 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
78e0: 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20  aysFalse(pLeft) 
78f0: 7c 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  || exprAlwaysFal
7900: 73 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  se(pRight) ){.  
7910: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7920: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
7930: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7940: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
7950: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
7960: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
7970: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
7980: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
7990: 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  [0], 0);.  }else
79a0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
79b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
79c0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20  loc(db, TK_AND, 
79d0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
79e0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
79f0: 72 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70  rees(db, pNew, p
7a00: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
7a10: 20 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a     return pNew;.
7a20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
7a30: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
7a40: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
7a50: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
7a60: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67   multiple.** arg
7a70: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20  uments..*/.Expr 
7a80: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63  *sqlite3ExprFunc
7a90: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
7aa0: 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  se, ExprList *pL
7ab0: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
7ac0: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
7ad0: 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  w;.  sqlite3 *db
7ae0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7af0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20   assert( pToken 
7b00: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
7b10: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
7b20: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54   TK_FUNCTION, pT
7b30: 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20  oken, 1);.  if( 
7b40: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
7b50: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
7b60: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
7b70: 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79   /* Avoid memory
7b80: 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f   leak when mallo
7b90: 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72  c fails */.    r
7ba0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
7bb0: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
7bc0: 4c 69 73 74 3b 0a 20 20 45 78 70 72 53 65 74 50  List;.  ExprSetP
7bd0: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
7be0: 5f 48 61 73 46 75 6e 63 29 3b 0a 20 20 61 73 73  _HasFunc);.  ass
7bf0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
7c00: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
7c10: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73  IsSelect) );.  s
7c20: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
7c30: 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72  ghtAndFlags(pPar
7c40: 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74  se, pNew);.  ret
7c50: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
7c60: 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69  ** Assign a vari
7c70: 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61  able number to a
7c80: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
7c90: 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64  t encodes a wild
7ca0: 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f  card.** in the o
7cb0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
7cc0: 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  ement.  .**.** W
7cd0: 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74  ildcards consist
7ce0: 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
7cf0: 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  "?" are assigned
7d00: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
7d10: 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  tial.** variable
7d20: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   number..**.** W
7d30: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
7d40: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20  form "?nnn" are 
7d50: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d  assigned the num
7d60: 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d  ber "nnn".  We m
7d70: 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e  ake.** sure "nnn
7d80: 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67  " is not too big
7d90: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
7da0: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
7db0: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
7dc0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
7dd0: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
7de0: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
7df0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
7e00: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
7e10: 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61  , "@aaa", or "$a
7e20: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
7e30: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
7e40: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
7e50: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
7e60: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
7e70: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
7e80: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
7e90: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
7ea0: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
7eb0: 74 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72  t sequential var
7ec0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a  iable number is.
7ed0: 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a  ** assigned..*/.
7ee0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
7ef0: 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28  AssignVarNumber(
7f00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
7f10: 78 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20  xpr *pExpr, u32 
7f20: 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  n){.  sqlite3 *d
7f30: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7f40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
7f50: 0a 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69  .  ynVar x;..  i
7f60: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
7f70: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
7f80: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
7f90: 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
7fa0: 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45  lue|EP_Reduced|E
7fb0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a  P_TokenOnly) );.
7fc0: 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a    z = pExpr->u.z
7fd0: 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  Token;.  assert(
7fe0: 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   z!=0 );.  asser
7ff0: 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  t( z[0]!=0 );.  
8000: 61 73 73 65 72 74 28 20 6e 3d 3d 28 75 33 32 29  assert( n==(u32)
8010: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8020: 7a 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d  z) );.  if( z[1]
8030: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==0 ){.    /* Wi
8040: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
8050: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
8060: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
8070: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
8080: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f  assert( z[0]=='?
8090: 27 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79 6e  ' );.    x = (yn
80a0: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
80b0: 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Var);.  }else{. 
80c0: 20 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20 30     int doAdd = 0
80d0: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
80e0: 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  '?' ){.      /* 
80f0: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
8100: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
8110: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
8120: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
8130: 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73      ** use it as
8140: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75   the variable nu
8150: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36  mber */.      i6
8160: 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  4 i;.      int b
8170: 4f 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  Ok;.      if( n=
8180: 3d 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41  =2 ){ /*OPTIMIZA
8190: 54 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20  TION-IF-TRUE*/. 
81a0: 20 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d 2d         i = z[1]-
81b0: 27 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  '0';  /* The com
81c0: 6d 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20 66  mon case of ?N f
81d0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67 69  or a single digi
81e0: 74 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  t N */.        b
81f0: 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  Ok = 1;.      }e
8200: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b  lse{.        bOk
8210: 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f   = 0==sqlite3Ato
8220: 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e  i64(&z[1], &i, n
8230: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  -1, SQLITE_UTF8)
8240: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8250: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29  testcase( i==0 )
8260: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8270: 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( i==1 );.      
8280: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
8290: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
82a0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
82b0: 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20  MBER]-1 );.     
82c0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
82d0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
82e0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
82f0: 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20  UMBER] );.      
8300: 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c  if( bOk==0 || i<
8310: 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69  1 || i>db->aLimi
8320: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
8330: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
8340: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8350: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8360: 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d  e, "variable num
8370: 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77  ber must be betw
8380: 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c  een ?1 and ?%d",
8390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
83a0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
83b0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
83c0: 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20  MBER]);.        
83d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
83e0: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
83f0: 29 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3e  )i;.      if( x>
8400: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
8410: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
8420: 6e 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20  nVar = (int)x;. 
8430: 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31         doAdd = 1
8440: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
8450: 28 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75  ( sqlite3VListNu
8460: 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e  mToName(pParse->
8470: 70 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b  pVList, x)==0 ){
8480: 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d  .        doAdd =
8490: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
84a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
84b0: 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22  Wildcards like "
84c0: 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72  :aaa", "$aaa" or
84d0: 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20   "@aaa".  Reuse 
84e0: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
84f0: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65  e.      ** numbe
8500: 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61  r as the prior a
8510: 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65  ppearance of the
8520: 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69   same name, or i
8530: 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20  f the name.     
8540: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
8550: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
8560: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
8570: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
8580: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d      */.      x =
8590: 20 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33 56   (ynVar)sqlite3V
85a0: 4c 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50  ListNameToNum(pP
85b0: 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c  arse->pVList, z,
85c0: 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78   n);.      if( x
85d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ==0 ){.        x
85e0: 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61   = (ynVar)(++pPa
85f0: 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20  rse->nVar);.    
8600: 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20      doAdd = 1;. 
8610: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8620: 20 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20 20   if( doAdd ){.  
8630: 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69      pParse->pVLi
8640: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73  st = sqlite3VLis
8650: 74 41 64 64 28 64 62 2c 20 70 50 61 72 73 65 2d  tAdd(db, pParse-
8660: 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78  >pVList, z, n, x
8670: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
8680: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
8690: 78 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e 61  x;.  if( x>db->a
86a0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
86b0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
86c0: 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ER] ){.    sqlit
86d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
86e0: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c  e, "too many SQL
86f0: 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20   variables");.  
8700: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72  }.}../*.** Recur
8710: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e  sively delete an
8720: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
8740: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
8750: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8760: 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62  teNN(sqlite3 *db
8770: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61 73  , Expr *p){.  as
8780: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
8790: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a  /* Sanity check:
87a0: 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
87b0: 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e   IntValue is non
87c0: 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20  -negative if it 
87d0: 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65  exists */.  asse
87e0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
87f0: 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61  erty(p, EP_IntVa
8800: 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61  lue) || p->u.iVa
8810: 6c 75 65 3e 3d 30 20 29 3b 0a 23 69 66 64 65 66  lue>=0 );.#ifdef
8820: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8830: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8840: 72 74 79 28 70 2c 20 45 50 5f 4c 65 61 66 29 20  rty(p, EP_Leaf) 
8850: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
8860: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
8870: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 61 73 73 65  nly) ){.    asse
8880: 72 74 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30 20  rt( p->pLeft==0 
8890: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
88a0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
88b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
88c0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
88d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  }.#endif.  if( !
88e0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
88f0: 70 2c 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  p, (EP_TokenOnly
8900: 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20  |EP_Leaf)) ){.  
8910: 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20    /* The Expr.x 
8920: 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75  union is never u
8930: 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65 20  sed at the same 
8940: 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69  time as Expr.pRi
8950: 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ght */.    asser
8960: 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  t( p->x.pList==0
8970: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30   || p->pRight==0
8980: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
8990: 4c 65 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54  Left && p->op!=T
89a0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
89b0: 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  ) sqlite3ExprDel
89c0: 65 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65  eteNN(db, p->pLe
89d0: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ft);.    if( p->
89e0: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
89f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8a00: 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  eNN(db, p->pRigh
8a10: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
8a20: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8a30: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
8a40: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
8a50: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
8a60: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
8a70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8a80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
8a90: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
8aa0: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
8ab0: 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61  .    if( !ExprHa
8ac0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8ad0: 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20  Reduced) ){.    
8ae0: 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44    sqlite3WindowD
8af0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
8b00: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
8b10: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8b20: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
8b30: 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62 46  en) ) sqlite3DbF
8b40: 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f  ree(db, p->u.zTo
8b50: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 45 78 70  ken);.  if( !Exp
8b60: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
8b70: 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20  EP_Static) ){.  
8b80: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
8b90: 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  N(db, p);.  }.}.
8ba0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8bb0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
8bc0: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
8bd0: 69 66 28 20 70 20 29 20 73 71 6c 69 74 65 33 45  if( p ) sqlite3E
8be0: 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  xprDeleteNN(db, 
8bf0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  p);.}../*.** Ret
8c00: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8c10: 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  f bytes allocate
8c20: 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  d for the expres
8c30: 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a  sion structure .
8c40: 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ** passed as the
8c50: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
8c60: 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
8c70: 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c  one of EXPR_FULL
8c80: 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45  SIZE,.** EXPR_RE
8c90: 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50  DUCEDSIZE or EXP
8ca0: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
8cb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
8cc0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
8cd0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78  pr *p){.  if( Ex
8ce0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8cf0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
8d00: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b   return EXPR_TOK
8d10: 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66  ENONLYSIZE;.  if
8d20: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8d30: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
8d40: 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52   ) return EXPR_R
8d50: 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65  EDUCEDSIZE;.  re
8d60: 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49  turn EXPR_FULLSI
8d70: 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ZE;.}../*.** The
8d80: 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28   dupedExpr*Size(
8d90: 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20  ) routines each 
8da0: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
8db0: 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
8dc0: 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  red.** to store 
8dd0: 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70  a copy of an exp
8de0: 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65  ression or expre
8df0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65  ssion tree.  The
8e00: 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68  y differ in.** h
8e10: 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74  ow much of the t
8e20: 72 65 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e  ree is measured.
8e30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  .**.**     duped
8e40: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29  ExprStructSize()
8e50: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c       Size of onl
8e60: 79 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  y the Expr struc
8e70: 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70  ture .**     dup
8e80: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29  edExprNodeSize()
8e90: 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45         Size of E
8ea0: 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20  xpr + space for 
8eb0: 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70  token.**     dup
8ec0: 65 64 45 78 70 72 53 69 7a 65 28 29 20 20 20 20  edExprSize()    
8ed0: 20 20 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f         Expr + to
8ee0: 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f  ken + subtree co
8ef0: 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a  mponents.**.****
8f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f40: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
8f50: 65 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  e dupedExprStruc
8f60: 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e  tSize() function
8f70: 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c   returns two val
8f80: 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68  ues OR-ed togeth
8f90: 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65  er:  .** (1) the
8fa0: 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
8fb0: 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68  for a copy of th
8fc0: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
8fd0: 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32   only and .** (2
8fe0: 29 20 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61  ) the EP_xxx fla
8ff0: 67 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  gs that indicate
9000: 20 77 68 61 74 20 74 68 65 20 73 74 72 75 63 74   what the struct
9010: 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20  ure size should 
9020: 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  be..** The retur
9030: 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61  n values is alwa
9040: 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  ys one of:.**.**
9050: 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53        EXPR_FULLS
9060: 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  IZE.**      EXPR
9070: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c  _REDUCEDSIZE   |
9080: 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20   EP_Reduced.**  
9090: 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e      EXPR_TOKENON
90a0: 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65  LYSIZE | EP_Toke
90b0: 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nOnly.**.** The 
90c0: 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75  size of the stru
90d0: 63 74 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75  cture can be fou
90e0: 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68  nd by masking th
90f0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
9100: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
9110: 65 20 77 69 74 68 20 30 78 66 66 66 2e 20 20 54  e with 0xfff.  T
9120: 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20  he flags can be 
9130: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
9140: 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   the.** return v
9150: 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52 65 64  alue with EP_Red
9160: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9170: 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  y..**.** Note th
9180: 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45  at with flags==E
9190: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74  XPRDUP_REDUCE, t
91a0: 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72  his routines wor
91b0: 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a  ks on full-size.
91c0: 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29 20 45  ** (unreduced) E
91d0: 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74  xpr objects as t
91e0: 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c  hey or originall
91f0: 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  y constructed by
9200: 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20   the parser..** 
9210: 44 75 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f  During expressio
9220: 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72  n analysis, extr
9230: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  a information is
9240: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f   computed and mo
9250: 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65  ved into.** late
9260: 72 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 45  r parts of the E
9270: 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  xpr object and t
9280: 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  hat extra inform
9290: 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20  ation might get 
92a0: 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69  chopped.** off i
92b0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
92c0: 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f   is reduced.  No
92d0: 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20  te also that it 
92e0: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f  does not work to
92f0: 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52  .** make an EXPR
9300: 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20  DUP_REDUCE copy 
9310: 6f 66 20 61 20 72 65 64 75 63 65 64 20 65 78 70  of a reduced exp
9320: 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20  ression.  It is 
9330: 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f  only legal.** to
9340: 20 72 65 64 75 63 65 20 61 20 70 72 69 73 74 69   reduce a pristi
9350: 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ne expression tr
9360: 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73  ee from the pars
9370: 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65  er.  The impleme
9380: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75  ntation.** of du
9390: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
93a0: 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74  e() contain mult
93b0: 69 70 6c 65 20 61 73 73 65 72 74 28 29 20 73 74  iple assert() st
93c0: 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74  atements that at
93d0: 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f  tempt.** to enfo
93e0: 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61  rce this constra
93f0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
9400: 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72 75  nt dupedExprStru
9410: 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  ctSize(Expr *p, 
9420: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
9430: 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  t nSize;.  asser
9440: 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  t( flags==EXPRDU
9450: 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67  P_REDUCE || flag
9460: 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20  s==0 ); /* Only 
9470: 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61  one flag value a
9480: 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65  llowed */.  asse
9490: 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  rt( EXPR_FULLSIZ
94a0: 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73  E<=0xfff );.  as
94b0: 73 65 72 74 28 20 28 30 78 66 66 66 20 26 20 28  sert( (0xfff & (
94c0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
94d0: 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a  kenOnly))==0 );.
94e0: 20 20 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c    if( 0==flags |
94f0: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  | p->op==TK_SELE
9500: 43 54 5f 43 4f 4c 55 4d 4e 20 0a 23 69 66 6e 64  CT_COLUMN .#ifnd
9510: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
9520: 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 7c 7c 20  INDOWFUNC.   || 
9530: 70 2d 3e 70 57 69 6e 20 0a 23 65 6e 64 69 66 0a  p->pWin .#endif.
9540: 20 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d    ){.    nSize =
9550: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
9560: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
9570: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
9580: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
9590: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
95a0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
95b0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
95c0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
95d0: 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74  ) ); .    assert
95e0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
95f0: 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65  ty(p, EP_MemToke
9600: 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
9610: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9620: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
9630: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  e) );.    if( p-
9640: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70  >pLeft || p->x.p
9650: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
9660: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
9670: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
9680: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
9690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
96a0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
96b0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
96c0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
96d0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20   EP_TokenOnly;. 
96e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
96f0: 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nSize;.}../*.*
9700: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9710: 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63  returns the spac
9720: 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69  e in bytes requi
9730: 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  red to store the
9740: 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65   copy .** of the
9750: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
9760: 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  and a copy of th
9770: 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  e Expr.u.zToken 
9780: 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a  string (if that.
9790: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66  ** string is def
97a0: 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ined.).*/.static
97b0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f   int dupedExprNo
97c0: 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  deSize(Expr *p, 
97d0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
97e0: 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45  t nByte = dupedE
97f0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
9800: 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b   flags) & 0xfff;
9810: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
9820: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
9830: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
9840: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42  zToken ){.    nB
9850: 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
9860: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
9870: 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74  en)+1;.  }.  ret
9880: 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  urn ROUND8(nByte
9890: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
98a0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
98b0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
98c0: 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c  to create a dupl
98d0: 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a  icate of the .**
98e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
98f0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
9900: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65  argument. The se
9910: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
9920: 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61   a.** mask conta
9930: 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58  ining EXPRDUP_XX
9940: 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  X flags..**.** T
9950: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
9960: 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65  d includes space
9970: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70   to create a cop
9980: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
9990: 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61  ruct.** itself a
99a0: 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65  nd the buffer re
99b0: 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70  ferred to by Exp
99c0: 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61  r.u.zToken, if a
99d0: 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ny..**.** If the
99e0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
99f0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
9a00: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
9a10: 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20  ue includes .** 
9a20: 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61  space to duplica
9a30: 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65  te all Expr node
9a40: 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f  s in the tree fo
9a50: 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65  rmed by Expr.pLe
9a60: 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e  ft .** and Expr.
9a70: 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73  pRight variables
9a80: 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e   (but not for an
9a90: 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69  y structures poi
9aa0: 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64  nted to or .** d
9ab0: 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68  escended from th
9ac0: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f  e Expr.x.pList o
9ad0: 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  r Expr.x.pSelect
9ae0: 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a   variables)..*/.
9af0: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
9b00: 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ExprSize(Expr *p
9b10: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
9b20: 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  int nByte = 0;. 
9b30: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42   if( p ){.    nB
9b40: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e  yte = dupedExprN
9b50: 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  odeSize(p, flags
9b60: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
9b70: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  &EXPRDUP_REDUCE 
9b80: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
9b90: 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  = dupedExprSize(
9ba0: 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29  p->pLeft, flags)
9bb0: 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65   + dupedExprSize
9bc0: 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67  (p->pRight, flag
9bd0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  s);.    }.  }.  
9be0: 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a  return nByte;.}.
9bf0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
9c00: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
9c10: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  to sqlite3ExprDu
9c20: 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  p(), except that
9c30: 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a   if pzBuffer .**
9c40: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
9c50: 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61  n *pzBuffer is a
9c60: 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20  ssumed to point 
9c70: 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67  to a buffer larg
9c80: 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20  e enough .** to 
9c90: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  store the copy o
9ca0: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20  f expression p, 
9cb0: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d  the copies of p-
9cc0: 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66  >u.zToken.** (if
9cd0: 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e   applicable), an
9ce0: 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  d the copies of 
9cf0: 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64  the p->pLeft and
9d00: 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65   p->pRight expre
9d10: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e  ssions,.** if an
9d20: 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  y. Before return
9d30: 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69  ing, *pzBuffer i
9d40: 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  s set to the fir
9d50: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
9d60: 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  .** portion of t
9d70: 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64  he buffer copied
9d80: 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75   into by this fu
9d90: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
9da0: 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28  c Expr *exprDup(
9db0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
9dc0: 72 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61  r *p, int dupFla
9dd0: 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65  gs, u8 **pzBuffe
9de0: 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  r){.  Expr *pNew
9df0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
9e00: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
9e10: 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20  /.  u8 *zAlloc; 
9e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
9e30: 6f 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77  ory space from w
9e40: 68 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78  hich to build Ex
9e50: 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  pr object */.  u
9e60: 33 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20  32 staticFlag;  
9e70: 20 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69       /* EP_Stati
9e80: 63 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f  c if space not o
9e90: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
9ea0: 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  loc */..  assert
9eb0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
9ec0: 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65  ert( p );.  asse
9ed0: 72 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20  rt( dupFlags==0 
9ee0: 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50  || dupFlags==EXP
9ef0: 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20  RDUP_REDUCE );. 
9f00: 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65   assert( pzBuffe
9f10: 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73  r==0 || dupFlags
9f20: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
9f30: 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   );..  /* Figure
9f40: 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72   out where to wr
9f50: 69 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72  ite the new Expr
9f60: 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
9f70: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
9f80: 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70  .    zAlloc = *p
9f90: 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61  zBuffer;.    sta
9fa0: 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61  ticFlag = EP_Sta
9fb0: 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tic;.  }else{.  
9fc0: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
9fd0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
9fe0: 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a  db, dupedExprSiz
9ff0: 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b  e(p, dupFlags));
a000: 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20  .    staticFlag 
a010: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20  = 0;.  }.  pNew 
a020: 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63  = (Expr *)zAlloc
a030: 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  ;..  if( pNew ){
a040: 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77  .    /* Set nNew
a050: 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
a060: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
a070: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
a080: 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  nted to.    ** b
a090: 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20  y pNew. This is 
a0a0: 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c  either EXPR_FULL
a0b0: 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43  SIZE, EXPR_REDUC
a0c0: 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a  EDSIZE or.    **
a0d0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
a0e0: 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73  IZE. nToken is s
a0f0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
a100: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
a110: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
a120: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e   copy of the p->
a130: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
a140: 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
a150: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
a160: 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20  ned nStructSize 
a170: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
a180: 74 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67  tSize(p, dupFlag
a190: 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  s);.    const in
a1a0: 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74  t nNewSize = nSt
a1b0: 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66  ructSize & 0xfff
a1c0: 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e  ;.    int nToken
a1d0: 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48  ;.    if( !ExprH
a1e0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
a1f0: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
a200: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
a210: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69     nToken = sqli
a220: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
a230: 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20  .zToken) + 1;.  
a240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
a250: 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  Token = 0;.    }
a260: 0a 20 20 20 20 69 66 28 20 64 75 70 46 6c 61 67  .    if( dupFlag
a270: 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  s ){.      asser
a280: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
a290: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
a2a0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65  )==0 );.      me
a2b0: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
a2c0: 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d  nNewSize);.    }
a2d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
a2e0: 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70  nSize = (u32)exp
a2f0: 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a  rStructSize(p);.
a300: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
a310: 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a  loc, p, nSize);.
a320: 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c        if( nSize<
a330: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b  EXPR_FULLSIZE ){
a340: 20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74   .        memset
a350: 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c  (&zAlloc[nSize],
a360: 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   0, EXPR_FULLSIZ
a370: 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  E-nSize);.      
a380: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a390: 53 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63  Set the EP_Reduc
a3a0: 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ed, EP_TokenOnly
a3b0: 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20  , and EP_Static 
a3c0: 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74  flags appropriat
a3d0: 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77  ely. */.    pNew
a3e0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f  ->flags &= ~(EP_
a3f0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a400: 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45  Only|EP_Static|E
a410: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20  P_MemToken);.   
a420: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
a430: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45  nStructSize & (E
a440: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
a450: 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65  enOnly);.    pNe
a460: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74  w->flags |= stat
a470: 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20  icFlag;..    /* 
a480: 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54  Copy the p->u.zT
a490: 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20  oken string, if 
a4a0: 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
a4b0: 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  nToken ){.      
a4c0: 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70  char *zToken = p
a4d0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
a4e0: 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e  (char*)&zAlloc[n
a4f0: 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20  NewSize];.      
a500: 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70  memcpy(zToken, p
a510: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ->u.zToken, nTok
a520: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  en);.    }..    
a530: 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67  if( 0==((p->flag
a540: 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26  s|pNew->flags) &
a550: 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45   (EP_TokenOnly|E
a560: 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20  P_Leaf)) ){.    
a570: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
a580: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
a590: 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73   or pNew->x.pLis
a5a0: 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  t member. */.   
a5b0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
a5c0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
a5d0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
a5e0: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65     pNew->x.pSele
a5f0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
a600: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  ctDup(db, p->x.p
a610: 53 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73  Select, dupFlags
a620: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a630: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
a640: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
a650: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
a660: 2d 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c  ->x.pList, dupFl
a670: 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ags);.      }.  
a680: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c    }..    /* Fill
a690: 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20   in pNew->pLeft 
a6a0: 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  and pNew->pRight
a6b0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70  . */.    if( Exp
a6c0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
a6d0: 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  w, EP_Reduced|EP
a6e0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
a6f0: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64       zAlloc += d
a700: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
a710: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  (p, dupFlags);. 
a720: 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
a730: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
a740: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a750: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20  Leaf) ){.       
a760: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
a770: 2d 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20  ->pLeft ?.      
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
a7a0: 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45  Left, EXPRDUP_RE
a7b0: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a  DUCE, &zAlloc) :
a7c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
a7d0: 2d 3e 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52  ->pRight = p->pR
a7e0: 69 67 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20  ight ?.         
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
a800: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69  prDup(db, p->pRi
a810: 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  ght, EXPRDUP_RED
a820: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20  UCE, &zAlloc) : 
a830: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
a840: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
a850: 0a 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66  .        *pzBuff
a860: 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20  er = zAlloc;.   
a870: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
a880: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a890: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
a8a0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
a8b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
a8c0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
a8d0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
a8e0: 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a  pNew->pWin = 0;.
a8f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a900: 20 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e 20       pNew->pWin 
a910: 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44  = sqlite3WindowD
a920: 75 70 28 64 62 2c 20 70 4e 65 77 2c 20 70 2d 3e  up(db, pNew, p->
a930: 70 57 69 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 23  pWin);.      }.#
a940: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a950: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20  OMIT_WINDOWFUNC 
a960: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  */.      if( !Ex
a970: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
a980: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
a990: 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20  _Leaf) ){.      
a9a0: 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d    if( pNew->op==
a9b0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
a9c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
a9d0: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70  ew->pLeft = p->p
a9e0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
a9f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c 75  assert( p->iColu
aa00: 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  mn==0 || p->pRig
aa10: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
aa20: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
aa30: 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70  ight==0  || p->p
aa40: 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74 20  Right==p->pLeft 
aa50: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
aa60: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
aa70: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
aa80: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
aa90: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
aaa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
aab0: 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  w->pRight = sqli
aac0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
aad0: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
aae0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
aaf0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
ab00: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
ab10: 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65 70  nd return a deep
ab20: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a   copy of the obj
ab30: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
ab40: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67  e second .** arg
ab50: 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d  ument. If an OOM
ab60: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e   condition is en
ab70: 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20  countered, NULL 
ab80: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
ab90: 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  nd the db->mallo
aba0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  cFailed flag set
abb0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
abc0: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61  ITE_OMIT_CTE.sta
abd0: 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44 75  tic With *withDu
abe0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  p(sqlite3 *db, W
abf0: 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20  ith *p){.  With 
ac00: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
ac10: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42   p ){.    int nB
ac20: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
ac30: 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   + sizeof(p->a[0
ac40: 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29  ]) * (p->nCte-1)
ac50: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
ac60: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
ac70: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
ac80: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
ac90: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
aca0: 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e  pRet->nCte = p->
acb0: 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  nCte;.      for(
acc0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20  i=0; i<p->nCte; 
acd0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 52  i++){.        pR
ace0: 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  et->a[i].pSelect
acf0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
ad00: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
ad10: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
ad20: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
ad30: 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 45  pCols = sqlite3E
ad40: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
ad50: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29  ->a[i].pCols, 0)
ad60: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
ad70: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
ad80: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
ad90: 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b   p->a[i].zName);
ada0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
adb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
adc0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
add0: 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29 20  ne withDup(x,y) 
ade0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
adf0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
ae00: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
ae10: 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73  make deep copies
ae20: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   of expressions,
ae30: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
ae40: 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20  ists, ID lists, 
ae50: 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  and select state
ae60: 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69  ments.  The copi
ae70: 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c  es can.** be del
ae80: 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70  eted (by being p
ae90: 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72  assed to their r
aea0: 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c  espective ...Del
aeb0: 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a  ete() routines).
aec0: 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ** without effec
aed0: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
aee0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  ls..**.** The ex
aef0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49  pression list, I
af00: 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69  D, and source li
af10: 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71  sts return by sq
af20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
af30: 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64  (),.** sqlite3Id
af40: 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73  ListDup(), and s
af50: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
af60: 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75  () can not be fu
af70: 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a  rther expanded .
af80: 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ** by subsequent
af90: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
afa0: 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f  *ListAppend() ro
afb0: 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  utines..**.** An
afc0: 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68  y tables that th
afd0: 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  e SrcList might 
afe0: 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74  point to are not
aff0: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a   duplicated..**.
b000: 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 72  ** The flags par
b010: 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  ameter contains 
b020: 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
b030: 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58 58   the EXPRDUP_XXX
b040: 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68   flags..** If th
b050: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
b060: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
b070: 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  en the structure
b080: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a   returned is a.*
b090: 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72 73  * truncated vers
b0a0: 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ion of the usual
b0b0: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
b0c0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f  that will be sto
b0d0: 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  red as.** part o
b0e0: 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
b0f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
b100: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
b110: 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a  chema..*/.Expr *
b120: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73  sqlite3ExprDup(s
b130: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
b140: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
b150: 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
b160: 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 45 58  ==0 || flags==EX
b170: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a  PRDUP_REDUCE );.
b180: 20 20 72 65 74 75 72 6e 20 70 20 3f 20 65 78 70    return p ? exp
b190: 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67  rDup(db, p, flag
b1a0: 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a 45 78 70  s, 0) : 0;.}.Exp
b1b0: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
b1c0: 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  prListDup(sqlite
b1d0: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
b1e0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
b1f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
b200: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
b210: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
b220: 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e   *pOldItem;.  in
b230: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 50 72  t i;.  Expr *pPr
b240: 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20 30  iorSelectCol = 0
b250: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
b260: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
b270: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
b280: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
b290: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 71  llocRawNN(db, sq
b2a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
b2b0: 65 28 64 62 2c 20 70 29 29 3b 0a 20 20 69 66 28  e(db, p));.  if(
b2c0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
b2d0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78  n 0;.  pNew->nEx
b2e0: 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20  pr = p->nExpr;. 
b2f0: 20 70 49 74 65 6d 20 3d 20 70 4e 65 77 2d 3e 61   pItem = pNew->a
b300: 3b 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70  ;.  pOldItem = p
b310: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ->a;.  for(i=0; 
b320: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  i<p->nExpr; i++,
b330: 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74   pItem++, pOldIt
b340: 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
b350: 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  *pOldExpr = pOld
b360: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
b370: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
b380: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
b390: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
b3a0: 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c  up(db, pOldExpr,
b3b0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
b3c0: 20 70 4f 6c 64 45 78 70 72 20 0a 20 20 20 20 20   pOldExpr .     
b3d0: 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d  && pOldExpr->op=
b3e0: 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d  =TK_SELECT_COLUM
b3f0: 4e 0a 20 20 20 20 20 26 26 20 28 70 4e 65 77 45  N.     && (pNewE
b400: 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
b410: 70 72 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  pr)!=0 .    ){. 
b420: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
b430: 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  wExpr->iColumn==
b440: 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20 20 20 20  0 || i>0 );.    
b450: 20 20 69 66 28 20 70 4e 65 77 45 78 70 72 2d 3e    if( pNewExpr->
b460: 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20  iColumn==0 ){.  
b470: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
b480: 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 70  ldExpr->pLeft==p
b490: 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67 68 74 20  OldExpr->pRight 
b4a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f  );.        pPrio
b4b0: 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20 70 4e 65  rSelectCol = pNe
b4c0: 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70  wExpr->pLeft = p
b4d0: 4e 65 77 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  NewExpr->pRight;
b4e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b4f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e        assert( i>
b500: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
b510: 65 72 74 28 20 70 49 74 65 6d 5b 2d 31 5d 2e 70  ert( pItem[-1].p
b520: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
b530: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45     assert( pNewE
b540: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
b550: 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 69  tem[-1].pExpr->i
b560: 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20 20 20  Column+1 );.    
b570: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
b580: 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d 70 49 74  orSelectCol==pIt
b590: 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 70 4c  em[-1].pExpr->pL
b5a0: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  eft );.        p
b5b0: 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  NewExpr->pLeft =
b5c0: 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c   pPriorSelectCol
b5d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b5e0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
b5f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b600: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
b610: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  >zName);.    pIt
b620: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
b630: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b640: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  pOldItem->zSpan)
b650: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72  ;.    pItem->sor
b660: 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65  tOrder = pOldIte
b670: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
b680: 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20    pItem->done = 
b690: 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53  0;.    pItem->bS
b6a0: 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49  panIsTab = pOldI
b6b0: 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b  tem->bSpanIsTab;
b6c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f 72  .    pItem->bSor
b6d0: 74 65 72 52 65 66 20 3d 20 70 4f 6c 64 49 74 65  terRef = pOldIte
b6e0: 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 3b 0a 20  m->bSorterRef;. 
b6f0: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
b700: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
b710: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
b720: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
b730: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
b740: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
b750: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
b760: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
b770: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
b780: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
b790: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
b7a0: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
b7b0: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
b7c0: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
b7d0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
b7e0: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
b7f0: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
b800: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
b810: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
b820: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
b830: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b840: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
b850: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
b860: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b870: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
b880: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
b890: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
b8a0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
b8b0: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
b8c0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
b8d0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73  int nByte;.  ass
b8e0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
b8f0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
b900: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
b910: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
b920: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
b930: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
b940: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
b950: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
b960: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e  allocRawNN(db, n
b970: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
b980: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
b990: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
b9a0: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
b9b0: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
b9c0: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
b9d0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
b9e0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
b9f0: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
ba00: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
ba10: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
ba20: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
ba30: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
ba40: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
ba50: 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c  m->pSchema = pOl
ba60: 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a  dItem->pSchema;.
ba70: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44      pNewItem->zD
ba80: 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
ba90: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
baa0: 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ldItem->zDatabas
bab0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
bac0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
bad0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
bae0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
baf0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41      pNewItem->zA
bb00: 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62  lias = sqlite3Db
bb10: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
bb20: 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
bb30: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d    pNewItem->fg =
bb40: 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20   pOldItem->fg;. 
bb50: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75     pNewItem->iCu
bb60: 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rsor = pOldItem-
bb70: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e  >iCursor;.    pN
bb80: 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ewItem->addrFill
bb90: 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Sub = pOldItem->
bba0: 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20  addrFillSub;.   
bbb0: 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65   pNewItem->regRe
bbc0: 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  turn = pOldItem-
bbd0: 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
bbe0: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
bbf0: 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a  .isIndexedBy ){.
bc00: 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e        pNewItem->
bc10: 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  u1.zIndexedBy = 
bc20: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
bc30: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31  db, pOldItem->u1
bc40: 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20  .zIndexedBy);.  
bc50: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
bc60: 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c  ->pIBIndex = pOl
bc70: 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b  dItem->pIBIndex;
bc80: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65  .    if( pNewIte
bc90: 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
bca0: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65  ){.      pNewIte
bcb0: 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d  m->u1.pFuncArg =
bcc0: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
bcd0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
bce0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e  b, pOldItem->u1.
bcf0: 70 46 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29  pFuncArg, flags)
bd00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
bd10: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
bd20: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
bd30: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
bd40: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
bd50: 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  nTabRef++;.    }
bd60: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
bd70: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
bd80: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f  SelectDup(db, pO
bd90: 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  ldItem->pSelect,
bda0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
bdb0: 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c  wItem->pOn = sql
bdc0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
bdd0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66  pOldItem->pOn, f
bde0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
bdf0: 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71  tem->pUsing = sq
be00: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64  lite3IdListDup(d
be10: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73  b, pOldItem->pUs
be20: 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ing);.    pNewIt
be30: 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f  em->colUsed = pO
be40: 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  ldItem->colUsed;
be50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
be60: 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71  ew;.}.IdList *sq
be70: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73  lite3IdListDup(s
be80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
be90: 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74  st *p){.  IdList
bea0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
beb0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
bec0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
bed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
bee0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
bef0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
bf00: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
bf10: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
bf20: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
bf30: 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20  nId = p->nId;.  
bf40: 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65  pNew->a = sqlite
bf50: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
bf60: 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66  b, p->nId*sizeof
bf70: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
bf80: 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b  f( pNew->a==0 ){
bf90: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
bfa0: 65 65 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b 0a  eeNN(db, pNew);.
bfb0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bfc0: 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  }.  /* Note that
bfd0: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a   because the siz
bfe0: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
bff0: 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69  ion for p->a[] i
c000: 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73  s not.  ** neces
c010: 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f  sarily a power o
c020: 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64  f two, sqlite3Id
c030: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79  ListAppend() may
c040: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20   not be called. 
c050: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69   ** on the dupli
c060: 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20  cate created by 
c070: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  this function. *
c080: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
c090: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
c0a0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
c0b0: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
c0c0: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
c0d0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
c0e0: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
c0f0: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
c100: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
c110: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
c120: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
c130: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
c140: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
c150: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
c160: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
c170: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
c180: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
c190: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 44 75 70  db, Select *pDup
c1a0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
c1b0: 53 65 6c 65 63 74 20 2a 70 52 65 74 20 3d 20 30  Select *pRet = 0
c1c0: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78  ;.  Select *pNex
c1d0: 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20  t = 0;.  Select 
c1e0: 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 20 20  **pp = &pRet;.  
c1f0: 53 65 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61 73  Select *p;..  as
c200: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
c210: 20 66 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b 20   for(p=pDup; p; 
c220: 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  p=p->pPrior){.  
c230: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d    Select *pNew =
c240: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c250: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
c260: 28 2a 70 29 20 29 3b 0a 20 20 20 20 69 66 28 20  (*p) );.    if( 
c270: 70 4e 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b  pNew==0 ) break;
c280: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  .    pNew->pELis
c290: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
c2a0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
c2b0: 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  List, flags);.  
c2c0: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
c2d0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
c2e0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c  (db, p->pSrc, fl
c2f0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c300: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
c310: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
c320: 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Where, flags);. 
c330: 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42     pNew->pGroupB
c340: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
c350: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47  istDup(db, p->pG
c360: 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a  roupBy, flags);.
c370: 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e      pNew->pHavin
c380: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
c390: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
c3a0: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  g, flags);.    p
c3b0: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
c3c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
c3d0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  up(db, p->pOrder
c3e0: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  By, flags);.    
c3f0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
c400: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78  ;.    pNew->pNex
c410: 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 70  t = pNext;.    p
c420: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b  New->pPrior = 0;
c430: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  .    pNew->pLimi
c440: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
c450: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  up(db, p->pLimit
c460: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c470: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->iLimit = 0;.
c480: 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65      pNew->iOffse
c490: 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  t = 0;.    pNew-
c4a0: 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73  >selFlags = p->s
c4b0: 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73  elFlags & ~SF_Us
c4c0: 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
c4d0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
c4e0: 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[0] = -1;.   
c4f0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
c500: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[1] = -1;.   
c510: 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f   pNew->nSelectRo
c520: 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w = p->nSelectRo
c530: 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69  w;.    pNew->pWi
c540: 74 68 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c  th = withDup(db,
c550: 20 70 2d 3e 70 57 69 74 68 29 3b 0a 23 69 66 6e   p->pWith);.#ifn
c560: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c570: 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 70  WINDOWFUNC.    p
c580: 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a 20  New->pWin = 0;. 
c590: 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66     pNew->pWinDef
c5a0: 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  n = sqlite3Windo
c5b0: 77 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  wListDup(db, p->
c5c0: 70 57 69 6e 44 65 66 6e 29 3b 0a 23 65 6e 64 69  pWinDefn);.#endi
c5d0: 66 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 49  f.    pNew->selI
c5e0: 64 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a 20 20  d = p->selId;.  
c5f0: 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20    *pp = pNew;.  
c600: 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50    pp = &pNew->pP
c610: 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20  rior;.    pNext 
c620: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72  = pNew;.  }..  r
c630: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
c640: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
c650: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
c660: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
c670: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
c680: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
c690: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
c6a0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
c6b0: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
c6c0: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
c6d0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
c6e0: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
c6f0: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
c700: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
c710: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
c720: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   list..**.** The
c730: 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20   pList argument 
c740: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
c750: 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  ULL or a pointer
c760: 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a   to an ExprList.
c770: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
c780: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
c790: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c7a0: 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20  Append().  This 
c7b0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e  routine.** may n
c7c0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
c7d0: 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61  an ExprList obta
c7e0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
c7f0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a  3ExprListDup()..
c800: 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73  ** Reason:  This
c810: 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
c820: 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
c830: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69   of slots in pLi
c840: 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20  st->a[].** is a 
c850: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54  power of two.  T
c860: 68 61 74 20 69 73 20 74 72 75 65 20 66 6f 72 20  hat is true for 
c870: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
c880: 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a  ppend() returns.
c890: 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65  ** but is not ne
c8a0: 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 66  cessarily true f
c8b0: 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76  rom the return v
c8c0: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45  alue of sqlite3E
c8d0: 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a  xprListDup()..**
c8e0: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
c8f0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
c900: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74   occurs, the ent
c910: 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65  ire list is free
c920: 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73  d and.** NULL is
c930: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e   returned.  If n
c940: 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  on-NULL is retur
c950: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
c960: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68  guaranteed.** th
c970: 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  at the new entry
c980: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
c990: 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45  y appended..*/.E
c9a0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
c9b0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a  ExprListAppend(.
c9c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c9d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
c9e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c9f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
ca00: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
ca10: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
ca20: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
ca30: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
ca40: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
ca50: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
ca60: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
ca70: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
ca80: 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
ca90: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
caa0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
cab0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
cac0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
cad0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
cae0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
caf0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
cb00: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  wNN(db, sizeof(E
cb10: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
cb20: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
cb30: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
cb40: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
cb50: 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20  st->nExpr = 0;. 
cb60: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73   }else if( (pLis
cb70: 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73  t->nExpr & (pLis
cb80: 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20  t->nExpr-1))==0 
cb90: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
cba0: 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20  *pNew;.    pNew 
cbb0: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
cbc0: 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20  oc(db, pList, . 
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
cbe0: 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c  of(*pList)+(2*pL
cbf0: 69 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a  ist->nExpr - 1)*
cc00: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
cc10: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  0]));.    if( pN
cc20: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  ew==0 ){.      g
cc30: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
cc40: 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  }.    pList = pN
cc50: 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  ew;.  }.  pItem 
cc60: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
cc70: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61  t->nExpr++];.  a
cc80: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
cc90: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
cca0: 69 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a  item,zName)==siz
ccb0: 65 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  eof(pItem->pExpr
ccc0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ) );.  assert( o
ccd0: 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45  ffsetof(struct E
cce0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78  xprList_item,pEx
ccf0: 70 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  pr)==0 );.  mems
cd00: 65 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  et(&pItem->zName
cd10: 2c 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  ,0,sizeof(*pItem
cd20: 29 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63  )-offsetof(struc
cd30: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c  t ExprList_item,
cd40: 7a 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d  zName));.  pItem
cd50: 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
cd60: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
cd70: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
cd80: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
cd90: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
cda0: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
cdb0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
cdc0: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
cdd0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
cde0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
cdf0: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
ce00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75  ;.}../*.** pColu
ce10: 6d 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f  mns and pExpr fo
ce20: 72 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69  rm a vector assi
ce30: 67 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gnment which is 
ce40: 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a  part of the SET.
ce50: 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20  ** clause of an 
ce60: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
ce70: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
ce80: 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c  .**        (a,b,
ce90: 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72  c) = (expr1,expr
cea0: 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20  2,expr3).** Or: 
ceb0: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45     (a,b,c) = (SE
cec0: 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20  LECT x,y,z FROM 
ced0: 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ....).**.** For 
cee0: 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
cef0: 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65   vector assignme
cf00: 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65  nt, append new e
cf10: 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a  ntries to the.**
cf20: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
cf30: 20 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20   pList.  In the 
cf40: 63 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65  case of a subque
cf50: 72 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61  ry on the RHS, a
cf60: 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45  ppend.** TK_SELE
cf70: 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73  CT_COLUMN expres
cf80: 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69  sions..*/.ExprLi
cf90: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
cfa0: 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28  istAppendVector(
cfb0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cfc0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
cfd0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
cfe0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
cff0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
d000: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
d010: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
d020: 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  LL */.  IdList *
d030: 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f  pColumns,      /
d040: 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  * List of names 
d050: 6f 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73  of LHS of the as
d060: 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  signment */.  Ex
d070: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
d080: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65       /* Vector e
d090: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
d0a0: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
d0b0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
d0c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
d0d0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
d0e0: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
d0f0: 74 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74  t iFirst = pList
d100: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
d110: 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d  : 0;.  /* pColum
d120: 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e  ns can only be N
d130: 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f  ULL due to an OO
d140: 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c  M but an OOM wil
d150: 6c 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20  l cause an.  ** 
d160: 65 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68  exit prior to th
d170: 69 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67  is routine being
d180: 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66   invoked */.  if
d190: 28 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73  ( NEVER(pColumns
d1a0: 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74  ==0) ) goto vect
d1b0: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
d1c0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
d1d0: 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70  ) goto vector_ap
d1e0: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f  pend_error;..  /
d1f0: 2a 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20  * If the RHS is 
d200: 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77  a vector, then w
d210: 65 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c  e can immediatel
d220: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  y check to see t
d230: 68 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69  hat .  ** the si
d240: 7a 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e  ze of the RHS an
d250: 64 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75  d LHS match.  Bu
d260: 74 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  t if the RHS is 
d270: 61 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20  a SELECT, .  ** 
d280: 77 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20  wildcards ("*") 
d290: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d2a0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
d2b0: 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
d2c0: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20   before.  ** we 
d2d0: 63 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20  can do the size 
d2e0: 63 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20  check, so defer 
d2f0: 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75  the size check u
d300: 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
d310: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
d320: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53   pExpr->op!=TK_S
d330: 45 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e  ELECT && pColumn
d340: 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74  s->nId!=(n=sqlit
d350: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
d360: 28 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20  (pExpr)) ){.    
d370: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d380: 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
d390: 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
d3a0: 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
d3c0: 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a  lumns->nId, n);.
d3d0: 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f      goto vector_
d3e0: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20  append_error;.  
d3f0: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
d400: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69  pColumns->nId; i
d410: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d420: 53 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65  SubExpr = sqlite
d430: 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69  3ExprForVectorFi
d440: 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70  eld(pParse, pExp
d450: 72 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74  r, i);.    pList
d460: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
d470: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
d480: 20 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72   pList, pSubExpr
d490: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
d4a0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
d4b0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
d4c0: 69 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20  iFirst+i+1 );.  
d4d0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69      pList->a[pLi
d4e0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  st->nExpr-1].zNa
d4f0: 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61  me = pColumns->a
d500: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
d510: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e   pColumns->a[i].
d520: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  zName = 0;.    }
d530: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d  .  }..  if( !db-
d540: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
d550: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
d560: 45 4c 45 43 54 20 26 26 20 41 4c 57 41 59 53 28  ELECT && ALWAYS(
d570: 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  pList!=0) ){.   
d580: 20 45 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20   Expr *pFirst = 
d590: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d  pList->a[iFirst]
d5a0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
d5b0: 72 74 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b  rt( pFirst!=0 );
d5c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
d5d0: 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  rst->op==TK_SELE
d5e0: 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  CT_COLUMN );.   
d5f0: 20 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20    .    /* Store 
d600: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
d610: 6d 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73  ment in pRight s
d620: 6f 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c  o it will be del
d630: 65 74 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a  eted when.    **
d640: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d650: 44 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c  Delete() is call
d660: 65 64 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74  ed */.    pFirst
d670: 2d 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  ->pRight = pExpr
d680: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b  ;.    pExpr = 0;
d690: 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65  ..    /* Remembe
d6a0: 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
d6b0: 65 20 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20  e LHS in iTable 
d6c0: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63  so that we can c
d6d0: 68 65 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a  heck that.    **
d6e0: 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53   the RHS and LHS
d6f0: 20 73 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72   sizes match dur
d700: 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ing code generat
d710: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72  ion. */.    pFir
d720: 73 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f  st->iTable = pCo
d730: 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a  lumns->nId;.  }.
d740: 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65  .vector_append_e
d750: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45  rror:.  sqlite3E
d760: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
d770: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  xpr);.  sqlite3I
d780: 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
d790: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74  pColumns);.  ret
d7a0: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
d7b0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74  .** Set the sort
d7c0: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c   order for the l
d7d0: 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74  ast element on t
d7e0: 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73  he given ExprLis
d7f0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d800: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72  e3ExprListSetSor
d810: 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74 20  tOrder(ExprList 
d820: 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64  *p, int iSortOrd
d830: 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  er){.  if( p==0 
d840: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
d850: 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e  rt( SQLITE_SO_UN
d860: 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c  DEFINED<0 && SQL
d870: 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26  ITE_SO_ASC>=0 &&
d880: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e   SQLITE_SO_DESC>
d890: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
d8a0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69  ->nExpr>0 );.  i
d8b0: 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20  f( iSortOrder<0 
d8c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d8d0: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
d8e0: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
d8f0: 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20  E_SO_ASC );.    
d900: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d  return;.  }.  p-
d910: 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73  >a[p->nExpr-1].s
d920: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69  ortOrder = (u8)i
d930: 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a  SortOrder;.}../*
d940: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
d950: 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65  List.a[].zName e
d960: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
d970: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
d980: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
d990: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d9a0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
d9b0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
d9c0: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
d9d0: 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73  or.  But pName s
d9e0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
d9f0: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
da00: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
da10: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
da20: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
da30: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
da40: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
da50: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
da60: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
da70: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
da80: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
da90: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
daa0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
dab0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
dac0: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
dad0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
dae0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
daf0: 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64  Name to be added
db00: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
db10: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
db20: 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74   True to cause t
db30: 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65  he name to be de
db40: 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  quoted */.){.  a
db50: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
db60: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
db70: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
db80: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
db90: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
dba0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
dbb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
dbc0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
dbd0: 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69      pItem = &pLi
dbe0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
dbf0: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
dc00: 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d  t( pItem->zName=
dc10: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
dc20: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
dc30: 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65  DbStrNDup(pParse
dc40: 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ->db, pName->z, 
dc50: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
dc60: 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c  f( dequote ) sql
dc70: 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65  ite3Dequote(pIte
dc80: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d  m->zName);.  }.}
dc90: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
dca0: 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70  ExprList.a[].zSp
dcb0: 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  an element of th
dcc0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
dcd0: 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e  added item.** on
dce0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
dcf0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  list..**.** pLis
dd00: 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
dd10: 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d  following an OOM
dd20: 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70   error.  But pSp
dd30: 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  an should never 
dd40: 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20  be.** NULL.  If 
dd50: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
dd60: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70  ion fails, the p
dd70: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
dd80: 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20  cFailed flag.** 
dd90: 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  is set..*/.void 
dda0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
ddb0: 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20  etSpan(.  Parse 
ddc0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
ddd0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
dde0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
ddf0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
de00: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
de10: 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70  ch to add the sp
de20: 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  an. */.  const c
de30: 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20  har *zStart,    
de40: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65   /* Start of the
de50: 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74   span */.  const
de60: 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 20   char *zEnd     
de70: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
de80: 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71   span */.){.  sq
de90: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
dea0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
deb0: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
dec0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
ded0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
dee0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
def0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
df00: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
df10: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
df20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
df30: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
df40: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
df50: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
df60: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  n);.    pItem->z
df70: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
df80: 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61  SpanDup(db, zSta
df90: 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a 7d  rt, zEnd);.  }.}
dfa0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
dfb0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
dfc0: 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d  EList contains m
dfd0: 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20  ore than iLimit 
dfe0: 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61  elements,.** lea
dff0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
e000: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
e010: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
e020: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
e030: 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  h(.  Parse *pPar
e040: 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
e050: 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20  pEList,.  const 
e060: 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b  char *zObject.){
e070: 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72  .  int mx = pPar
e080: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
e090: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
e0a0: 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  MN];.  testcase(
e0b0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
e0c0: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a  t->nExpr==mx );.
e0d0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
e0e0: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
e0f0: 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69  xpr==mx+1 );.  i
e100: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
e110: 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b  ist->nExpr>mx ){
e120: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
e130: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
e140: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
e150: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
e160: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
e170: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65  lete an entire e
e180: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
e190: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
e1a0: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65  _NOINLINE void e
e1b0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
e1c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
e1d0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
e1e0: 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e   int i = pList->
e1f0: 6e 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20  nExpr;.  struct 
e200: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
e210: 49 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61  Item =  pList->a
e220: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
e230: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
e240: 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  do{.    sqlite3E
e250: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
e260: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
e270: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e280: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
e290: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e2a0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e2b0: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
e2c0: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d  ++;.  }while( --
e2d0: 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  i>0 );.  sqlite3
e2e0: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
e2f0: 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  st);.}.void sqli
e300: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
e310: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
e320: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
e330: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 65  .  if( pList ) e
e340: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
e350: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
e360: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
e370: 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c  bitwise-OR of al
e380: 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65  l Expr.flags fie
e390: 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e  lds in the given
e3a0: 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f  .** ExprList..*/
e3b0: 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70 72  .u32 sqlite3Expr
e3c0: 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20  ListFlags(const 
e3d0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
e3e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32  {.  int i;.  u32
e3f0: 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74   m = 0;.  assert
e400: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
e410: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
e420: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
e430: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
e440: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
e450: 78 70 72 3b 0a 20 20 20 20 20 61 73 73 65 72 74  xpr;.     assert
e460: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
e470: 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66     m |= pExpr->f
e480: 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75  lags;.  }.  retu
e490: 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn m;.}../*.** T
e4a0: 68 69 73 20 69 73 20 61 20 53 45 4c 45 43 54 2d  his is a SELECT-
e4b0: 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f  node callback fo
e4c0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
e4d0: 20 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20   walker that.** 
e4e0: 61 6c 77 61 79 73 20 22 66 61 69 6c 73 22 2e 20  always "fails". 
e4f0: 20 42 79 20 22 66 61 69 6c 22 20 69 6e 20 74 68   By "fail" in th
e500: 69 73 20 63 61 73 65 2c 20 77 65 20 6d 65 61 6e  is case, we mean
e510: 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d   set.** pWalker-
e520: 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61  >eCode to zero a
e530: 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20  nd abort..**.** 
e540: 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73  This callback is
e550: 20 75 73 65 64 20 62 79 20 6d 75 6c 74 69 70 6c   used by multipl
e560: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c  e expression wal
e570: 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  kers..*/.int sql
e580: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
e590: 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  il(Walker *pWalk
e5a0: 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  er, Select *NotU
e5b0: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
e5c0: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
e5d0: 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  );.  pWalker->eC
e5e0: 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ode = 0;.  retur
e5f0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a  n WRC_Abort;.}..
e600: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
e610: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ut expression is
e620: 20 61 6e 20 49 44 20 77 69 74 68 20 74 68 65 20   an ID with the 
e630: 6e 61 6d 65 20 22 74 72 75 65 22 20 6f 72 20 22  name "true" or "
e640: 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65 6e 20 63  false".** then c
e650: 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61  onvert it into a
e660: 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 74  n TK_TRUEFALSE t
e670: 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  erm.  Return non
e680: 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74 68 65 20  -zero if.** the 
e690: 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61 70 70 65  conversion happe
e6a0: 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f 20 69 66  ned, and zero if
e6b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e6c0: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 0a 2a 2f  is unaltered..*/
e6d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
e6e0: 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 45 78  IdToTrueFalse(Ex
e6f0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73  pr *pExpr){.  as
e700: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
e710: 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78 70 72 2d  =TK_ID || pExpr-
e720: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op==TK_STRING )
e730: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
e740: 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
e750: 7a 54 6f 6b 65 6e 2c 20 22 74 72 75 65 22 29 3d  zToken, "true")=
e760: 3d 30 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  =0.   || sqlite3
e770: 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
e780: 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73 65 22  .zToken, "false"
e790: 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 45  )==0.  ){.    pE
e7a0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52 55  xpr->op = TK_TRU
e7b0: 45 46 41 4c 53 45 3b 0a 20 20 20 20 72 65 74 75  EFALSE;.    retu
e7c0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
e7d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
e7e0: 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  he argument must
e7f0: 20 62 65 20 61 20 54 4b 5f 54 52 55 45 46 41 4c   be a TK_TRUEFAL
e800: 53 45 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 52  SE Expr node.  R
e810: 65 74 75 72 6e 20 31 20 69 66 20 69 74 20 69 73  eturn 1 if it is
e820: 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20 30 20 69   TRUE.** and 0 i
e830: 66 20 69 74 20 69 73 20 46 41 4c 53 45 2e 0a 2a  f it is FALSE..*
e840: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
e850: 72 54 72 75 74 68 56 61 6c 75 65 28 63 6f 6e 73  rTruthValue(cons
e860: 74 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  t Expr *pExpr){.
e870: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
e880: 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53  >op==TK_TRUEFALS
e890: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
e8a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
e8b0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74  xpr->u.zToken,"t
e8c0: 72 75 65 22 29 3d 3d 30 0a 20 20 20 20 20 20 20  rue")==0.       
e8d0: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
e8e0: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
e8f0: 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30 20 29 3b  n,"false")==0 );
e900: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d  .  return pExpr-
e910: 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b  >u.zToken[4]==0;
e920: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  .}.../*.** These
e930: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
e940: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75  lker callbacks u
e950: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70  sed to check exp
e960: 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73  ressions to.** s
e970: 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22  ee if they are "
e980: 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f  constant" for so
e990: 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  me definition of
e9a0: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a   constant.  The.
e9b0: 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  ** Walker.eCode 
e9c0: 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73  value determines
e9d0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f   the type of "co
e9e0: 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c  nstant" we are l
e9f0: 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a  ooking.** for..*
ea00: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
ea10: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
ea20: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
ea30: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
ea40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
ea50: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
ea60: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
ea70: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
ea80: 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71  ode==1.**     sq
ea90: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
eaa0: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20  antNotJoin()    
eab0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
eac0: 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20  eCode==2.**     
ead0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
eae0: 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  leConstant()    
eaf0: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
eb00: 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20  ->eCode==3.**   
eb10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
eb20: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
eb30: 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b  n()        pWalk
eb40: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
eb50: 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63  5.**.** In all c
eb60: 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61  ases, the callba
eb70: 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65  cks set Walker.e
eb80: 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74  Code=0 and abort
eb90: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
eba0: 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74  on.** is found t
ebb0: 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74  o not be a const
ebc0: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ant..**.** The s
ebd0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
ebe0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
ebf0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61   is used for eva
ec00: 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69  luating expressi
ec10: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ons.** in a CREA
ec20: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
ec30: 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e  nt.  The Walker.
ec40: 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35  eCode value is 5
ec50: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
ec60: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
ec70: 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70  ema and 4 when p
ec80: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
ec90: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
eca0: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
ecb0: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
ecc0: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
ecd0: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
ece0: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
ecf0: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
ed00: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
ed10: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
ed20: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
ed30: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
ed40: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
ed50: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
ed60: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
ed70: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
ed80: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
ed90: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
eda0: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
edb0: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
edc0: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
edd0: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
ede0: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
edf0: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
ee00: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
ee10: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
ee20: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
ee30: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73  Walker->eCode is
ee40: 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   2 then any term
ee50: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
ee60: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
ee70: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
ee80: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
ee90: 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64  of a left join d
eea0: 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20  isqualifies the 
eeb0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
eec0: 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69  from being consi
eed0: 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20  dered constant. 
eee0: 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  */.  if( pWalker
eef0: 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78  ->eCode==2 && Ex
ef00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
ef10: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
ef20: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
ef30: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
ef40: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
ef50: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
ef60: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
ef70: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
ef80: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
ef90: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
efa0: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
efb0: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
efc0: 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57  ** and either pW
efd0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
efe0: 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63  or 5 or the func
eff0: 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20  tion has the.   
f000: 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ** SQLITE_FUNC_
f010: 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20  CONST flag. */. 
f020: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
f030: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
f040: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34  Walker->eCode>=4
f050: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
f060: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
f070: 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  stFunc) ){.     
f080: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
f090: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
f0a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61  lse{.        pWa
f0b0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
f0c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f0d0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
f0e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
f0f0: 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  D:.      /* Conv
f100: 65 72 74 20 22 74 72 75 65 22 20 6f 72 20 22 66  ert "true" or "f
f110: 61 6c 73 65 22 20 69 6e 20 61 20 44 45 46 41 55  alse" in a DEFAU
f120: 4c 54 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 74  LT clause into t
f130: 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 70 70 72  he.      ** appr
f140: 6f 70 72 69 61 74 65 20 54 4b 5f 54 52 55 45 46  opriate TK_TRUEF
f150: 41 4c 53 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ALSE operator */
f160: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
f170: 65 33 45 78 70 72 49 64 54 6f 54 72 75 65 46 61  e3ExprIdToTrueFa
f180: 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
f190: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
f1a0: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
f1b0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
f1c0: 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
f1d0: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
f1e0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
f1f0: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
f200: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
f210: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
f220: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
f230: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f240: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
f250: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
f260: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
f270: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
f280: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
f290: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
f2a0: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
f2b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
f2c0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
f2d0: 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20  r, EP_FixedCol) 
f2e0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f2f0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
f300: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f310: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
f320: 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54  ==3 && pExpr->iT
f330: 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
f340: 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  .iCur ){.       
f350: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
f360: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
f370: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
f380: 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
f390: 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a  TK_IF_NULL_ROW:.
f3a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
f3b0: 53 54 45 52 3a 0a 20 20 20 20 20 20 74 65 73 74  STER:.      test
f3c0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
f3d0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
f3e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f3f0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46  pExpr->op==TK_IF
f400: 5f 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20  _NULL_ROW );.   
f410: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
f420: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
f430: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
f440: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
f450: 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70  BLE:.      if( p
f460: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35  Walker->eCode==5
f470: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
f480: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20  ilently convert 
f490: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73  bound parameters
f4a0: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 73   that appear ins
f4b0: 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20  ide of CREATE.  
f4c0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
f4d0: 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20  nts into a NULL 
f4e0: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65  when parsing the
f4f0: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
f500: 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20  t text out.     
f510: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c     ** of the sql
f520: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
f530: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70   */.        pExp
f540: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
f550: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f560: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f570: 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =4 ){.        /*
f580: 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74   A bound paramet
f590: 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20 73  er in a CREATE s
f5a0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72  tatement that or
f5b0: 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20  iginates from.  
f5c0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
f5d0: 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73 65  _prepare() cause
f5e0: 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
f5f0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
f600: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
f610: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
f620: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
f630: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
f640: 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74  h */.    default
f650: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
f660: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f670: 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 71 6c  SELECT ); /* sql
f680: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
f690: 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a  il() disallows *
f6a0: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
f6b0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f6c0: 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 71 6c  EXISTS ); /* sql
f6d0: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
f6e0: 69 6c 28 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a  il() disallows *
f6f0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  /.      return W
f700: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
f710: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
f720: 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a  prIsConst(Expr *
f730: 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c  p, int initFlag,
f740: 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61   int iCur){.  Wa
f750: 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64  lker w;.  w.eCod
f760: 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20  e = initFlag;.  
f770: 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
f780: 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  = exprNodeIsCons
f790: 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63  tant;.  w.xSelec
f7a0: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
f7b0: 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
f7c0: 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  l;.#ifdef SQLITE
f7d0: 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65  _DEBUG.  w.xSele
f7e0: 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71  ctCallback2 = sq
f7f0: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41  lite3SelectWalkA
f800: 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20  ssert2;.#endif. 
f810: 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72   w.u.iCur = iCur
f820: 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
f830: 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
f840: 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a  turn w.eCode;.}.
f850: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
f860: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
f870: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
f880: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
f890: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
f8a0: 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e  * and 0 if it in
f8b0: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
f8c0: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
f8d0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ls..**.** For th
f8e0: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
f8f0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
f900: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
f910: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
f920: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
f930: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
f940: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
f950: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
f960: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
f970: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
f980: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
f990: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  t(Expr *p){.  re
f9a0: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
f9b0: 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  (p, 1, 0);.}../*
f9c0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
f9d0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
f9e0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
f9f0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
fa00: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74  is constant.** t
fa10: 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67  hat does no orig
fa20: 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f  inate from the O
fa30: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
fa40: 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  es of a join..**
fa50: 20 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20   Return 0 if it 
fa60: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
fa70: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
fa80: 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72  alls or terms fr
fa90: 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55  om.** an ON or U
faa0: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  SING clause..*/.
fab0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
fac0: 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
fad0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
fae0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
faf0: 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  p, 2, 0);.}../*.
fb00: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
fb10: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
fb20: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
fb30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
fb40: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f  s constant.** fo
fb50: 72 20 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77  r any single row
fb60: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 69   of the table wi
fb70: 74 68 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20  th cursor iCur. 
fb80: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
fb90: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
fba0: 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65  on must not refe
fbb0: 72 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74  r to any non-det
fbc0: 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74  erministic funct
fbd0: 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74  ion nor any.** t
fbe0: 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  able other than 
fbf0: 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iCur..*/.int sql
fc00: 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
fc10: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c  onstant(Expr *p,
fc20: 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65   int iCur){.  re
fc30: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
fc40: 28 70 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a  (p, 3, iCur);.}.
fc50: 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57  ../*.** sqlite3W
fc60: 61 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61  alkExpr() callba
fc70: 63 6b 20 75 73 65 64 20 62 79 20 73 71 6c 69 74  ck used by sqlit
fc80: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
fc90: 4f 72 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a  OrGroupBy()..*/.
fca0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e  static int exprN
fcb0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  odeIsConstantOrG
fcc0: 72 6f 75 70 42 79 28 57 61 6c 6b 65 72 20 2a 70  roupBy(Walker *p
fcd0: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
fce0: 78 70 72 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  xpr){.  ExprList
fcf0: 20 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 57 61   *pGroupBy = pWa
fd00: 6c 6b 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79  lker->u.pGroupBy
fd10: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
fd20: 20 43 68 65 63 6b 20 69 66 20 70 45 78 70 72 20   Check if pExpr 
fd30: 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20  is identical to 
fd40: 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72  any GROUP BY ter
fd50: 6d 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64  m. If so, consid
fd60: 65 72 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74  er.  ** it const
fd70: 61 6e 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ant.  */.  for(i
fd80: 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; i<pGroupBy->
fd90: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
fda0: 20 45 78 70 72 20 2a 70 20 3d 20 70 47 72 6f 75   Expr *p = pGrou
fdb0: 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  pBy->a[i].pExpr;
fdc0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
fdd0: 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70  ExprCompare(0, p
fde0: 45 78 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29  Expr, p, -1)<2 )
fdf0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
fe00: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
fe10: 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57  ExprNNCollSeq(pW
fe20: 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70  alker->pParse, p
fe30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
fe40: 69 74 65 33 49 73 42 69 6e 61 72 79 28 70 43 6f  ite3IsBinary(pCo
fe50: 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ll) ){.        r
fe60: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
fe70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fe80: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
fe90: 66 20 70 45 78 70 72 20 69 73 20 61 20 73 75 62  f pExpr is a sub
fea0: 2d 73 65 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20  -select. If so, 
feb0: 63 6f 6e 73 69 64 65 72 20 69 74 20 76 61 72 69  consider it vari
fec0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 45  able. */.  if( E
fed0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
fee0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
fef0: 63 74 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  ct) ){.    pWalk
ff00: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
ff10: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
ff20: 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ort;.  }..  retu
ff30: 72 6e 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  rn exprNodeIsCon
ff40: 73 74 61 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70  stant(pWalker, p
ff50: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
ff60: 57 61 6c 6b 20 74 68 65 20 65 78 70 72 65 73 73  Walk the express
ff70: 69 6f 6e 20 74 72 65 65 20 70 61 73 73 65 64 20  ion tree passed 
ff80: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
ff90: 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f  ument. Return no
ffa0: 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65  n-zero.** if the
ffb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73   expression cons
ffc0: 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
ffd0: 20 63 6f 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f   constants or co
ffe0: 70 69 65 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a  pies of terms .*
fff0: 2a 20 69 6e 20 70 47 72 6f 75 70 42 79 20 74 68  * in pGroupBy th
10000 61 74 20 73 6f 72 74 20 77 69 74 68 20 74 68 65  at sort with the
10010 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f   BINARY collatio
10020 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  n sequence..**.*
10030 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10040 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
10050 69 6e 65 20 69 66 20 61 20 74 65 72 6d 20 6f 66  ine if a term of
10060 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
10070 73 65 20 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f  se can.** be pro
10080 6d 6f 74 65 64 20 69 6e 74 6f 20 74 68 65 20 57  moted into the W
10090 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 49 6e  HERE clause.  In
100a0 20 6f 72 64 65 72 20 66 6f 72 20 73 75 63 68 20   order for such 
100b0 61 20 70 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77  a promotion to w
100c0 6f 72 6b 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ork,.** the valu
100d0 65 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20  e of the HAVING 
100e0 63 6c 61 75 73 65 20 74 65 72 6d 20 6d 75 73 74  clause term must
100f0 20 62 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72   be the same for
10100 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a   all members of.
10110 2a 2a 20 61 20 22 67 72 6f 75 70 22 2e 20 20 54  ** a "group".  T
10120 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74  he requirement t
10130 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  hat the GROUP BY
10140 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 42 49   term must be BI
10150 4e 41 52 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20  NARY.** assumes 
10160 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
10170 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10180 20 77 69 6c 6c 20 68 61 76 65 20 61 20 66 69 6e   will have a fin
10190 65 72 2d 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72  er-grained.** gr
101a0 6f 75 70 69 6e 67 20 74 68 61 6e 20 62 69 6e 61  ouping than bina
101b0 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ry.  In other wo
101c0 72 64 73 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45  rds (A=B COLLATE
101d0 20 62 69 6e 61 72 79 29 20 69 6d 70 6c 69 65 73   binary) implies
101e0 0a 2a 2a 20 41 3d 42 20 69 6e 20 65 76 65 72 79  .** A=B in every
101f0 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67   other collating
10200 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20   sequence.  The 
10210 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74  requirement that
10220 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59   the.** GROUP BY
10230 20 62 65 20 42 49 4e 41 52 59 20 69 73 20 73 74   be BINARY is st
10240 72 69 63 74 65 72 20 74 68 61 6e 20 6e 65 63 65  ricter than nece
10250 73 73 61 72 79 2e 20 20 49 74 20 77 6f 75 6c 64  ssary.  It would
10260 20 61 6c 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f   also work.** to
10270 20 70 72 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20   promote HAVING 
10280 63 6c 61 75 73 65 73 20 74 68 61 74 20 75 73 65  clauses that use
10290 20 74 68 65 20 73 61 6d 65 20 61 6c 74 65 72 6e   the same altern
102a0 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a  ative collating.
102b0 2a 2a 20 73 65 71 75 65 6e 63 65 20 61 73 20 74  ** sequence as t
102c0 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
102d0 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6d 75  , but that is mu
102e0 63 68 20 68 61 72 64 65 72 20 74 6f 20 63 68 65  ch harder to che
102f0 63 6b 2c 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69  ck,.** alternati
10300 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ve collating seq
10310 75 65 6e 63 65 73 20 61 72 65 20 75 6e 63 6f 6d  uences are uncom
10320 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73 20 69 73  mon, and this is
10330 20 6f 6e 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69   only an.** opti
10340 6d 69 7a 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20  mization, so we 
10350 74 61 6b 65 20 74 68 65 20 65 61 73 79 20 77 61  take the easy wa
10360 79 20 6f 75 74 20 61 6e 64 20 73 69 6d 70 6c 79  y out and simply
10370 20 72 65 71 75 69 72 65 20 74 68 65 0a 2a 2a 20   require the.** 
10380 47 52 4f 55 50 20 42 59 20 74 6f 20 75 73 65 20  GROUP BY to use 
10390 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  the BINARY colla
103a0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
103b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
103c0 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  rIsConstantOrGro
103d0 75 70 42 79 28 50 61 72 73 65 20 2a 70 50 61 72  upBy(Parse *pPar
103e0 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 45 78 70  se, Expr *p, Exp
103f0 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 29  rList *pGroupBy)
10400 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
10410 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77  w.eCode = 1;.  w
10420 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
10430 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
10440 61 6e 74 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20  antOrGroupBy;.  
10450 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
10460 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72  k = 0;.  w.u.pGr
10470 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
10480 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
10490 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
104a0 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
104b0 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
104c0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
104d0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
104e0 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
104f0 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
10500 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
10510 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
10520 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
10530 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
10540 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
10550 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
10560 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
10570 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
10580 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
10590 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
105a0 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
105b0 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
105c0 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
105d0 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
105e0 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
105f0 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
10600 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
10610 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
10620 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
10630 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c  unction(Expr *p,
10640 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61   u8 isInit){.  a
10650 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30  ssert( isInit==0
10660 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b   || isInit==1 );
10670 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
10680 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69  Const(p, 4+isIni
10690 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  t, 0);.}..#ifdef
106a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
106b0 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
106c0 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
106d0 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
106e0 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
106f0 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
10700 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66  a.** subquery of
10710 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74   some kind.  Ret
10720 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 61  urn 0 if there a
10730 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73  re no subqueries
10740 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10750 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71  ExprContainsSubq
10760 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20  uery(Expr *p){. 
10770 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65   Walker w;.  w.e
10780 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45  Code = 1;.  w.xE
10790 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
107a0 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
107b0 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
107c0 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
107d0 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a  SelectWalkFail;.
107e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
107f0 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  BUG.  w.xSelectC
10800 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74  allback2 = sqlit
10810 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65  e3SelectWalkAsse
10820 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  rt2;.#endif.  sq
10830 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
10840 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
10850 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e  .eCode==0;.}.#en
10860 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
10870 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  e expression p c
10880 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  odes a constant 
10890 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
108a0 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20  small enough.** 
108b0 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62  to fit in a 32-b
108c0 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
108d0 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65  rn 1 and put the
108e0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
108f0 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61  teger.** in *pVa
10900 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70  lue.  If the exp
10910 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
10920 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
10930 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a  it is too big.**
10940 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67   to fit in a sig
10950 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
10960 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64  er, return 0 and
10970 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75   leave *pValue u
10980 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
10990 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
109a0 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69  teger(Expr *p, i
109b0 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69  nt *pValue){.  i
109c0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28  nt rc = 0;.  if(
109d0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
109e0 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68  ;  /* Can only h
109f0 61 70 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  appen following 
10a00 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20  on OOM */..  /* 
10a10 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  If an expression
10a20 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c   is an integer l
10a30 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74 73  iteral that fits
10a40 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
10a50 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  bit.  ** integer
10a60 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e  , then the EP_In
10a70 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c  tValue flag will
10a80 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
10a90 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65  en set */.  asse
10aa0 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  rt( p->op!=TK_IN
10ab0 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61  TEGER || (p->fla
10ac0 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
10ad0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
10ae0 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
10af0 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  32(p->u.zToken, 
10b00 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  &rc)==0 );..  if
10b10 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
10b20 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
10b30 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69  *pValue = p->u.i
10b40 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72  Value;.    retur
10b50 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n 1;.  }.  switc
10b60 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
10b70 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
10b80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
10b90 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
10ba0 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
10bb0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
10bc0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10bd0 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
10be0 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
10bf0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
10c00 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
10c10 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
10c20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32    assert( v!=(-2
10c30 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a  147483647-1) );.
10c40 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
10c50 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
10c60 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
10c70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10c80 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
10c90 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
10ca0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
10cb0 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
10cc0 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
10cd0 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
10ce0 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c  ssion can be NUL
10cf0 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
10d00 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
10d10 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   be NULL or if t
10d20 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
10d30 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20   too complex.** 
10d40 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54  to tell return T
10d50 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  RUE.  .**.** Thi
10d60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
10d70 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  d as an optimiza
10d80 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50  tion, to skip OP
10d90 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a  _IsNull opcodes.
10da0 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20  ** when we know 
10db0 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e  that a value can
10dc0 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65  not be NULL.  He
10dd0 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73  nce, a false pos
10de0 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e  itive.** (return
10df0 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e  ing TRUE when in
10e00 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73   fact the expres
10e10 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62  sion can never b
10e20 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a  e NULL) might.**
10e30 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66   be a small perf
10e40 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20  ormance hit but 
10e50 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72  is otherwise har
10e60 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f  mless.  On the o
10e70 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20  ther.** hand, a 
10e80 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28  false negative (
10e90 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20  returning FALSE 
10ea0 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  when the result 
10eb0 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a  could be NULL).*
10ec0 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  * will likely re
10ed0 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72  sult in an incor
10ee0 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f  rect answer.  So
10ef0 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   when in doubt, 
10f00 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a  return.** TRUE..
10f10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
10f20 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73  prCanBeNull(cons
10f30 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38  t Expr *p){.  u8
10f40 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d   op;.  while( p-
10f50 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
10f60 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
10f70 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
10f80 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
10f90 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
10fa0 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
10fb0 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
10fc0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
10fd0 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
10fe0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
10ff0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
11000 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
11010 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
11020 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54  rn 0;.    case T
11030 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  K_COLUMN:.      
11040 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
11050 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e  operty(p, EP_Can
11060 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20  BeNull) ||.     
11070 20 20 20 20 20 20 20 20 70 2d 3e 70 54 61 62 3d          p->pTab=
11080 3d 30 20 7c 7c 20 20 2f 2a 20 52 65 66 65 72 65  =0 ||  /* Refere
11090 6e 63 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66  nce to column of
110a0 20 69 6e 64 65 78 20 6f 6e 20 65 78 70 72 65 73   index on expres
110b0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  sion */.        
110c0 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e       (p->iColumn
110d0 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e  >=0 && p->pTab->
110e0 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d  aCol[p->iColumn]
110f0 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20  .notNull==0);.  
11100 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
11110 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
11120 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
11130 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
11140 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
11150 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20   constant which 
11160 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68  would be.** unch
11170 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69  anged by OP_Affi
11180 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66  nity with the af
11190 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20  finity given in 
111a0 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
111b0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
111c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
111d0 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
111e0 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  if the OP_Affini
111f0 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ty operation.** 
11200 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
11210 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72   When in doubt r
11220 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20  eturn FALSE.  A 
11230 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a  false negative.*
11240 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  * is harmless.  
11250 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  A false positive
11260 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72  , however, can r
11270 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f  esult in the wro
11280 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f  ng.** answer..*/
11290 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
112a0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
112b0 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72  hange(const Expr
112c0 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a   *p, char aff){.
112d0 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61    u8 op;.  if( a
112e0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ff==SQLITE_AFF_B
112f0 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  LOB ) return 1;.
11300 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
11310 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
11320 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
11330 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
11340 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
11350 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
11360 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
11370 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
11380 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
11390 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
113a0 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
113b0 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
113c0 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
113d0 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
113e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
113f0 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  AT: {.      retu
11400 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
11410 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d  FF_REAL || aff==
11420 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
11430 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
11440 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
11450 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
11460 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
11470 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  T;.    }.    cas
11480 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
11490 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
114a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
114b0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61  OLUMN: {.      a
114c0 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65  ssert( p->iTable
114d0 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e  >=0 );  /* p can
114e0 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61  not be part of a
114f0 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
11500 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
11510 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20  n p->iColumn<0. 
11520 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66           && (aff
11530 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
11540 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
11550 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29  ITE_AFF_NUMERIC)
11560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
11570 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ult: {.      ret
11580 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
11590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
115a0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
115b0 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
115c0 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
115d0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
115e0 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
115f0 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
11600 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
11610 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
11620 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
11630 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
11640 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
11650 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
11660 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
11670 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
11680 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
11690 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58  n 0;.}../*.** pX
116a0 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 61   is the RHS of a
116b0 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20  n IN operator.  
116c0 49 66 20 70 58 20 69 73 20 61 20 53 45 4c 45 43  If pX is a SELEC
116d0 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20  T statement .** 
116e0 74 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d 70  that can be simp
116f0 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69 72 65  lified to a dire
11700 63 74 20 74 61 62 6c 65 20 61 63 63 65 73 73 2c  ct table access,
11710 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20   then return.** 
11720 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
11730 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11740 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f 74  t.  If pX is not
11750 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
11760 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68  ent,.** or if th
11770 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
11780 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d  nt needs to be m
11790 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20 61  anifested into a
117a0 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61   transient.** ta
117b0 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ble, then return
117c0 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65   NULL..*/.#ifnde
117d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
117e0 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 53 65  BQUERY.static Se
117f0 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61 74  lect *isCandidat
11800 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20 2a  eForInOpt(Expr *
11810 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  pX){.  Select *p
11820 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
11830 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c;.  ExprList *p
11840 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a  EList;.  Table *
11850 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pTab;.  int i;. 
11860 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
11870 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
11880 53 65 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e  Select) ) return
11890 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75   0;  /* Not a su
118a0 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20  bquery */.  if( 
118b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
118c0 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pX, EP_VarSelect
118d0 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  )  ) return 0;  
118e0 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73 75  /* Correlated su
118f0 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e  bq */.  p = pX->
11900 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28  x.pSelect;.  if(
11910 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74   p->pPrior ) ret
11920 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
11930 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d      /* Not a com
11940 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
11950 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
11960 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
11970 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
11980 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
11990 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
119a0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
119b0 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
119c0 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74  istinct );.    t
119d0 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
119e0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
119f0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
11a00 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
11a10 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e );.    return 
11a20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43  0; /* No DISTINC
11a30 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f  T keyword and no
11a40 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
11a50 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73  ions */.  }.  as
11a60 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
11a70 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  y==0 );         
11a80 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47       /* Has no G
11a90 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
11aa0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
11ab0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
11ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
11ad0 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  s no LIMIT claus
11ae0 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57  e */.  if( p->pW
11af0 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b10 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
11b20 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
11b30 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
11b40 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
11b50 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
11b60 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
11b70 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
11b80 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63  e term in FROM c
11b90 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
11ba0 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
11bb0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
11bc0 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74    /* FROM is not
11bd0 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76   a subquery or v
11be0 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  iew */.  pTab = 
11bf0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
11c00 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
11c10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11c20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
11c30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   );            /
11c40 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  * FROM clause is
11c50 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20   not a view */. 
11c60 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
11c70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
11c80 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
11c90 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72  clause not a vir
11ca0 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
11cb0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
11cc0 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  st;.  assert( pE
11cd0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20  List!=0 );.  /* 
11ce0 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73 75 6c  All SELECT resul
11cf0 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c 75 6d  ts must be colum
11d00 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ns. */.  for(i=0
11d10 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
11d20 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
11d30 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69 73 74  r *pRes = pEList
11d40 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
11d50 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d    if( pRes->op!=
11d60 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
11d70 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74  rn 0;.    assert
11d80 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d  ( pRes->iTable==
11d90 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
11da0 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20  or );  /* Not a 
11db0 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
11dc0 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  ery */.  }.  ret
11dd0 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn p;.}.#endif 
11de0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
11df0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
11e00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11e10 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
11e20 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
11e30 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66  t checks the lef
11e40 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
11e50 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75   index table iCu
11e60 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69  r to see if.** i
11e70 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  t contains any N
11e80 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61  ULL entries.  Ca
11e90 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
11ea0 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74   at regHasNull t
11eb0 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  o be set.** to a
11ec0 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
11ed0 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
11ee0 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73   no NULLs.  Caus
11ef0 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48 61  e register regHa
11f00 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73  sNull.** to be s
11f10 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43  et to NULL if iC
11f20 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ur contains one 
11f30 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
11f40 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ues..*/.static v
11f50 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48 61  oid sqlite3SetHa
11f60 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a  sNullFlag(Vdbe *
11f70 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74  v, int iCur, int
11f80 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20   regHasNull){.  
11f90 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73 71 6c  int addr1;.  sql
11fa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11fb0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
11fc0 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
11fd0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
11fe0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
11ff0 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b 20 56  Rewind, iCur); V
12000 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
12010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12020 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
12030 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67 48 61  , iCur, 0, regHa
12040 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  sNull);.  sqlite
12050 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
12060 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
12070 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  G);.  VdbeCommen
12080 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65 6e 74  t((v, "first_ent
12090 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43 75 72  ry_in(%d)", iCur
120a0 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
120b0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
120c0 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  r1);.}.#endif...
120d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
120e0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
120f0 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
12100 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  is an IN operato
12110 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e  r with a list (n
12120 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 6f  ot a subquery) o
12130 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d  n the .** right-
12140 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75  hand side.  Retu
12150 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74 20  rn TRUE if that 
12160 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  list is constant
12170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12180 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f  sqlite3InRhsIsCo
12190 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e  nstant(Expr *pIn
121a0 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b  ){.  Expr *pLHS;
121b0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73  .  int res;.  as
121c0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
121d0 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78  operty(pIn, EP_x
121e0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70  IsSelect) );.  p
121f0 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74  LHS = pIn->pLeft
12200 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d  ;.  pIn->pLeft =
12210 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69   0;.  res = sqli
12220 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
12230 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70  t(pIn);.  pIn->p
12240 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72  Left = pLHS;.  r
12250 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e  eturn res;.}.#en
12260 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
12270 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
12280 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
12290 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  tation of the IN
122a0 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e   (...) operator.
122b0 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d  .** The pX param
122c0 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72  eter is the expr
122d0 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48  ession on the RH
122e0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
122f0 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d  ator, which.** m
12300 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61  ight be either a
12310 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
12320 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65  ions or a subque
12330 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  ry..**.** The jo
12340 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
12350 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20  e is to find or 
12360 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20  create a b-tree 
12370 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a  object that can.
12380 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65  ** be used eithe
12390 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65  r to test for me
123a0 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20  mbership in the 
123b0 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74  RHS set or to it
123c0 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a  erate through.**
123d0 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
123e0 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69  the RHS set, ski
123f0 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73  pping duplicates
12400 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72  ..**.** A cursor
12410 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68   is opened on th
12420 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  e b-tree object 
12430 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53 20  that is the RHS 
12440 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
12450 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54  or.** and pX->iT
12460 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74  able is set to t
12470 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
12480 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
12490 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
124a0 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
124b0 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  on indicates the
124c0 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73   b-tree type, as
124d0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
124e0 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44    IN_INDEX_ROWID
124f0 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
12500 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
12510 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
12520 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
12530 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68  _INDEX_ASC  - Th
12540 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
12550 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  ned on an ascend
12560 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
12570 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
12580 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72  ESC - The cursor
12590 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
125a0 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
125b0 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
125c0 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68  _EPH        - Th
125d0 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
125e0 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c  ned on a special
125f0 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  ly created and.*
12600 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12610 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61            popula
12620 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61  ted epheremal ta
12630 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
12640 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20  EX_NOOP       - 
12650 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c  No cursor was al
12660 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e  located.  The IN
12670 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62   operator must b
12680 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
12690 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70               imp
126a0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65  lemented as a se
126b0 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72  quence of compar
126c0 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  isons..**.** An 
126d0 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20  existing b-tree 
126e0 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66  might be used if
126f0 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73   the RHS express
12700 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70  ion pX is a simp
12710 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73  le.** subquery s
12720 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  uch as:.**.**   
12730 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e    SELECT <column
12740 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e  1>, <column2>...
12750 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a   FROM <table>.**
12760 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f  .** If the RHS o
12770 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
12780 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61  r is a list or a
12790 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75   more complex su
127a0 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20  bquery, then.** 
127b0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
127c0 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  le might need to
127d0 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72   be generated fr
127e0 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74  om the RHS and t
127f0 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c  hen.** pX->iTabl
12800 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
12810 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  to the ephemeral
12820 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f   table instead o
12830 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67  f an.** existing
12840 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
12850 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65  e inFlags parame
12860 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ter must contain
12870 2c 20 61 74 20 61 20 6d 69 6e 69 6d 75 6d 2c 20  , at a minimum, 
12880 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74 73 0a  one of the bits.
12890 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  ** IN_INDEX_MEMB
128a0 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49 4e 44  ERSHIP or IN_IND
128b0 45 58 5f 4c 4f 4f 50 20 62 75 74 20 6e 6f 74 20  EX_LOOP but not 
128c0 62 6f 74 68 2e 20 20 49 66 20 69 6e 46 6c 61 67  both.  If inFlag
128d0 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e  s contains.** IN
128e0 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
128f0 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65  P, then the gene
12900 72 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c  rated table will
12910 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 66   be used for a f
12920 61 73 74 0a 2a 2a 20 6d 65 6d 62 65 72 73 68 69  ast.** membershi
12930 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68  p test.  When th
12940 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  e IN_INDEX_LOOP 
12950 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 20  bit is set, the 
12960 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 0a 2a 2a  IN index will.**
12970 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70   be used to loop
12980 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73   over all values
12990 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   of the RHS of t
129a0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  he IN operator..
129b0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
129c0 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64  DEX_LOOP is used
129d0 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65   (and the b-tree
129e0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
129f0 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f   iterate.** thro
12a00 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62  ugh the set memb
12a10 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d  ers) then the b-
12a20 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f  tree must not co
12a30 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73  ntain duplicates
12a40 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61  ..** An epherema
12a50 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  l table will be 
12a60 63 72 65 61 74 65 64 20 75 6e 6c 65 73 73 20 74  created unless t
12a70 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75  he selected colu
12a80 6d 6e 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  mns are guarante
12a90 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71  ed.** to be uniq
12aa0 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61  ue - either beca
12ab0 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54  use it is an INT
12ac0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
12ad0 20 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20 61 20   or due to.** a 
12ae0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
12af0 74 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  t or index..**.*
12b00 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
12b10 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20 75 73  MEMBERSHIP is us
12b20 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
12b30 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
12b40 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74  .** for fast set
12b50 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
12b60 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72  s) then an epher
12b70 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
12b80 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65  .** be used unle
12b90 73 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73 20  ss <columns> is 
12ba0 61 20 73 69 6e 67 6c 65 20 49 4e 54 45 47 45 52  a single INTEGER
12bb0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
12bc0 75 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e  umn or an .** in
12bd0 64 65 78 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  dex can be found
12be0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
12bf0 69 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73  ied <columns> as
12c00 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a   its left-most..
12c10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f  **.** If the IN_
12c20 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e  INDEX_NOOP_OK an
12c30 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  d IN_INDEX_MEMBE
12c40 52 53 48 49 50 20 61 72 65 20 62 6f 74 68 20 73  RSHIP are both s
12c50 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65  et and.** if the
12c60 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
12c70 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
12c80 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t (not a subquer
12c90 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  y) then this.** 
12ca0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65  routine might de
12cb0 63 69 64 65 20 74 68 61 74 20 63 72 65 61 74 69  cide that creati
12cc0 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
12cd0 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65  b-tree for membe
12ce0 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67  rship.** testing
12cf0 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76   is too expensiv
12d00 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f  e and return IN_
12d10 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20  INDEX_NOOP.  In 
12d20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a  that case, the.*
12d30 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
12d40 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65  e should impleme
12d50 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  nt the IN operat
12d60 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71 75 65  or using a seque
12d70 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20  nce.** of Eq or 
12d80 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  Ne comparison op
12d90 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
12da0 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  When the b-tree 
12db0 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  is being used fo
12dc0 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
12dd0 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ts, the calling 
12de0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68  function.** migh
12df0 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77  t need to know w
12e00 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
12e10 65 20 52 48 53 20 73 69 64 65 20 6f 66 20 74 68  e RHS side of th
12e20 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
12e30 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c   contains a NULL
12e40 2e 20 20 49 66 20 70 72 52 68 73 48 61 73 4e 75  .  If prRhsHasNu
12e50 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c  ll is not a NULL
12e60 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a   pointer and .**
12e70 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
12e80 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
12e90 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e   (...) might con
12ea0 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75  tain a NULL valu
12eb0 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c  e at.** runtime,
12ec0 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72   then a register
12ed0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
12ee0 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  d the register n
12ef0 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a  umber written.**
12f00 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c   to *prRhsHasNul
12f10 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  l. If there is n
12f20 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
12f30 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73  e (...) contains
12f40 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65   a.** NULL value
12f50 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73  , then *prRhsHas
12f60 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63  Null is left unc
12f70 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
12f80 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
12f90 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73  llocated and its
12fa0 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64   location stored
12fb0 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c   in *prRhsHasNul
12fc0 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76  l, then.** the v
12fd0 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65 67  alue in that reg
12fe0 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55  ister will be NU
12ff0 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  LL if the b-tree
13000 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
13010 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61   more.** NULL va
13020 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c  lues, and it wil
13030 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55  l be some non-NU
13040 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65 20  LL value if the 
13050 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20  b-tree contains 
13060 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  no.** NULL value
13070 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
13080 61 69 4d 61 70 20 70 61 72 61 6d 65 74 65 72 20  aiMap parameter 
13090 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
130a0 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  must point to an
130b0 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e   array containin
130c0 67 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  g.** one element
130d0 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
130e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
130f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13100 74 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a 2a 20  t on the RHS.** 
13110 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f  of the IN(...) o
13120 70 65 72 61 74 6f 72 2e 20 54 68 65 20 69 27 74  perator. The i't
13130 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 61  h entry of the a
13140 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65  rray is populate
13150 64 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6f 66  d with the.** of
13160 66 73 65 74 20 6f 66 20 74 68 65 20 69 6e 64 65  fset of the inde
13170 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61  x column that ma
13180 74 63 68 65 73 20 74 68 65 20 69 27 74 68 20 63  tches the i'th c
13190 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62  olumn returned b
131a0 79 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e  y the.** SELECT.
131b0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
131c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
131d0 61 6e 64 20 73 65 6c 65 63 74 65 64 20 69 6e 64  and selected ind
131e0 65 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ex are:.**.**   
131f0 28 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45  (?,?,?) IN (SELE
13200 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  CT a, b, c FROM 
13210 74 31 29 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  t1).**   CREATE 
13220 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62  INDEX i1 ON t1(b
13230 2c 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74  , c, a);.**.** t
13240 68 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73 20 70  hen aiMap[] is p
13250 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 7b 32  opulated with {2
13260 2c 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e  , 0, 1}..*/.#ifn
13270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13280 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
13290 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
132a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
132b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
132c0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
132d0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 2c 20   */.  Expr *pX, 
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61   /* The right-ha
13300 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 6f 66  nd side (RHS) of
13310 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
13320 20 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c 61 67   */.  u32 inFlag
13330 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
13340 20 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f   /* IN_INDEX_LOO
13350 50 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20  P, _MEMBERSHIP, 
13360 61 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20  and/or _NOOP_OK 
13370 2a 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68 73 48  */.  int *prRhsH
13380 61 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20  asNull,         
13390 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
133a0 69 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75 73 2e  ing NULL status.
133b0 20 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f 0a 20    See notes */. 
133c0 20 69 6e 74 20 2a 61 69 4d 61 70 20 20 20 20 20   int *aiMap     
133d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
133e0 61 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e 64 65  apping from Inde
133f0 78 20 66 69 65 6c 64 73 20 74 6f 20 52 48 53 20  x fields to RHS 
13400 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 53  fields */.){.  S
13410 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20  elect *p;       
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13430 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74       /* SELECT t
13440 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49  o the right of I
13450 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
13460 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20  int eType = 0;  
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13480 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
13490 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49   RHS table. IN_I
134a0 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20  NDEX_* */.  int 
134b0 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
134c0 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  Tab++;          
134d0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74    /* Cursor of t
134e0 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a  he RHS table */.
134f0 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71    int mustBeUniq
13500 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
13510 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
13520 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75  if RHS must be u
13530 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20  nique */.  Vdbe 
13540 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
13550 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
13560 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68   /* Virtual mach
13570 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ine being coded 
13580 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58  */..  assert( pX
13590 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
135a0 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20   mustBeUnique = 
135b0 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e  (inFlags & IN_IN
135c0 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20  DEX_LOOP)!=0;.. 
135d0 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f   /* If the RHS o
135e0 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f  f this IN(...) o
135f0 70 65 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c  perator is a SEL
13600 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d  ECT, and if it m
13610 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65  atters .  ** whe
13620 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
13630 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f  SELECT result co
13640 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
13650 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65  es, check whethe
13660 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55  r.  ** or not NU
13670 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70  LL is actually p
13680 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20  ossible (it may 
13690 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d  not be, for exam
136a0 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74  ple, due .  ** t
136b0 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  o NOT NULL const
136c0 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63  raints in the sc
136d0 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c  hema). If no NUL
136e0 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73  L values are pos
136f0 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20  sible,.  ** set 
13700 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20  prRhsHasNull to 
13710 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  0 before continu
13720 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
13730 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28  rRhsHasNull && (
13740 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pX->flags & EP_x
13750 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
13760 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72   int i;.    Expr
13770 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
13780 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  X->x.pSelect->pE
13790 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
137a0 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
137b0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
137c0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
137d0 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d  anBeNull(pEList-
137e0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62  >a[i].pExpr) ) b
137f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13800 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e  if( i==pEList->n
13810 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72  Expr ){.      pr
13820 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a  RhsHasNull = 0;.
13830 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13840 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
13850 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
13860 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62  e or index can b
13870 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73  e used to.  ** s
13880 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79  atisfy the query
13890 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65  .  This is prefe
138a0 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74  rable to generat
138b0 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20  ing a new .  ** 
138c0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
138d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
138e0 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70  e->nErr==0 && (p
138f0 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f   = isCandidateFo
13900 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29  rInOpt(pX))!=0 )
13910 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
13920 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13940 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
13950 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
13960 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
13970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13980 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c    /* Table <tabl
13990 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69  e>. */.    i16 i
139a0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139c0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64    /* Database id
139d0 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  x for pTab */.  
139e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
139f0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
13a00 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
13a10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
13a20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13a30 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
13a40 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
13a50 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
13a60 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
13a70 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13a80 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
13a90 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
13aa0 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
13ab0 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
13ac0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13ad0 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
13ae0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
13af0 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
13b00 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
13b10 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
13b20 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
13b30 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f      /* Code an O
13b40 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  P_Transaction an
13b50 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66  d OP_TableLock f
13b60 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  or <table>. */. 
13b70 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
13b80 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
13b90 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
13ba0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
13bb0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
13bc0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
13bd0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
13be0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
13bf0 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
13c00 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
13c10 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a 20 73  assert(v);  /* s
13c20 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
13c30 68 61 73 20 61 6c 77 61 79 73 20 62 65 65 6e 20  has always been 
13c40 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
13c50 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 78  d */.    if( nEx
13c60 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d  pr==1 && pEList-
13c70 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[0].pExpr->iCo
13c80 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
13c90 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28 53 45  /* The "x IN (SE
13ca0 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
13cb0 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a  table)" case */.
13cc0 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
13cd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13ce0 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
13cf0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
13d00 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73  age(v);..      s
13d10 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
13d20 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
13d30 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
13d40 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79  Read);.      eTy
13d50 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
13d60 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  WID;..      sqli
13d70 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13d80 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d  v, iAddr);.    }
13d90 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
13da0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dc0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
13dd0 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  iable */.      i
13de0 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d  nt affinity_ok =
13df0 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   1;.      int i;
13e00 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
13e10 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69   that the affini
13e20 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ty that will be 
13e30 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20  used to perform 
13e40 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63  each .      ** c
13e50 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65  omparison is the
13e60 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66   same as the aff
13e70 69 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f  inity of each co
13e80 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20  lumn in table.  
13e90 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48      ** on the RH
13ea0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
13eb0 61 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74  ator.  If it not
13ec0 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
13ed0 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ible to.      **
13ee0 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f   use any index o
13ef0 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e  f the RHS table.
13f00 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69    */.      for(i
13f10 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61  =0; i<nExpr && a
13f20 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29  ffinity_ok; i++)
13f30 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
13f40 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65  pLhs = sqlite3Ve
13f50 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
13f60 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a  (pX->pLeft, i);.
13f70 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
13f80 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
13f90 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
13fa0 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
13fb0 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62  aff = sqlite3Tab
13fc0 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79  leColumnAffinity
13fd0 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20  (pTab,iCol); /* 
13fe0 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  RHS table */.   
13ff0 20 20 20 20 20 63 68 61 72 20 63 6d 70 61 66 66       char cmpaff
14000 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
14010 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20  eAffinity(pLhs, 
14020 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20  idxaff);.       
14030 20 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66   testcase( cmpaf
14040 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  f==SQLITE_AFF_BL
14050 4f 42 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  OB );.        te
14060 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d  stcase( cmpaff==
14070 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
14080 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  );.        switc
14090 68 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20  h( cmpaff ){.   
140a0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
140b0 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20  TE_AFF_BLOB:.   
140c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
140d0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
140e0 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a  QLITE_AFF_TEXT:.
140f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
14100 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
14110 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74  inity() only ret
14120 75 72 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65  urns TEXT if one
14130 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20   side or the.   
14140 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65           ** othe
14150 72 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74  r has no affinit
14160 79 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  y and the other 
14170 73 69 64 65 20 69 73 20 54 45 58 54 2e 20 20 48  side is TEXT.  H
14180 65 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ence,.          
14190 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61    ** the only wa
141a0 79 20 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20  y for cmpaff to 
141b0 62 65 20 54 45 58 54 20 69 73 20 66 6f 72 20 69  be TEXT is for i
141c0 64 78 61 66 66 20 74 6f 20 62 65 20 54 45 58 54  dxaff to be TEXT
141d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
141e0 61 6e 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d  and for the term
141f0 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
14200 68 65 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f  he IN to have no
14210 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
14220 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
14230 28 20 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45  ( idxaff==SQLITE
14240 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
14250 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14260 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
14270 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  t:.            a
14280 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c  ffinity_ok = sql
14290 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
142a0 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20  inity(idxaff);. 
142b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
142c0 0a 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 69  ..      if( affi
142d0 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20  nity_ok ){.     
142e0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
142f0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64   an existing ind
14300 65 78 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72  ex that will wor
14310 6b 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70  k for this IN op
14320 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
14330 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
14340 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26  >pIndex; pIdx &&
14350 20 65 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d   eType==0; pIdx=
14360 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
14370 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
14380 63 6f 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a  colUsed;      /*
14390 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   Columns of the 
143a0 69 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20  index used */.  
143b0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
143c0 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  mCol;         /*
143d0 20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75   Mask for the cu
143e0 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  rrent column */.
143f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
14400 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70  dx->nColumn<nExp
14410 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
14420 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
14430 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d  um nColumn is BM
14440 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20  S-2, not BMS-1, 
14450 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63  so that we can c
14460 6f 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20 20  ompute.         
14470 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70   ** BITMASK(nExp
14480 72 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66  r) without overf
14490 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  lowing */.      
144a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49      testcase( pI
144b0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53  dx->nColumn==BMS
144c0 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -2 );.          
144d0 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
144e0 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29  nColumn==BMS-1 )
144f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14500 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42  pIdx->nColumn>=B
14510 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  MS-1 ) continue;
14520 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
14530 75 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20  ustBeUnique ){. 
14540 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
14550 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78  Idx->nKeyCol>nEx
14560 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  pr.             
14570 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  ||(pIdx->nColumn
14580 3e 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e 69  >nExpr && !IsUni
14590 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a  queIndex(pIdx)).
145a0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
145b0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
145c0 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20  tinue;  /* This 
145d0 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69  index is not uni
145e0 71 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20  que over the IN 
145f0 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  RHS columns */. 
14600 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
14610 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
14620 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20        colUsed = 
14630 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  0;   /* Columns 
14640 6f 66 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f  of index used so
14650 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
14660 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
14670 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
14680 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73        Expr *pLhs
14690 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
146a0 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d  FieldSubexpr(pX-
146b0 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
146c0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52          Expr *pR
146d0 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  hs = pEList->a[i
146e0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
146f0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52       CollSeq *pR
14700 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  eq = sqlite3Bina
14710 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
14720 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70  (pParse, pLhs, p
14730 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Rhs);.          
14740 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20    int j;.  .    
14750 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14760 70 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d  pReq!=0 || pRhs-
14770 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57  >iColumn==XN_ROW
14780 49 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ID || pParse->nE
14790 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rr );.          
147a0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78    for(j=0; j<nEx
147b0 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
147c0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
147d0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70  ->aiColumn[j]!=p
147e0 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63  Rhs->iColumn ) c
147f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14800 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14810 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29  Idx->azColl[j] )
14820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14830 69 66 28 20 70 52 65 71 21 3d 30 20 26 26 20 73  if( pReq!=0 && s
14840 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 52  qlite3StrICmp(pR
14850 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  eq->zName, pIdx-
14860 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29  >azColl[j])!=0 )
14870 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
14880 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
14890 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
148a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
148b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
148c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
148d0 3d 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b  ==nExpr ) break;
148e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f  .            mCo
148f0 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a  l = MASKBIT(j);.
14900 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14910 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29  mCol & colUsed )
14920 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20   break; /* Each 
14930 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79  column used only
14940 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20   once */.       
14950 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20       colUsed |= 
14960 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  mCol;.          
14970 20 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69    if( aiMap ) ai
14980 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  Map[i] = j;.    
14990 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
149a0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
149b0 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64  nExpr || colUsed
149c0 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72  !=(MASKBIT(nExpr
149d0 29 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  )-1) );.        
149e0 20 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28    if( colUsed==(
149f0 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31  MASKBIT(nExpr)-1
14a00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
14a10 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
14a20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
14a30 20 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78   means the index
14a40 20 70 49 64 78 20 69 73 20 75 73 61 62 6c 65 20   pIdx is usable 
14a50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
14a60 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
14a70 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
14a80 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
14a90 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
14aa0 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
14ab0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
14ac0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ae0 20 20 22 55 53 49 4e 47 20 49 4e 44 45 58 20 25    "USING INDEX %
14af0 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f  s FOR IN-OPERATO
14b00 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  R",pIdx->zName))
14b10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
14b20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14b30 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
14b40 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  iTab, pIdx->tnum
14b50 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
14b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
14b70 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
14b80 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  se, pIdx);.     
14b90 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
14ba0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64  nt((v, "%s", pId
14bb0 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
14bc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14bd0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
14be0 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f  ESC == IN_INDEX_
14bf0 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20  INDEX_ASC+1 );. 
14c00 20 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65             eType
14c10 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
14c20 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53  X_ASC + pIdx->aS
14c30 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 20 20 0a  ortOrder[0];.  .
14c40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14c50 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a  prRhsHasNull ){.
14c60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
14c70 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
14c80 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 20 20  _MASK.          
14c90 20 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20 28      i64 mask = (
14ca0 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20 20  1<<nExpr)-1;.   
14cb0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14cc0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
14cd0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  (v, OP_ColumnsUs
14ce0 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed, .           
14cf0 20 20 20 20 20 20 20 69 54 61 62 2c 20 30 2c 20         iTab, 0, 
14d00 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50  0, (u8*)&mask, P
14d10 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66  4_INT64);.#endif
14d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
14d30 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b  prRhsHasNull = +
14d40 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
14d60 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20   nExpr==1 ){.   
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
14d80 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
14d90 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52  ag(v, iTab, *prR
14da0 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20  hsHasNull);.    
14db0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14dc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14de0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
14df0 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  dr);.          }
14e00 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e  .        } /* En
14e10 64 20 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65  d loop over inde
14e20 78 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f  xes */.      } /
14e30 2a 20 45 6e 64 20 69 66 28 20 61 66 66 69 6e 69  * End if( affini
14e40 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d  ty_ok ) */.    }
14e50 20 2f 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20 61   /* End if not a
14e60 6e 20 72 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f  n rowid index */
14e70 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65  .  } /* End atte
14e80 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  mpt to optimize 
14e90 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a  using an index *
14ea0 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72  /..  /* If no pr
14eb0 65 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20  eexisting index 
14ec0 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  is available for
14ed0 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20   the IN clause. 
14ee0 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58   ** and IN_INDEX
14ef0 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f  _NOOP is an allo
14f00 77 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61  wed reply.  ** a
14f10 6e 64 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  nd the RHS of th
14f20 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
14f30 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73   a list, not a s
14f40 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64  ubquery.  ** and
14f50 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20   the RHS is not 
14f60 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61 73 20  constant or has 
14f70 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72  two or fewer ter
14f80 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74  ms,.  ** then it
14f90 20 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72   is not worth cr
14fa0 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  eating an epheme
14fb0 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61  ral table to eva
14fc0 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49  luate.  ** the I
14fd0 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65  N operator so re
14fe0 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
14ff0 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OP..  */.  if( e
15000 54 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69  Type==0.   && (i
15010 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
15020 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26  X_NOOP_OK).   &&
15030 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
15040 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
15050 63 74 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69  ct).   && (!sqli
15060 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
15070 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e  nt(pX) || pX->x.
15080 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29  pList->nExpr<=2)
15090 0a 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20  .  ){.    eType 
150a0 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b  = IN_INDEX_NOOP;
150b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70  .  }..  if( eTyp
150c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  e==0 ){.    /* C
150d0 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e  ould not find an
150e0 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
150f0 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  or index to use 
15100 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65  as the RHS b-tre
15110 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c  e..    ** We wil
15120 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61  l have to genera
15130 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  te an ephemeral 
15140 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20  table to do the 
15150 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  job..    */.    
15160 75 33 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c  u32 savedNQueryL
15170 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
15180 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e  ueryLoop;.    in
15190 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  t rMayHaveNull =
151a0 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20   0;.    eType = 
151b0 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20  IN_INDEX_EPH;.  
151c0 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20    if( inFlags & 
151d0 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b  IN_INDEX_LOOP ){
151e0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
151f0 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20  QueryLoop = 0;. 
15200 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65       if( pX->pLe
15210 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26  ft->iColumn<0 &&
15220 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
15230 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
15240 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ct) ){.        e
15250 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
15260 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20  ROWID;.      }. 
15270 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52     }else if( prR
15280 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20  hsHasNull ){.   
15290 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c     *prRhsHasNull
152a0 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20   = rMayHaveNull 
152b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
152c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
152d0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
152e0 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61  (pParse, pX, rMa
152f0 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65  yHaveNull, eType
15300 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
15310 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
15320 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65  QueryLoop = save
15330 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d  dNQueryLoop;.  }
15340 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54  else{.    pX->iT
15350 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d  able = iTab;.  }
15360 0a 0a 20 20 69 66 28 20 61 69 4d 61 70 20 26 26  ..  if( aiMap &&
15370 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58   eType!=IN_INDEX
15380 5f 49 4e 44 45 58 5f 41 53 43 20 26 26 20 65 54  _INDEX_ASC && eT
15390 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype!=IN_INDEX_IN
153a0 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  DEX_DESC ){.    
153b0 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20  int i, n;.    n 
153c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
153d0 74 6f 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66  torSize(pX->pLef
153e0 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  t);.    for(i=0;
153f0 20 69 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70   i<n; i++) aiMap
15400 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72  [i] = i;.  }.  r
15410 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23  eturn eType;.}.#
15420 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
15430 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
15440 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  ERY./*.** Argume
15450 6e 74 20 70 45 78 70 72 20 69 73 20 61 6e 20 28  nt pExpr is an (
15460 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29  ?, ?...) IN(...)
15470 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69   expression. Thi
15480 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  s .** function a
15490 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74  llocates and ret
154a0 75 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69  urns a nul-termi
154b0 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e  nated string con
154c0 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
154d0 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65  affinities to be
154e0 20 75 73 65 64 20 66 6f 72 20 65 61 63 68 20 63   used for each c
154f0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d  olumn of the com
15500 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  parison..**.** I
15510 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
15520 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
15530 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20  aller to ensure 
15540 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65  that the returne
15550 64 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65  d.** string is e
15560 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
15570 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
15580 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
15590 20 63 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66   char *exprINAff
155a0 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
155b0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
155c0 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  ){.  Expr *pLeft
155d0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
155e0 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71  .  int nVal = sq
155f0 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
15600 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65  ize(pLeft);.  Se
15610 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20  lect *pSelect = 
15620 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
15630 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20  EP_xIsSelect) ? 
15640 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
15650 20 3a 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52   : 0;.  char *zR
15660 65 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  et;..  assert( p
15670 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
15680 29 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69  );.  zRet = sqli
15690 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70  te3DbMallocRaw(p
156a0 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b  Parse->db, nVal+
156b0 31 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29  1);.  if( zRet )
156c0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
156d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c   for(i=0; i<nVal
156e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
156f0 70 72 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33  pr *pA = sqlite3
15700 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
15710 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  pr(pLeft, i);.  
15720 20 20 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c      char a = sql
15730 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
15740 28 70 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20  (pA);.      if( 
15750 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
15760 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c     zRet[i] = sql
15770 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
15780 69 74 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ity(pSelect->pEL
15790 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
157a0 20 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   a);.      }else
157b0 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69  {.        zRet[i
157c0 5d 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = a;.      }. 
157d0 20 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56     }.    zRet[nV
157e0 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a  al] = '\0';.  }.
157f0 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
15800 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
15810 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
15820 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64  QUERY./*.** Load
15830 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
15840 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
15850 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77  first argument w
15860 69 74 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a  ith an error .**
15870 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20   message of the 
15880 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73  form:.**.**   "s
15890 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
158a0 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78  s N columns - ex
158b0 70 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a  pected M".*/   .
158c0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 75 62 73  void sqlite3Subs
158d0 65 6c 65 63 74 45 72 72 6f 72 28 50 61 72 73 65  electError(Parse
158e0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41   *pParse, int nA
158f0 63 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65  ctual, int nExpe
15900 63 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ct){.  const cha
15910 72 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73  r *zFmt = "sub-s
15920 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 25 64  elect returns %d
15930 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
15940 74 65 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74  ted %d";.  sqlit
15950 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15960 65 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c  e, zFmt, nActual
15970 2c 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65  , nExpect);.}.#e
15980 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72  ndif../*.** Expr
15990 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
159a0 61 20 76 65 63 74 6f 72 20 74 68 61 74 20 68 61  a vector that ha
159b0 73 20 62 65 65 6e 20 75 73 65 64 20 69 6e 20 61  s been used in a
159c0 20 63 6f 6e 74 65 78 74 20 77 68 65 72 65 0a 2a   context where.*
159d0 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 65 72 6d  * it is not perm
159e0 69 74 74 65 64 2e 20 49 66 20 70 45 78 70 72 20  itted. If pExpr 
159f0 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  is a sub-select 
15a00 76 65 63 74 6f 72 2c 20 74 68 69 73 20 72 6f 75  vector, this rou
15a10 74 69 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73 20 74  tine .** loads t
15a20 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
15a30 77 69 74 68 20 61 20 6d 65 73 73 61 67 65 20 6f  with a message o
15a40 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
15a50 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20  *   "sub-select 
15a60 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e  returns N column
15a70 73 20 2d 20 65 78 70 65 63 74 65 64 20 31 22 0a  s - expected 1".
15a80 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 74 20  **.** Or, if it 
15a90 69 73 20 61 20 72 65 67 75 6c 61 72 20 73 63 61  is a regular sca
15aa0 6c 61 72 20 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a  lar vector:.**.*
15ab0 2a 20 20 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  *   "row value m
15ac0 69 73 75 73 65 64 22 0a 2a 2f 20 20 20 0a 76 6f  isused".*/   .vo
15ad0 69 64 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72  id sqlite3Vector
15ae0 45 72 72 6f 72 4d 73 67 28 50 61 72 73 65 20 2a  ErrorMsg(Parse *
15af0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
15b00 78 70 72 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  xpr){.#ifndef SQ
15b10 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15b20 52 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  RY.  if( pExpr->
15b30 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
15b40 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
15b50 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
15b60 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  r(pParse, pExpr-
15b70 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
15b80 73 74 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20  st->nExpr, 1);. 
15b90 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
15ba0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
15bb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
15bc0 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
15bd0 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
15be0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
15bf0 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
15c00 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73  ries used as a s
15c10 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69  ubquery expressi
15c20 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f  on, EXISTS,.** o
15c30 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  r IN operators. 
15c40 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
15c50 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
15c60 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
15c70 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
15c80 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
15c90 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
15ca0 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
15cb0 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
15cc0 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
15cd0 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
15ce0 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
15cf0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
15d00 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
15d10 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
15d20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
15d30 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
15d40 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
15d50 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
15d60 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
15d70 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
15d80 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
15d90 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
15da0 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
15db0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
15dc0 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
15dd0 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
15de0 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
15df0 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
15e00 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
15e10 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
15e20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
15e30 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
15e40 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
15e50 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
15e60 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
15e70 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
15e80 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
15e90 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
15ea0 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
15eb0 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
15ec0 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
15ed0 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
15ee0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
15ef0 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
15f00 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
15f10 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
15f20 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
15f30 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
15f40 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
15f50 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
15f60 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
15f70 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
15f80 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68  NULLs..** All th
15f90 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
15fa0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  is initialize th
15fb0 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e  e register given
15fc0 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   by rMayHaveNull
15fd0 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61  .** to NULL.  Ca
15fe0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77  lling routines w
15ff0 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ill take care of
16000 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72   changing this r
16010 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65  egister.** value
16020 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20   to non-NULL if 
16030 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d  the RHS is NULL-
16040 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  free..**.** For 
16050 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
16060 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74  TS operator, ret
16070 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
16080 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a   that holds the.
16090 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20  ** result.  For 
160a0 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53  a multi-column S
160b0 45 4c 45 43 54 2c 20 74 68 65 20 72 65 73 75 6c  ELECT, the resul
160c0 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  t is stored in a
160d0 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a 20 61   contiguous.** a
160e0 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
160f0 73 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  s and the return
16100 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 72 65   value is the re
16110 67 69 73 74 65 72 20 6f 66 20 74 68 65 20 6c 65  gister of the le
16120 66 74 2d 6d 6f 73 74 0a 2a 2a 20 72 65 73 75 6c  ft-most.** resul
16130 74 20 63 6f 6c 75 6d 6e 2e 20 20 52 65 74 75 72  t column.  Retur
16140 6e 20 30 20 66 6f 72 20 49 4e 20 6f 70 65 72 61  n 0 for IN opera
16150 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72  tors or if an er
16160 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23  ror occurs..*/.#
16170 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16180 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
16190 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
161a0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
161b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
161c0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
161d0 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
161e0 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
161f0 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43  /* The IN, SELEC
16200 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  T, or EXISTS ope
16210 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  rator */.  int r
16220 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20  HasNullFlag,    
16230 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
16240 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74  hat records whet
16250 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20  her NULLs exist 
16260 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  in RHS */.  int 
16270 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20  isRowid         
16280 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
16290 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  LHS of IN operat
162a0 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f  or is a rowid */
162b0 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44  .){.  int jmpIfD
162c0 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20  ynamic = -1;    
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162e0 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
162f0 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
16300 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20  int rReg = 0;   
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
16330 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75  ter storing resu
16340 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20  lting */.  Vdbe 
16350 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
16360 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
16370 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
16380 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
16390 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
163a0 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  h(pParse);..  /*
163b0 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   The evaluation 
163c0 6f 66 20 74 68 65 20 49 4e 2f 45 58 49 53 54 53  of the IN/EXISTS
163d0 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  /SELECT must be 
163e0 72 65 70 65 61 74 65 64 20 65 76 65 72 79 20 74  repeated every t
163f0 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 65  ime it.  ** is e
16400 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 61 6e  ncountered if an
16410 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
16420 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
16430 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
16440 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
16450 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
16460 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
16470 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
16480 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
16490 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
164a0 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
164b0 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
164c0 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
164d0 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
164e0 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
164f0 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
16500 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
16510 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
16520 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
16530 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
16540 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
16550 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
16560 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
16570 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
16580 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16590 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
165a0 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e 61  ){.    jmpIfDyna
165b0 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mic = sqlite3Vdb
165c0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
165d0 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
165e0 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  e(v);.  }..  swi
165f0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
16600 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
16610 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
16620 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
16630 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
16640 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   of OP_OpenEphem
16650 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
16660 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
16670 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
16680 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53  Left; /* the LHS
16690 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
166a0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79  tor */.      Key
166b0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
166c0 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20   0;      /* Key 
166d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
166e0 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20       int nVal;  
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16700 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74   /* Size of vect
16710 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20 20 20  or pLeft */.    
16720 20 20 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d 20    .      nVal = 
16730 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
16740 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
16750 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
16760 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20  owid || nVal==1 
16770 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
16780 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
16790 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
167a0 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
167b0 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
167c0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
167d0 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
167e0 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65   same way.  An e
167f0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
16800 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c  s .      ** fill
16810 65 64 20 77 69 74 68 20 69 6e 64 65 78 20 6b 65  ed with index ke
16820 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
16830 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
16840 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 53   the .      ** S
16850 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
16860 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
16870 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
16880 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
16890 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
168a0 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
168b0 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
168c0 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
168d0 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
168e0 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
168f0 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
16900 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
16910 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
16920 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
16930 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
16940 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
16950 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
16960 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
16970 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
16980 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
16990 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
169a0 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
169b0 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
169c0 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
169d0 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
169e0 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
169f0 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
16a00 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
16a10 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a  affinity.      *
16a20 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
16a30 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
16a40 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
16a50 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
16a60 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
16a70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
16a80 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20  penEphemeral, . 
16a90 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
16aa0 69 54 61 62 6c 65 2c 20 28 69 73 52 6f 77 69 64  iTable, (isRowid
16ab0 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20 20  ?0:nVal));.     
16ac0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f   pKeyInfo = isRo
16ad0 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  wid ? 0 : sqlite
16ae0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
16af0 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20  arse->db, nVal, 
16b00 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45  1);..      if( E
16b10 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16b20 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
16b30 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ct) ){.        /
16b40 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
16b50 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
16b60 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
16b70 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
16b80 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
16b90 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
16ba0 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
16bb0 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
16bc0 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
16bd0 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
16be0 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
16bf0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c    */.        Sel
16c00 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70  ect *pSelect = p
16c10 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
16c20 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
16c30 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  t *pEList = pSel
16c40 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  ect->pEList;..  
16c50 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
16c60 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
16c70 31 2c 20 22 25 73 4c 49 53 54 20 53 55 42 51 55  1, "%sLIST SUBQU
16c80 45 52 59 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ERY",.          
16c90 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d    jmpIfDynamic>=
16ca0 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44  0?"":"CORRELATED
16cb0 20 22 0a 20 20 20 20 20 20 20 20 29 29 3b 0a 20   ".        ));. 
16cc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
16cd0 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  isRowid );.     
16ce0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53     /* If the LHS
16cf0 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20   and RHS of the 
16d00 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e  IN operator do n
16d10 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20  ot match, that. 
16d20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20         ** error 
16d30 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63  will have been c
16d40 61 75 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72  aught long befor
16d50 65 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  e we reach this 
16d60 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  point. */.      
16d70 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 4c    if( ALWAYS(pEL
16d80 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c  ist->nExpr==nVal
16d90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  ) ){.          S
16da0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
16db0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
16dc0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16dd0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
16de0 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c  (&dest, SRT_Set,
16df0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
16e00 0a 20 20 20 20 20 20 20 20 20 20 64 65 73 74 2e  .          dest.
16e10 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70 72 49  zAffSdst = exprI
16e20 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  NAffinity(pParse
16e30 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
16e40 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69      pSelect->iLi
16e50 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
16e60 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65     testcase( pSe
16e70 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
16e80 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a   SF_Distinct );.
16e90 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
16ea0 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  se( pKeyInfo==0 
16eb0 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20  ); /* Caused by 
16ec0 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65  OOM in sqlite3Ke
16ed0 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a  yInfoAlloc() */.
16ee0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
16ef0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
16f00 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
16f10 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  st) ){.         
16f20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16f30 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73  (pParse->db, des
16f40 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20  t.zAffSdst);.   
16f50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16f60 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
16f70 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  yInfo);.        
16f80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16f90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16fa0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16fb0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65  e(pParse->db, de
16fc0 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20  st.zAffSdst);.  
16fd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16fe0 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f  pKeyInfo!=0 ); /
16ff0 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65  * OOM will cause
17000 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c 69   exit after sqli
17010 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20  te3Select() */. 
17020 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17030 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
17040 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17050 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
17060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
17070 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
17080 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
17090 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
170a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
170b0 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
170c0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
170d0 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
170e0 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65  FieldSubexpr(pLe
170f0 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
17100 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
17110 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
17120 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
17130 6c 53 65 71 28 0a 20 20 20 20 20 20 20 20 20 20  lSeq(.          
17140 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c        pParse, p,
17150 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
17160 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  xpr.            
17170 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
17180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17190 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
171a0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
171b0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0) ){.        /*
171c0 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
171d0 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
171e0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
171f0 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65     ** For each e
17200 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64  xpression, build
17210 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72   an index key fr
17220 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  om the evaluatio
17230 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
17240 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
17250 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
17260 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
17270 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
17280 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  e.        ** tha
17290 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
172a0 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
172b0 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
172c0 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
172d0 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d        ** a colum
172e0 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61  n, use numeric a
172f0 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20  ffinity..       
17300 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
17310 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
17320 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
17330 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20  y of the LHS of 
17340 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  the IN */.      
17350 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
17360 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
17370 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
17380 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  t;.        struc
17390 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
173a0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20  *pItem;.        
173b0 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
173c0 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
173d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
173e0 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20  finity(pLeft);. 
173f0 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69         if( !affi
17400 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
17410 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c    affinity = SQL
17420 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
17430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17440 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
17450 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17460 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
17470 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
17480 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
17490 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
174a0 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[0] = sqlite3E
174b0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
174c0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
174d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
174e0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
174f0 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
17500 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
17510 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  t>. */.        r
17520 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
17530 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
17540 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
17550 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
17560 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
17570 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c  f( isRowid ) sql
17580 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17590 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 32  , OP_Blob, 0, r2
175a0 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53 54 41 54  , 0, "", P4_STAT
175b0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  IC);.        for
175c0 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  (i=pList->nExpr,
175d0 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
175e0 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
175f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
17600 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d  xpr *pE2 = pItem
17610 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
17620 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73     int iValToIns
17630 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
17640 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
17650 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  n is not constan
17660 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  t then we will n
17670 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
17680 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20   ** disable the 
17690 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65  test that was ge
176a0 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68  nerated above th
176b0 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20  at makes sure.  
176c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
176d0 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
176e0 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
176f0 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
17700 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  tant.          *
17710 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20  * expression we 
17720 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68  need to rerun th
17730 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d  is code each tim
17740 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
17750 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d            if( jm
17760 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26  pIfDynamic>=0 &&
17770 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
17780 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
17790 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
177a0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
177b0 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  oop(v, jmpIfDyna
177c0 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mic);.          
177d0 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d    jmpIfDynamic =
177e0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
177f0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
17800 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
17810 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
17820 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
17830 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
17840 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
17850 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  d && sqlite3Expr
17860 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26  IsInteger(pE2, &
17870 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20  iValToIns) ){.  
17880 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17890 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
178a0 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78  P_InsertInt, pEx
178b0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
178c0 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20  iValToIns);.    
178d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
178e0 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71           r3 = sq
178f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
17900 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c  get(pParse, pE2,
17910 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
17920 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b    if( isRowid ){
17930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
17940 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17950 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
17960 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
17970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17980 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17990 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
179a0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
179b0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
179c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
179d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
179e0 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
179f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
17a00 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  r2, r3);.       
17a10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17a20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17a30 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
17a40 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
17a50 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
17a60 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
17a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17a80 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
17a90 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c  ange(pParse, r3,
17aa0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
17ab0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17ac0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
17ad0 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e  xInsert, pExpr->
17ae0 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 2c 20  iTable, r2, r3, 
17af0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
17b00 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
17b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17b20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17b30 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
17b40 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17b50 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
17b60 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
17b70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
17b80 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
17b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
17ba0 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
17bb0 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66   (void *)pKeyInf
17bc0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
17bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
17be0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
17bf0 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
17c00 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
17c10 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  CT:.    default:
17c20 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65   {.      /* Case
17c30 20 33 3a 20 20 20 20 28 53 45 4c 45 43 54 20 2e   3:    (SELECT .
17c40 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20  .. FROM ...).   
17c50 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20 20 20     **     or:   
17c60 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 2e   EXISTS(SELECT .
17c70 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20  .. FROM ...).   
17c80 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
17c90 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e  or a SELECT, gen
17ca0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
17cb0 74 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72  t the values for
17cc0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   all columns of.
17cd0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72        ** the fir
17ce0 73 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61  st row into an a
17cf0 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
17d00 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  s and return the
17d10 20 69 6e 64 65 78 20 6f 66 0a 20 20 20 20 20 20   index of.      
17d20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67  ** the first reg
17d30 69 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  ister..      **.
17d40 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
17d50 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77   is an EXISTS, w
17d60 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20  rite an integer 
17d70 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f  0 (not exists) o
17d80 72 20 31 20 28 65 78 69 73 74 73 29 0a 20 20 20  r 1 (exists).   
17d90 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67     ** into a reg
17da0 69 73 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e  ister and return
17db0 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e   that register n
17dc0 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  umber..      **.
17dd0 20 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f 74 68        ** In both
17de0 20 63 61 73 65 73 2c 20 74 68 65 20 71 75 65 72   cases, the quer
17df0 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20 77  y is augmented w
17e00 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20 20  ith "LIMIT 1".  
17e10 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20 70 72  Any .      ** pr
17e20 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20  eexisting limit 
17e30 69 73 20 64 69 73 63 61 72 64 65 64 20 69 6e 20  is discarded in 
17e40 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77  place of the new
17e50 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20 20 20   LIMIT 1..      
17e60 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
17e70 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20  *pSel;          
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17e90 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
17ea0 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a  nt to encode */.
17eb0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
17ec0 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20   dest;          
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
17ee0 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ow to deal with 
17ef0 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a 2f  SELECT result */
17f00 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65 67 3b  .      int nReg;
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17f30 52 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  Registers to all
17f40 6f 63 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 45  ocate */.      E
17f50 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f70 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c 69 6d 69       /* New limi
17f80 74 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  t expression */.
17f90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17fa0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
17fb0 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
17fc0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
17fd0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
17fe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17ff0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
18000 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  STS || pExpr->op
18010 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
18020 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
18030 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
18040 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
18050 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c  ) );..      pSel
18060 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
18070 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 6c 61  ect;.      Expla
18080 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
18090 72 73 65 2c 20 31 2c 20 22 25 73 53 43 41 4c 41  rse, 1, "%sSCALA
180a0 52 20 53 55 42 51 55 45 52 59 22 2c 0a 20 20 20  R SUBQUERY",.   
180b0 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79           jmpIfDy
180c0 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52  namic>=0?"":"COR
180d0 52 45 4c 41 54 45 44 20 22 29 29 3b 0a 20 20 20  RELATED "));.   
180e0 20 20 20 6e 52 65 67 20 3d 20 70 45 78 70 72 2d     nReg = pExpr-
180f0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f  >op==TK_SELECT ?
18100 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSel->pEList->n
18110 45 78 70 72 20 3a 20 31 3b 0a 20 20 20 20 20 20  Expr : 1;.      
18120 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
18130 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20  tInit(&dest, 0, 
18140 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b  pParse->nMem+1);
18150 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
18160 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Mem += nReg;.   
18170 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
18180 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
18190 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73         dest.eDes
181a0 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20  t = SRT_Mem;.   
181b0 20 20 20 20 20 64 65 73 74 2e 69 53 64 73 74 20       dest.iSdst 
181c0 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
181d0 20 20 20 20 20 20 20 20 64 65 73 74 2e 6e 53 64          dest.nSd
181e0 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20  st = nReg;.     
181f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18200 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
18210 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d   0, dest.iSDParm
18220 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e  , dest.iSDParm+n
18230 52 65 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Reg-1);.        
18240 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
18250 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72  "Init subquery r
18260 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
18270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64  }else{.        d
18280 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
18290 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20  Exists;.        
182a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
182b0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
182c0 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d   0, dest.iSDParm
182d0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
182e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74  omment((v, "Init
182f0 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29   EXISTS result")
18300 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18310 20 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65   pLimit = sqlite
18320 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
18330 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  e->db, TK_INTEGE
18340 52 2c 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  R,&sqlite3IntTok
18350 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  ens[1], 0);.    
18360 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 4c 69 6d    if( pSel->pLim
18370 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  it ){.        sq
18380 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
18390 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c  pParse->db, pSel
183a0 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 29  ->pLimit->pLeft)
183b0 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e  ;.        pSel->
183c0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 3d 20  pLimit->pLeft = 
183d0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 65  pLimit;.      }e
183e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 65  lse{.        pSe
183f0 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
18400 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
18410 20 54 4b 5f 4c 49 4d 49 54 2c 20 70 4c 69 6d 69   TK_LIMIT, pLimi
18420 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
18430 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69       pSel->iLimi
18440 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
18450 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
18460 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65  Parse, pSel, &de
18470 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  st) ){.        r
18480 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
18490 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20 64 65  .      rReg = de
184a0 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
184b0 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
184c0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
184d0 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
184e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
184f0 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c  ..  if( rHasNull
18500 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Flag ){.    sqli
18510 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
18520 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  g(v, pExpr->iTab
18530 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  le, rHasNullFlag
18540 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d  );.  }..  if( jm
18550 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b  pIfDynamic>=0 ){
18560 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18570 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49  JumpHere(v, jmpI
18580 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20  fDynamic);.  }. 
18590 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
185a0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a 20  ePop(pParse);.. 
185b0 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a   return rReg;.}.
185c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
185d0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
185e0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
185f0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
18600 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69  /*.** Expr pIn i
18610 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70  s an IN(...) exp
18620 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75  ression. This fu
18630 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68  nction checks th
18640 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73  at the .** sub-s
18650 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53  elect on the RHS
18660 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65   of the IN() ope
18670 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73 61  rator has the sa
18680 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  me number of .**
18690 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20   columns as the 
186a0 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48  vector on the LH
186b0 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48  S. Or, if the RH
186c0 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73  S of the IN() is
186d0 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71   not .** a sub-q
186e0 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c  uery, that the L
186f0 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f  HS is a vector o
18700 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74  f size 1..*/.int
18710 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
18720 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73  kIN(Parse *pPars
18730 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  e, Expr *pIn){. 
18740 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73   int nVector = s
18750 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
18760 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29  Size(pIn->pLeft)
18770 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c  ;.  if( (pIn->fl
18780 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
18790 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ct) ){.    if( n
187a0 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70  Vector!=pIn->x.p
187b0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
187c0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73  nExpr ){.      s
187d0 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
187e0 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49 6e  rror(pParse, pIn
187f0 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
18800 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63  ist->nExpr, nVec
18810 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tor);.      retu
18820 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 1;.    }.  }e
18830 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72 21  lse if( nVector!
18840 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
18850 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
18860 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65  pParse, pIn->pLe
18870 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ft);.    return 
18880 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
18890 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
188a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
188b0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
188c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
188d0 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69  r an IN expressi
188e0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  on..**.**      x
188f0 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
18900 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76  .**      x IN (v
18910 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
18920 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ).**.** The left
18930 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29  -hand side (LHS)
18940 20 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72 20   is a scalar or 
18950 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f  vector expressio
18960 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67 68  n.  The .** righ
18970 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53  t-hand side (RHS
18980 29 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  ) is an array of
18990 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63   zero or more sc
189a0 61 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72 20  alar values, or 
189b0 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20 20  a.** subquery.  
189c0 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20  If the RHS is a 
189d0 73 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e 75  subquery, the nu
189e0 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
189f0 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d  olumns must.** m
18a00 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
18a10 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
18a20 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20  e vector on the 
18a30 4c 48 53 2e 20 20 49 66 20 74 68 65 20 52 48 53  LHS.  If the RHS
18a40 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66   is.** a list of
18a50 20 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48 53   values, the LHS
18a60 20 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c 61   must be a scala
18a70 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e  r. .**.** The IN
18a80 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72 75   operator is tru
18a90 65 20 69 66 20 74 68 65 20 4c 48 53 20 76 61 6c  e if the LHS val
18aa0 75 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ue is contained 
18ab0 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 0a  within the RHS..
18ac0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
18ad0 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48   false if the LH
18ae0 53 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20  S is definitely 
18af0 6e 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e 20  not in the RHS. 
18b00 20 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20   The .** result 
18b10 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  is NULL if the p
18b20 72 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20 4c  resence of the L
18b30 48 53 20 69 6e 20 74 68 65 20 52 48 53 20 63 61  HS in the RHS ca
18b40 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74 65  nnot be .** dete
18b50 72 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e 55  rmined due to NU
18b60 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  LLs..**.** This 
18b70 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
18b80 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70  s code that jump
18b90 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65  s to destIfFalse
18ba0 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
18bb0 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64  ot .** contained
18bc0 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
18bd0 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c    If due to NULL
18be0 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  s we cannot dete
18bf0 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53  rmine if the LHS
18c00 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  .** is contained
18c10 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
18c20 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e   jump to destIfN
18c30 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53  ull.  If the LHS
18c40 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a   is contained.**
18c50 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
18c60 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
18c70 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65  h..**.** See the
18c80 20 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70 65   separate in-ope
18c90 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e  rator.md documen
18ca0 74 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74  tation file in t
18cb0 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20  he canonical.** 
18cc0 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72  SQLite source tr
18cd0 65 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ee for additiona
18ce0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
18cf0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
18d00 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
18d10 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
18d20 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
18d30 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
18d40 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
18d50 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
18d60 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
18d70 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  e IN expression 
18d80 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46  */.  int destIfF
18d90 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75  alse,      /* Ju
18da0 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69  mp here if LHS i
18db0 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
18dc0 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  in the RHS */.  
18dd0 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20  int destIfNull  
18de0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
18df0 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  re if the result
18e00 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75  s are unknown du
18e10 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b  e to NULLs */.){
18e20 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75  .  int rRhsHasNu
18e30 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69  ll = 0;  /* Regi
18e40 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75  ster that is tru
18e50 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e  e if RHS contain
18e60 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f  s NULL values */
18e70 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
18e80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
18e90 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   of the RHS */. 
18ea0 20 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20 20   int rLhs;      
18eb0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
18ec0 65 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74 68  er(s) holding th
18ed0 65 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a  e LHS values */.
18ee0 20 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20    int rLhsOrig; 
18ef0 20 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 76          /* LHS v
18f00 61 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20 72  alues prior to r
18f10 65 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69 4d  eordering by aiM
18f20 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ap[] */.  Vdbe *
18f30 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
18f40 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64  /* Statement und
18f50 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
18f60 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20  */.  int *aiMap 
18f70 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  = 0;       /* Ma
18f80 70 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69  p from vector fi
18f90 65 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c  eld to index col
18fa0 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  umn */.  char *z
18fb0 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Aff = 0;       /
18fc0 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * Affinity strin
18fd0 67 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e  g for comparison
18fe0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74  s */.  int nVect
18ff0 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or;          /* 
19000 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20  Size of vectors 
19010 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72  for this IN oper
19020 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44  ator */.  int iD
19030 75 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20 20  ummy;           
19040 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65 74  /* Dummy paramet
19050 65 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56 65  er to exprCodeVe
19060 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70 72  ctor() */.  Expr
19070 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
19080 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
19090 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
190a0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
190b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
190c0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
190d0 69 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20 20  int destStep2;  
190e0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
190f0 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c  o jump when NULL
19100 73 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20 32  s seen in step 2
19110 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74   */.  int destSt
19120 65 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53  ep6 = 0;    /* S
19130 74 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f 72  tart of code for
19140 20 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74   Step 6 */.  int
19150 20 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20 20   addrTruthOp;   
19160 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
19170 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65 74   opcode that det
19180 65 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20 69  ermines the IN i
19190 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  s true */.  int 
191a0 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20  destNotNull;    
191b0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
191c0 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  f a comparison i
191d0 73 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73 74  s not true in st
191e0 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ep 6 */.  int ad
191f0 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
19200 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73 74  /* Top of the st
19210 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20  ep-6 loop */ .. 
19220 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
19230 70 4c 65 66 74 3b 0a 20 20 69 66 28 20 73 71 6c  pLeft;.  if( sql
19240 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28  ite3ExprCheckIN(
19250 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 20 29  pParse, pExpr) )
19260 20 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20   return;.  zAff 
19270 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79  = exprINAffinity
19280 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
19290 0a 20 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c  .  nVector = sql
192a0 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
192b0 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ze(pExpr->pLeft)
192c0 3b 0a 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74  ;.  aiMap = (int
192d0 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
192e0 63 5a 65 72 6f 28 0a 20 20 20 20 20 20 70 50 61  cZero(.      pPa
192f0 72 73 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72  rse->db, nVector
19300 2a 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20  *(sizeof(int) + 
19310 73 69 7a 65 6f 66 28 63 68 61 72 29 29 20 2b 20  sizeof(char)) + 
19320 31 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 50 61  1.  );.  if( pPa
19330 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
19340 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 71 6c  ailed ) goto sql
19350 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f  ite3ExprCodeIN_o
19360 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  om_error;..  /* 
19370 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75  Attempt to compu
19380 74 65 20 74 68 65 20 52 48 53 2e 20 41 66 74 65  te the RHS. Afte
19390 72 20 74 68 69 73 20 73 74 65 70 2c 20 69 66 20  r this step, if 
193a0 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
193b0 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45  han.  ** IN_INDE
193c0 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e  X_NOOP is return
193d0 65 64 2c 20 74 68 65 20 74 61 62 6c 65 20 6f 70  ed, the table op
193e0 65 6e 65 64 20 69 74 68 20 63 75 72 73 6f 72 20  ened ith cursor 
193f0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20  pExpr->iTable . 
19400 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
19410 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
19420 65 20 75 70 20 74 68 65 20 52 48 53 2e 20 49 66  e up the RHS. If
19430 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
19440 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a  s returned,.  **
19450 20 74 68 65 20 52 48 53 20 68 61 73 20 6e 6f 74   the RHS has not
19460 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 2e   yet been coded.
19470 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73    */.  v = pPars
19480 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
19490 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
194a0 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65    /* OOM detecte
194b0 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  d prior to this 
194c0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62  routine */.  Vdb
194d0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
194e0 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22   "begin IN expr"
194f0 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71  ));.  eType = sq
19500 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
19510 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a  (pParse, pExpr,.
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f               IN_
19540 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
19550 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   | IN_INDEX_NOOP
19560 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _OK,.           
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64    destIfFalse==d
19590 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20  estIfNull ? 0 : 
195a0 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69  &rRhsHasNull, ai
195b0 4d 61 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  Map);..  assert(
195c0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
195d0 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65   nVector==1 || e
195e0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45  Type==IN_INDEX_E
195f0 50 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  PH.       || eTy
19600 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
19610 45 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65 3d  EX_ASC || eType=
19620 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
19630 44 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64 65  DESC .  );.#ifde
19640 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
19650 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61 74   /* Confirm that
19660 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e   aiMap[] contain
19670 73 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67 65  s nVector intege
19680 72 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  r values between
19690 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63   0 and.  ** nVec
196a0 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28  tor-1. */.  for(
196b0 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
196c0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c  i++){.    int j,
196d0 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e   cnt;.    for(cn
196e0 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72  t=j=0; j<nVector
196f0 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61 70  ; j++) if( aiMap
19700 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a  [j]==i ) cnt++;.
19710 20 20 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d      assert( cnt=
19720 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  =1 );.  }.#endif
19730 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20  ..  /* Code the 
19740 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20  LHS, the <expr> 
19750 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20  from "<expr> IN 
19760 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20 4c  (...)". If the L
19770 48 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76 65  HS is a .  ** ve
19780 63 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69 73  ctor, then it is
19790 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72   stored in an ar
197a0 72 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20 72  ray of nVector r
197b0 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
197c0 67 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20  g .  ** at r1.. 
197d0 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   **.  ** sqlite3
197e0 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d 69  FindInIndex() mi
197f0 67 68 74 20 68 61 76 65 20 72 65 6f 72 64 65 72  ght have reorder
19800 65 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66  ed the fields of
19810 20 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72 0a   the LHS vector.
19820 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65    ** so that the
19830 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20 74   fields are in t
19840 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73  he same order as
19850 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64   an existing ind
19860 65 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20 61  ex.   The.  ** a
19870 69 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e  iMap[] array con
19880 74 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67 20  tains a mapping 
19890 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
198a0 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64 65  l LHS field orde
198b0 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69  r to.  ** the fi
198c0 65 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20 6d  eld order that m
198d0 61 74 63 68 65 73 20 74 68 65 20 52 48 53 20 69  atches the RHS i
198e0 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndex..  */.  sql
198f0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
19900 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72 4c 68  h(pParse);.  rLh
19910 73 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64 65  sOrig = exprCode
19920 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 70  Vector(pParse, p
19930 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a  Left, &iDummy);.
19940 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
19950 63 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69 5d  ctor && aiMap[i]
19960 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41  ==i; i++){} /* A
19970 72 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72 65  re LHS fields re
19980 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66  ordered? */.  if
19990 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a  ( i==nVector ){.
199a0 20 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64      /* LHS field
199b0 73 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64 65  s are not reorde
199c0 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20  red */.    rLhs 
199d0 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65  = rLhsOrig;.  }e
199e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  lse{.    /* Need
199f0 20 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65 20   to reorder the 
19a00 4c 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f 72  LHS fields accor
19a10 64 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f  ding to aiMap */
19a20 0a 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c 69  .    rLhs = sqli
19a30 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
19a40 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 29  pParse, nVector)
19a50 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19a60 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
19a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19a80 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
19a90 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20  py, rLhsOrig+i, 
19aa0 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30  rLhs+aiMap[i], 0
19ab0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
19ac0 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e  /* If sqlite3Fin
19ad0 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e  dInIndex() did n
19ae0 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  ot find or creat
19af0 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  e an index that 
19b00 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  is.  ** suitable
19b10 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
19b20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
19b30 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75   then evaluate u
19b40 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75  sing a.  ** sequ
19b50 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
19b60 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ons..  **.  ** T
19b70 68 69 73 20 69 73 20 73 74 65 70 20 28 31 29 20  his is step (1) 
19b80 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61 74  in the in-operat
19b90 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20  or.md optimized 
19ba0 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a  algorithm..  */.
19bb0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
19bc0 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20  INDEX_NOOP ){.  
19bd0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
19be0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
19bf0 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  st;.    CollSeq 
19c00 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
19c10 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
19c20 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
19c30 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c  );.    int label
19c40 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Ok = sqlite3Vdbe
19c50 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
19c60 20 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46    int r2, regToF
19c70 72 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  ree;.    int reg
19c80 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  CkNull = 0;.    
19c90 69 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65  int ii;.    asse
19ca0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
19cb0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
19cc0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
19cd0 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21   if( destIfNull!
19ce0 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
19cf0 20 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20        regCkNull 
19d00 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
19d10 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
19d20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19d30 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e  dOp3(v, OP_BitAn
19d40 64 2c 20 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72  d, rLhs, rLhs, r
19d50 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  egCkNull);.    }
19d60 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
19d70 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
19d80 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20  ii++){.      r2 
19d90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
19da0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
19db0 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  ist->a[ii].pExpr
19dc0 2c 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20  , &regToFree);. 
19dd0 20 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75       if( regCkNu
19de0 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ll && sqlite3Exp
19df0 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74  rCanBeNull(pList
19e00 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29  ->a[ii].pExpr) )
19e10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19e20 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19e30 50 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e  P_BitAnd, regCkN
19e40 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75  ull, r2, regCkNu
19e50 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
19e60 20 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d     if( ii<pList-
19e70 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74  >nExpr-1 || dest
19e80 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61  IfNull!=destIfFa
19e90 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lse ){.        s
19ea0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19eb0 28 76 2c 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c  (v, OP_Eq, rLhs,
19ec0 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20   labelOk, r2,.  
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ee0 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
19ef0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
19f00 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
19f10 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c  overageIf(v, ii<
19f20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b  pList->nExpr-1);
19f30 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
19f40 65 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70  erageIf(v, ii==p
19f50 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  List->nExpr-1);.
19f60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19f70 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a  dbeChangeP5(v, z
19f80 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  Aff[0]);.      }
19f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
19fa0 73 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c  sert( destIfNull
19fb0 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b  ==destIfFalse );
19fc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19fd0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
19fe0 5f 4e 65 2c 20 72 4c 68 73 2c 20 64 65 73 74 49  _Ne, rLhs, destI
19ff0 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20  fFalse, r2,.    
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
1a020 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
1a030 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a040 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a050 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1a060 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54   zAff[0] | SQLIT
1a070 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1a080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1a090 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1a0a0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f  eg(pParse, regTo
1a0b0 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Free);.    }.   
1a0c0 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29   if( regCkNull )
1a0d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1a0e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a0f0 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c  IsNull, regCkNul
1a100 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20  l, destIfNull); 
1a110 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a130 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66  beGoto(v, destIf
1a140 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  False);.    }.  
1a150 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1a160 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1a170 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  elOk);.    sqlit
1a180 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1a190 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75  (pParse, regCkNu
1a1a0 6c 6c 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71  ll);.    goto sq
1a1b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f  lite3ExprCodeIN_
1a1c0 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20  finished;.  }.. 
1a1d0 20 2f 2a 20 53 74 65 70 20 32 3a 20 43 68 65 63   /* Step 2: Chec
1a1e0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1a1f0 4c 48 53 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  LHS contains any
1a200 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20   NULL columns.  
1a210 49 66 20 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20  If the.  ** LHS 
1a220 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  does contain NUL
1a230 4c 73 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  Ls then the resu
1a240 6c 74 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  lt must be eithe
1a250 72 20 46 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e  r FALSE or NULL.
1a260 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68  .  ** We will th
1a270 65 6e 20 73 6b 69 70 20 74 68 65 20 62 69 6e 61  en skip the bina
1a280 72 79 20 73 65 61 72 63 68 20 6f 66 20 74 68 65  ry search of the
1a290 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   RHS..  */.  if(
1a2a0 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
1a2b0 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
1a2c0 64 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74  destStep2 = dest
1a2d0 49 66 46 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65  IfFalse;.  }else
1a2e0 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32 20  {.    destStep2 
1a2f0 3d 20 64 65 73 74 53 74 65 70 36 20 3d 20 73 71  = destStep6 = sq
1a300 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1a310 65 6c 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  el(v);.  }.  for
1a320 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1a330 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
1a340 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  *p = sqlite3Vect
1a350 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
1a360 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b  Expr->pLeft, i);
1a370 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1a380 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29  ExprCanBeNull(p)
1a390 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a3a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a3b0 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69  P_IsNull, rLhs+i
1a3c0 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20  , destStep2);.  
1a3d0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a3e0 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  (v);.    }.  }..
1a3f0 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68    /* Step 3.  Th
1a400 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f  e LHS is now kno
1a410 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c  wn to be non-NUL
1a420 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72  L.  Do the binar
1a430 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66  y search.  ** of
1a440 20 74 68 65 20 52 48 53 20 75 73 69 6e 67 20 74   the RHS using t
1a450 68 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62  he LHS as a prob
1a460 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68  e.  If found, th
1a470 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a  e result is.  **
1a480 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   true..  */.  if
1a490 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
1a4a0 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f  X_ROWID ){.    /
1a4b0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
1a4c0 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52  the RHS is the R
1a4d0 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d  OWID of table b-
1a4e0 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61  tree and so we a
1a4f0 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20  lso.    ** know 
1a500 74 68 61 74 20 74 68 65 20 52 48 53 20 69 73 20  that the RHS is 
1a510 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65  non-NULL.  Hence
1a520 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65  , we combine ste
1a530 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a  ps 3 and 4.    *
1a540 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  * into a single 
1a550 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73  opcode. */.    s
1a560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a570 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  (v, OP_SeekRowid
1a580 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1a590 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 4c   destIfFalse, rL
1a5a0 68 73 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  hs);.    VdbeCov
1a5b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64  erage(v);.    ad
1a5c0 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69  drTruthOp = sqli
1a5d0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
1a5e0 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52   OP_Goto);  /* R
1a5f0 65 74 75 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20  eturn True */.  
1a600 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1a610 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1a620 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 4c 68  OP_Affinity, rLh
1a630 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a  s, nVector, 0, z
1a640 41 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  Aff, nVector);. 
1a650 20 20 20 69 66 28 20 64 65 73 74 49 66 46 61 6c     if( destIfFal
1a660 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29  se==destIfNull )
1a670 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69  {.      /* Combi
1a680 6e 65 20 53 74 65 70 20 33 20 61 6e 64 20 53 74  ne Step 3 and St
1a690 65 70 20 35 20 69 6e 74 6f 20 61 20 73 69 6e 67  ep 5 into a sing
1a6a0 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  le opcode */.   
1a6b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a6c0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
1a6d0 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  tFound, pExpr->i
1a6e0 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
1a6f0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1a710 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56  Lhs, nVector); V
1a720 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a730 20 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74        goto sqlit
1a740 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1a750 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ished;.    }.   
1a760 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65   /* Ordinary Ste
1a770 70 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73  p 3, for the cas
1a780 65 20 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e  e where FALSE an
1a790 64 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69  d NULL are disti
1a7a0 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54  nct */.    addrT
1a7b0 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33  ruthOp = sqlite3
1a7c0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1a7d0 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
1a7e0 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20  ->iTable, 0,.   
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a810 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72     rLhs, nVector
1a820 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a830 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  v);.  }..  /* St
1a840 65 70 20 34 2e 20 20 49 66 20 74 68 65 20 52 48  ep 4.  If the RH
1a850 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65  S is known to be
1a860 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65   non-NULL and we
1a870 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20   did not find.  
1a880 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74  ** an match on t
1a890 68 65 20 73 65 61 72 63 68 20 61 62 6f 76 65 2c  he search above,
1a8a0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1a8b0 20 6d 75 73 74 20 62 65 20 46 41 4c 53 45 2e 0a   must be FALSE..
1a8c0 20 20 2a 2f 0a 20 20 69 66 28 20 72 52 68 73 48    */.  if( rRhsH
1a8d0 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f  asNull && nVecto
1a8e0 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==1 ){.    sqli
1a8f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a900 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68   OP_NotNull, rRh
1a910 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66  sHasNull, destIf
1a920 46 61 6c 73 65 29 3b 0a 20 20 20 20 56 64 62 65  False);.    Vdbe
1a930 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
1a940 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35 2e 20 20  ..  /* Step 5.  
1a950 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  If we do not car
1a960 65 20 61 62 6f 75 74 20 74 68 65 20 64 69 66 66  e about the diff
1a970 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 4e  erence between N
1a980 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c  ULL and.  ** FAL
1a990 53 45 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  SE, then just re
1a9a0 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a  turn false. .  *
1a9b0 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 46 61  /.  if( destIfFa
1a9c0 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
1a9d0 29 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74  ) sqlite3VdbeGot
1a9e0 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  o(v, destIfFalse
1a9f0 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a  );..  /* Step 6:
1aa00 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 72 6f   Loop through ro
1aa10 77 73 20 6f 66 20 74 68 65 20 52 48 53 2e 20 20  ws of the RHS.  
1aa20 43 6f 6d 70 61 72 65 20 65 61 63 68 20 72 6f 77  Compare each row
1aa30 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a   to the LHS..  *
1aa40 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70 61 72 69  * If any compari
1aa50 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  son is NULL, the
1aa60 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
1aa70 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20  NULL.  If all.  
1aa80 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61  ** comparisons a
1aa90 72 65 20 46 41 4c 53 45 20 74 68 65 6e 20 74 68  re FALSE then th
1aaa0 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 69  e final result i
1aab0 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20  s FALSE..  **.  
1aac0 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c 61 72 20  ** For a scalar 
1aad0 4c 48 53 2c 20 69 74 20 69 73 20 73 75 66 66 69  LHS, it is suffi
1aae0 63 69 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a  cient to check j
1aaf0 75 73 74 20 74 68 65 20 66 69 72 73 74 20 72 6f  ust the first ro
1ab00 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48  w.  ** of the RH
1ab10 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
1ab20 73 74 53 74 65 70 36 20 29 20 73 71 6c 69 74 65  stStep6 ) sqlite
1ab30 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1ab40 6c 28 76 2c 20 64 65 73 74 53 74 65 70 36 29 3b  l(v, destStep6);
1ab50 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
1ab60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ab70 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78  , OP_Rewind, pEx
1ab80 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
1ab90 49 66 46 61 6c 73 65 29 3b 0a 20 20 56 64 62 65  IfFalse);.  Vdbe
1aba0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69  Coverage(v);.  i
1abb0 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a  f( nVector>1 ){.
1abc0 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20      destNotNull 
1abd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1abe0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c  eLabel(v);.  }el
1abf0 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e  se{.    /* For n
1ac00 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69  Vector==1, combi
1ac10 6e 65 20 73 74 65 70 73 20 36 20 61 6e 64 20 37  ne steps 6 and 7
1ac20 20 62 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   by immediately 
1ac30 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a  returning.    **
1ac40 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 66 69   FALSE if the fi
1ac50 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  rst comparison i
1ac60 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20  s not NULL */.  
1ac70 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20    destNotNull = 
1ac80 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d  destIfFalse;.  }
1ac90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
1aca0 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
1acb0 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f   Expr *p;.    Co
1acc0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
1acd0 20 20 69 6e 74 20 72 33 20 3d 20 73 71 6c 69 74    int r3 = sqlit
1ace0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1acf0 72 73 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71  rse);.    p = sq
1ad00 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
1ad10 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
1ad20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  );.    pColl = s
1ad30 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1ad40 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
1ad50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ad60 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1ad70 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1ad80 20 69 2c 20 72 33 29 3b 0a 20 20 20 20 73 71 6c   i, r3);.    sql
1ad90 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1ada0 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c  , OP_Ne, rLhs+i,
1adb0 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33   destNotNull, r3
1adc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1add0 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1ade0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
1adf0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1ae00 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1ae10 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1ae20 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20  g(pParse, r3);. 
1ae30 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1ae40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1ae50 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c  o, 0, destIfNull
1ae60 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72  );.  if( nVector
1ae70 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >1 ){.    sqlite
1ae80 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1ae90 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  l(v, destNotNull
1aea0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1aeb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1aec0 65 78 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ext, pExpr->iTab
1aed0 6c 65 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a  le, addrTop+1);.
1aee0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1aef0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65  (v);..    /* Ste
1af00 70 20 37 3a 20 20 49 66 20 77 65 20 72 65 61 63  p 7:  If we reac
1af10 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  h this point, we
1af20 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72   know that the r
1af30 65 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a  esult must.    *
1af40 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20  * be false. */. 
1af50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1af60 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1af70 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29   0, destIfFalse)
1af80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
1af90 73 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20  s here in order 
1afa0 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20  to return true. 
1afb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1afc0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1afd0 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74  TruthOp);..sqlit
1afe0 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1aff0 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68  ished:.  if( rLh
1b000 73 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71  s!=rLhsOrig ) sq
1b010 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1b020 52 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73  Reg(pParse, rLhs
1b030 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1b040 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
1b050 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
1b060 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72  (v, "end IN expr
1b070 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72  "));.sqlite3Expr
1b080 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72  CodeIN_oom_error
1b090 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
1b0a0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69  e(pParse->db, ai
1b0b0 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Map);.  sqlite3D
1b0c0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
1b0d0 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69  , zAff);.}.#endi
1b0e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1b0f0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
1b100 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b110 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1b120 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1b130 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
1b140 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
1b150 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
1b160 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
1b170 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
1b180 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
1b190 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
1b1a0 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
1b1b0 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
1b1c0 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
1b1d0 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
1b1e0 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
1b1f0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
1b200 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
1b210 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
1b220 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
1b230 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
1b240 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1b250 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
1b260 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
1b270 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c  *z, int negateFl
1b280 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
1b290 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30   if( ALWAYS(z!=0
1b2a0 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
1b2b0 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  value;.    sqlit
1b2c0 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65  e3AtoF(z, &value
1b2d0 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
1b2e0 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
1b2f0 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  8);.    assert( 
1b300 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61  !sqlite3IsNaN(va
1b310 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e  lue) ); /* The n
1b320 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65  ew AtoF never re
1b330 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20  turns NaN */.   
1b340 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20   if( negateFlag 
1b350 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
1b360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b370 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
1b380 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
1b390 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c   0, (u8*)&value,
1b3a0 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d   P4_REAL);.  }.}
1b3b0 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1b3c0 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
1b3d0 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
1b3e0 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
1b3f0 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
1b400 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
1b410 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
1b420 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75  em..**.** Expr.u
1b430 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79  .zToken is alway
1b440 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d  s UTF8 and zero-
1b450 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73  terminated..*/.s
1b460 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
1b470 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50  nteger(Parse *pP
1b480 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1b490 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20  r, int negFlag, 
1b4a0 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62  int iMem){.  Vdb
1b4b0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1b4c0 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70  Vdbe;.  if( pExp
1b4d0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
1b4e0 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
1b4f0 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
1b500 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72  Value;.    asser
1b510 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  t( i>=0 );.    i
1b520 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d  f( negFlag ) i =
1b530 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -i;.    sqlite3
1b540 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b550 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65  _Integer, i, iMe
1b560 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
1b570 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20   int c;.    i64 
1b580 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74  value;.    const
1b590 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72   char *z = pExpr
1b5a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1b5b0 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
1b5c0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44      c = sqlite3D
1b5d0 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20  ecOrHexToI64(z, 
1b5e0 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28  &value);.    if(
1b5f0 20 28 63 3d 3d 33 20 26 26 20 21 6e 65 67 46 6c   (c==3 && !negFl
1b600 61 67 29 20 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c  ag) || (c==2) ||
1b610 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76 61 6c   (negFlag && val
1b620 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  ue==SMALLEST_INT
1b630 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  64)){.#ifdef SQL
1b640 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1b650 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71  G_POINT.      sq
1b660 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b670 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64  arse, "oversized
1b680 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c   integer: %s%s",
1b690 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a   negFlag ? "-" :
1b6a0 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23   "", z);.#else.#
1b6b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b6c0 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20  IT_HEX_INTEGER. 
1b6d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1b6e0 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22  _strnicmp(z,"0x"
1b6f0 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,2)==0 ){.      
1b700 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1b710 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c  g(pParse, "hex l
1b720 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20  iteral too big: 
1b730 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22  %s%s", negFlag?"
1b740 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20  -":"",z);.      
1b750 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
1b760 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64     {.        cod
1b770 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46  eReal(v, z, negF
1b780 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  lag, iMem);.    
1b790 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1b7a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
1b7b0 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65  negFlag ){ value
1b7c0 20 3d 20 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45   = c==3 ? SMALLE
1b7d0 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75  ST_INT64 : -valu
1b7e0 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74  e; }.      sqlit
1b7f0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1b800 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
1b810 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26   iMem, 0, (u8*)&
1b820 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29  value, P4_INT64)
1b830 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1b840 2a 0a 2a 2a 20 45 72 61 73 65 20 63 6f 6c 75 6d  *.** Erase colum
1b850 6e 2d 63 61 63 68 65 20 65 6e 74 72 79 20 6e 75  n-cache entry nu
1b860 6d 62 65 72 20 69 0a 2a 2f 0a 73 74 61 74 69 63  mber i.*/.static
1b870 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72 79   void cacheEntry
1b880 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61  Clear(Parse *pPa
1b890 72 73 65 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69  rse, int i){.  i
1b8a0 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  f( pParse->aColC
1b8b0 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67 20  ache[i].tempReg 
1b8c0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
1b8d0 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
1b8e0 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
1b8f0 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20  empReg) ){.     
1b900 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
1b910 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
1b920 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65 2d 3e  eg++] = pParse->
1b930 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65  aColCache[i].iRe
1b940 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  g;.    }.  }.  p
1b950 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1b960 2d 2d 3b 0a 20 20 69 66 28 20 69 3c 70 50 61 72  --;.  if( i<pPar
1b970 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b  se->nColCache ){
1b980 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f  .    pParse->aCo
1b990 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70 50 61 72  lCache[i] = pPar
1b9a0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 70 50  se->aColCache[pP
1b9b0 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d  arse->nColCache]
1b9c0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
1b9d0 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f  Record in the co
1b9e0 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20  lumn cache that 
1b9f0 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c  a particular col
1ba00 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61  umn from a.** pa
1ba10 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69  rticular table i
1ba20 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61  s stored in a pa
1ba30 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
1ba40 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
1ba50 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1ba60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ba70 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43  int iTab, int iC
1ba80 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  ol, int iReg){. 
1ba90 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69   int i;.  int mi
1baa0 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c  nLru;.  int idxL
1bab0 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f  ru;.  struct yCo
1bac0 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a  lCache *p;..  /*
1bad0 20 55 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f 72   Unless an error
1bae0 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 72   has occurred, r
1baf0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
1bb00 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69 74  are always posit
1bb10 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ive. */.  assert
1bb20 28 20 69 52 65 67 3e 30 20 7c 7c 20 70 50 61 72  ( iReg>0 || pPar
1bb30 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72  se->nErr || pPar
1bb40 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1bb50 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74  iled );.  assert
1bb60 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43  ( iCol>=-1 && iC
1bb70 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20  ol<32768 );  /* 
1bb80 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75  Finite column nu
1bb90 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54  mbers */..  /* T
1bba0 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  he SQLITE_Column
1bbb0 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61 62  Cache flag disab
1bbc0 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  les the column c
1bbd0 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20 75  ache.  This is u
1bbe0 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73  sed.  ** for tes
1bbf0 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76  ting only - to v
1bc00 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69 74  erify that SQLit
1bc10 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74 68  e always gets th
1bc20 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
1bc30 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74 68  ** with and with
1bc40 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  out the column c
1bc50 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ache..  */.  if(
1bc60 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
1bc70 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
1bc80 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43  , SQLITE_ColumnC
1bc90 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a  ache) ) return;.
1bca0 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c  .  /* First repl
1bcb0 61 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ace any existing
1bcc0 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   entry..  **.  *
1bcd0 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
1bce0 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  way the column c
1bcf0 61 63 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c  ache is currentl
1bd00 79 20 75 73 65 64 2c 20 77 65 20 61 72 65 20 67  y used, we are g
1bd10 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74  uaranteed.  ** t
1bd20 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77  hat the object w
1bd30 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64  ill never alread
1bd40 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20  y be in cache.  
1bd50 56 65 72 69 66 79 20 74 68 69 73 20 67 75 61 72  Verify this guar
1bd60 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e  antee..  */.#ifn
1bd70 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72  def NDEBUG.  for
1bd80 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1bd90 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61  aColCache; i<pPa
1bda0 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
1bdb0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61  i++, p++){.    a
1bdc0 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65  ssert( p->iTable
1bdd0 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f  !=iTab || p->iCo
1bde0 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20  lumn!=iCol );.  
1bdf0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
1be00 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 43 4f   SQLITE_DEBUG_CO
1be10 4c 55 4d 4e 43 41 43 48 45 0a 20 20 2f 2a 20 41  LUMNCACHE.  /* A
1be20 64 64 20 61 20 53 65 74 54 61 62 43 6f 6c 20 6f  dd a SetTabCol o
1be30 70 63 6f 64 65 20 66 6f 72 20 72 75 6e 2d 74 69  pcode for run-ti
1be40 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  me verification 
1be50 74 68 61 74 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  that the column.
1be60 20 20 2a 2a 20 63 61 63 68 65 20 69 73 20 77 6f    ** cache is wo
1be70 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c 79 2e  rking correctly.
1be80 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1be90 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
1bea0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 65 74 54  ->pVdbe, OP_SetT
1beb0 61 62 43 6f 6c 2c 20 69 54 61 62 2c 20 69 43 6f  abCol, iTab, iCo
1bec0 6c 2c 20 69 52 65 67 29 3b 0a 23 65 6e 64 69 66  l, iReg);.#endif
1bed0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
1bee0 63 68 65 20 69 73 20 61 6c 72 65 61 64 79 20 66  che is already f
1bef0 75 6c 6c 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ull, delete the 
1bf00 6c 65 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75  least recently u
1bf10 73 65 64 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  sed entry */.  i
1bf20 66 28 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  f( pParse->nColC
1bf30 61 63 68 65 3e 3d 53 51 4c 49 54 45 5f 4e 5f 43  ache>=SQLITE_N_C
1bf40 4f 4c 43 41 43 48 45 20 29 7b 0a 20 20 20 20 6d  OLCACHE ){.    m
1bf50 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66  inLru = 0x7fffff
1bf60 66 66 3b 0a 20 20 20 20 69 64 78 4c 72 75 20 3d  ff;.    idxLru =
1bf70 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   -1;.    for(i=0
1bf80 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1bf90 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
1bfa0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
1bfb0 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
1bfc0 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29   p->lru<minLru )
1bfd0 7b 0a 20 20 20 20 20 20 20 20 69 64 78 4c 72 75  {.        idxLru
1bfe0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 6d 69   = i;.        mi
1bff0 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20  nLru = p->lru;. 
1c000 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c010 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
1c020 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b  olCache[idxLru];
1c030 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
1c040 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  = &pParse->aColC
1c050 61 63 68 65 5b 70 50 61 72 73 65 2d 3e 6e 43 6f  ache[pParse->nCo
1c060 6c 43 61 63 68 65 2b 2b 5d 3b 0a 20 20 7d 0a 0a  lCache++];.  }..
1c070 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
1c080 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 65 6e   entry to the en
1c090 64 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 2a  d of the cache *
1c0a0 2f 0a 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20  /.  p->iLevel = 
1c0b0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c0c0 76 65 6c 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65  vel;.  p->iTable
1c0d0 20 3d 20 69 54 61 62 3b 0a 20 20 70 2d 3e 69 43   = iTab;.  p->iC
1c0e0 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
1c0f0 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
1c100 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
1c110 3b 0a 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61  ;.  p->lru = pPa
1c120 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
1c130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  ;.}../*.** Indic
1c140 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65  ate that registe
1c150 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e  rs between iReg.
1c160 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65  .iReg+nReg-1 are
1c170 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
1c180 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  en..** Purge the
1c190 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
1c1a0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ers from the col
1c1b0 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f  umn cache..*/.vo
1c1c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
1c1d0 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20  cheRemove(Parse 
1c1e0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
1c1f0 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
1c200 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69  int i = 0;.  whi
1c210 6c 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  le( i<pParse->nC
1c220 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20 20 73  olCache ){.    s
1c230 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
1c240 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43  *p = &pParse->aC
1c250 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20  olCache[i];.    
1c260 69 66 28 20 70 2d 3e 69 52 65 67 20 3e 3d 20 69  if( p->iReg >= i
1c270 52 65 67 20 26 26 20 70 2d 3e 69 52 65 67 20 3c  Reg && p->iReg <
1c280 20 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20   iReg+nReg ){.  
1c290 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
1c2a0 65 61 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ear(pParse, i);.
1c2b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c2c0 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   i++;.    }.  }.
1c2d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
1c2e0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
1c2f0 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65  lumn cache conte
1c300 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74  xt.  Any new ent
1c310 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64  ries added.** ad
1c320 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  ded to the colum
1c330 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  n cache after th
1c340 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f  is call are remo
1c350 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ved when the.** 
1c360 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
1c370 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  p occurs..*/.voi
1c380 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1c390 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  hePush(Parse *pP
1c3a0 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
1c3b0 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a  >iCacheLevel++;.
1c3c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1c3d0 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
1c3e0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1c3f0 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1c400 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
1c410 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22  f("PUSH to %d\n"
1c420 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
1c430 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
1c440 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
1c450 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  ve from the colu
1c460 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74  mn cache any ent
1c470 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61  ries that were a
1c480 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a  dded since the.*
1c490 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  * the previous s
1c4a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1c4b0 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ush operation.  
1c4c0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1c4d0 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63  restore.** the c
1c4e0 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74  ache to the stat
1c4f0 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f  e it was in prio
1c500 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
1c510 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20  t Push..*/.void 
1c520 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c530 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
1c540 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  e){.  int i = 0;
1c550 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1c560 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d  e->iCacheLevel>=
1c570 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  1 );.  pParse->i
1c580 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69  CacheLevel--;.#i
1c590 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1c5a0 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
1c5b0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1c5c0 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1c5d0 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
1c5e0 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20  "POP  to %d\n", 
1c5f0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c600 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
1c610 0a 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72  .  while( i<pPar
1c620 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b  se->nColCache ){
1c630 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1c640 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 4c  >aColCache[i].iL
1c650 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61  evel>pParse->iCa
1c660 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  cheLevel ){.    
1c670 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
1c680 72 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20  r(pParse, i);.  
1c690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1c6a0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
1c6b0 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61  ./*.** When a ca
1c6c0 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72  ched column is r
1c6d0 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65  eused, make sure
1c6e0 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74   that its regist
1c6f0 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67  er is.** no long
1c700 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20  er available as 
1c710 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e  a temp register.
1c720 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20    ticket #3879: 
1c730 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65   that same.** re
1c740 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20  gister might be 
1c750 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20  in the cache in 
1c760 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c  multiple places,
1c770 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a   so be sure to.*
1c780 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a  * get them all..
1c790 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1c7a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1c7b0 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65  inRegister(Parse
1c7c0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1c7d0 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
1c7e0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1c7f0 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
1c800 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1c810 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  che; i<pParse->n
1c820 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70  ColCache; i++, p
1c830 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
1c840 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
1c850 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
1c860 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
1c870 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  ./* Generate cod
1c880 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64  e that will load
1c890 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72   into register r
1c8a0 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68  egOut a value th
1c8b0 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72  at is.** appropr
1c8c0 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64  iate for the iId
1c8d0 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  xCol-th column o
1c8e0 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f  f index pIdx..*/
1c8f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1c900 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f  rCodeLoadIndexCo
1c910 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
1c920 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70  Parse,  /* The p
1c930 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1c940 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
1c950 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
1c960 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73   whose column is
1c970 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f   to be loaded */
1c980 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
1c990 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1c9a0 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  nting to a table
1c9b0 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49   row */.  int iI
1c9c0 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65  dxCol,    /* The
1c9d0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
1c9e0 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65  ndex to be loade
1c9f0 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  d */.  int regOu
1ca00 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  t      /* Store 
1ca10 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
1ca20 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
1ca30 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1ca40 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49  i16 iTabCol = pI
1ca50 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64  dx->aiColumn[iId
1ca60 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61  xCol];.  if( iTa
1ca70 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b  bCol==XN_EXPR ){
1ca80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
1ca90 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20  x->aColExpr );. 
1caa0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1cab0 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72  >aColExpr->nExpr
1cac0 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20  >iIdxCol );.    
1cad0 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1cae0 20 3d 20 69 54 61 62 43 75 72 20 2b 20 31 3b 0a   = iTabCur + 1;.
1caf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1cb00 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20  odeCopy(pParse, 
1cb10 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1cb20 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72  a[iIdxCol].pExpr
1cb30 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 70  , regOut);.    p
1cb40 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1cb50 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1cb60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1cb70 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1cb80 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
1cb90 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69   pIdx->pTable, i
1cba0 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20  TabCur,.        
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
1cbd0 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1cbe0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1cbf0 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72  ate code to extr
1cc00 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  act the value of
1cc10 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
1cc20 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  umn of a table..
1cc30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1cc40 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1cc50 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20  OfTable(.  Vdbe 
1cc60 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *v,        /* Th
1cc70 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
1cc80 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  struction */.  T
1cc90 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f  able *pTab,    /
1cca0 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * The table cont
1ccb0 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
1ccc0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
1ccd0 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  r,    /* The tab
1cce0 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74  le cursor.  Or t
1ccf0 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72  he PK cursor for
1cd00 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a   WITHOUT ROWID *
1cd10 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
1cd20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1cd30 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78  the column to ex
1cd40 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  tract */.  int r
1cd50 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78  egOut      /* Ex
1cd60 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
1cd70 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74  into this regist
1cd80 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  er */.){.  if( p
1cd90 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Tab==0 ){.    sq
1cda0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cdb0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
1cdc0 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67  abCur, iCol, reg
1cdd0 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
1cde0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
1cdf0 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62  <0 || iCol==pTab
1ce00 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73  ->iPKey ){.    s
1ce10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ce20 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
1ce30 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a  abCur, regOut);.
1ce40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1ce50 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28   op = IsVirtual(
1ce60 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75  pTab) ? OP_VColu
1ce70 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a  mn : OP_Column;.
1ce80 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c      int x = iCol
1ce90 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  ;.    if( !HasRo
1cea0 77 69 64 28 70 54 61 62 29 20 26 26 20 21 49 73  wid(pTab) && !Is
1ceb0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
1cec0 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74  .      x = sqlit
1ced0 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1cee0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
1cef0 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43  yIndex(pTab), iC
1cf00 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ol);.    }.    s
1cf10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1cf20 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c  (v, op, iTabCur,
1cf30 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d   x, regOut);.  }
1cf40 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29  .  if( iCol>=0 )
1cf50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  {.    sqlite3Col
1cf60 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
1cf70 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ab, iCol, regOut
1cf80 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1cf90 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1cfa0 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
1cfb0 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
1cfc0 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
1cfd0 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
1cfe0 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
1cff0 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65  lue in a registe
1d000 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66  r. .**.** An eff
1d010 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 73  ort is made to s
1d020 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
1d030 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
1d040 72 20 69 52 65 67 2e 20 20 54 68 69 73 0a 2a 2a  r iReg.  This.**
1d050 20 69 73 20 6e 6f 74 20 67 61 72 61 6e 74 65 65   is not garantee
1d060 65 64 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e  ed for GetColumn
1d070 28 29 20 2d 20 74 68 65 20 72 65 73 75 6c 74 20  () - the result 
1d080 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e  can be stored in
1d090 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73 74 65 72  .** any register
1d0a0 2e 20 20 42 75 74 20 74 68 65 20 72 65 73 75 6c  .  But the resul
1d0b0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
1d0c0 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67 69 73  to land in regis
1d0d0 74 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72 20  ter iReg.** for 
1d0e0 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 29  GetColumnToReg()
1d0f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
1d100 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75  st be an open cu
1d110 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20  rsor to pTab in 
1d120 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73  iTable when this
1d130 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
1d140 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75  alled.  If iColu
1d150 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69  mn<0 then code i
1d160 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74  s generated that
1d170 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f   extracts the ro
1d180 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  wid..*/.int sqli
1d190 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1d1a0 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
1d1b0 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
1d1c0 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
1d1d0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
1d1e0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1d1f0 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
1d200 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
1d210 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  e we are reading
1d220 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1d230 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49  Column,     /* I
1d240 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
1d250 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  e column */.  in
1d260 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f  t iTable,      /
1d270 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
1d280 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62  nting to the tab
1d290 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
1d2a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ,        /* Stor
1d2b0 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
1d2c0 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20  /.  u8 p5       
1d2d0 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65       /* P5 value
1d2e0 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b   for OP_Column +
1d2f0 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56   FLAGS */.){.  V
1d300 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1d310 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
1d320 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1d330 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69  che *p;..  for(i
1d340 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
1d350 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
1d360 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
1d370 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
1d380 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62   p->iTable==iTab
1d390 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  le && p->iColumn
1d3a0 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
1d3b0 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
1d3c0 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
1d3d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1d3e0 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
1d3f0 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52  er(pParse, p->iR
1d400 65 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  eg);.#ifdef SQLI
1d410 54 45 5f 44 45 42 55 47 5f 43 4f 4c 55 4d 4e 43  TE_DEBUG_COLUMNC
1d420 41 43 48 45 0a 20 20 20 20 20 20 73 71 6c 69 74  ACHE.      sqlit
1d430 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1d440 4f 50 5f 56 65 72 69 66 79 54 61 62 43 6f 6c 2c  OP_VerifyTabCol,
1d450 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
1d460 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 23 65 6e 64  , p->iReg);.#end
1d470 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  if.      return 
1d480 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
1d490 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76   }  .  assert( v
1d4a0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
1d4b0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1d4c0 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
1d4d0 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
1d4e0 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20  n, iReg);.  if( 
1d4f0 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p5 ){.    sqlite
1d500 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1d510 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20   p5);.  }else{  
1d520 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70   .    sqlite3Exp
1d530 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
1d540 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  se, iTable, iCol
1d550 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a  umn, iReg);.  }.
1d560 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
1d570 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1d580 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f  rCodeGetColumnTo
1d590 52 65 67 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Reg(.  Parse *pP
1d5a0 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
1d5b0 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
1d5c0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
1d5d0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1d5e0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1d5f0 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
1d600 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
1d610 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
1d620 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
1d630 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
1d640 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
1d650 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
1d660 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
1d670 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
1d680 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20  e */.  int iReg 
1d690 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
1d6a0 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
1d6b0 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  .){.  int r1 = s
1d6c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1d6d0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
1d6e0 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  pTab, iColumn, i
1d6f0 54 61 62 6c 65 2c 20 69 52 65 67 2c 20 30 29 3b  Table, iReg, 0);
1d700 0a 20 20 69 66 28 20 72 31 21 3d 69 52 65 67 20  .  if( r1!=iReg 
1d710 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
1d720 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
1d730 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  e, OP_SCopy, r1,
1d740 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   iReg);.}.../*.*
1d750 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75  * Clear all colu
1d760 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73  mn cache entries
1d770 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d780 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
1d790 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1d7a0 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66    int i;..#ifdef
1d7b0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1d7c0 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
1d7d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
1d7e0 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
1d7f0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45  .    printf("CLE
1d800 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64  AR\n");.  }.#end
1d810 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  if.  for(i=0; i<
1d820 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1d830 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  e; i++){.    if(
1d840 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
1d850 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67 0a 20 20  he[i].tempReg.  
1d860 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54     && pParse->nT
1d870 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
1d880 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
1d890 67 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  g).    ){.      
1d8a0 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
1d8b0 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
1d8c0 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65 2d 3e  eg++] = pParse->
1d8d0 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65  aColCache[i].iRe
1d8e0 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  g;.    }.  }.  p
1d8f0 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1d900 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
1d910 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
1d920 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20  hat an affinity 
1d930 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72  change has occur
1d940 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a  red on iCount.**
1d950 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
1d960 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74 2e  ing with iStart.
1d970 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d980 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1d990 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70  yChange(Parse *p
1d9a0 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72  Parse, int iStar
1d9b0 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a  t, int iCount){.
1d9c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1d9d0 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
1d9e0 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29   iStart, iCount)
1d9f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1da00 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65  ate code to move
1da10 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65   content from re
1da20 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e  gisters iFrom...
1da30 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20  iFrom+nReg-1.** 
1da40 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f  over to iTo..iTo
1da50 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68  +nReg-1. Keep th
1da60 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75  e column cache u
1da70 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f  p-to-date..*/.vo
1da80 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1da90 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  deMove(Parse *pP
1daa0 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
1dab0 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52   int iTo, int nR
1dac0 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  eg){.  assert( i
1dad0 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c  From>=iTo+nReg |
1dae0 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54  | iFrom+nReg<=iT
1daf0 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  o );.  sqlite3Vd
1db00 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d  beAddOp3(pParse-
1db10 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c  >pVdbe, OP_Move,
1db20 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65   iFrom, iTo, nRe
1db30 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  g);.  sqlite3Exp
1db40 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
1db50 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65 67  rse, iFrom, nReg
1db60 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  );.}..#if define
1db70 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1db80 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1db90 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29  E_COVERAGE_TEST)
1dba0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1dbb0 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74  ue if any regist
1dbc0 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20  er in the range 
1dbd0 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c  iFrom..iTo (incl
1dbe0 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65  usive).** is use
1dbf0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
1dc00 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
1dc10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1dc20 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  e is used within
1dc30 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74 65   assert() and te
1dc40 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20  stcase() macros 
1dc50 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  only.** and does
1dc60 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61   not appear in a
1dc70 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a   normal build..*
1dc80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65  /.static int use
1dc90 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50  dAsColumnCache(P
1dca0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1dcb0 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
1dcc0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
1dcd0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1dce0 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
1dcf0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1dd00 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e; i<pParse->nCo
1dd10 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b  lCache; i++, p++
1dd20 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70  ){.    int r = p
1dd30 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
1dd40 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69  r>=iFrom && r<=i
1dd50 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20  To ) return 1;  
1dd60 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
1dd70 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1dd80 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1dd90 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45  _DEBUG || SQLITE
1dda0 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a  _COVERAGE_TEST *
1ddb0 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  /.../*.** Conver
1ddc0 74 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  t a scalar expre
1ddd0 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20  ssion node to a 
1dde0 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66 65  TK_REGISTER refe
1ddf0 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73  rencing.** regis
1de00 74 65 72 20 69 52 65 67 2e 20 20 54 68 65 20 63  ter iReg.  The c
1de10 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
1de20 65 20 74 68 61 74 20 69 52 65 67 20 61 6c 72 65  e that iReg alre
1de30 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ady contains.** 
1de40 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
1de50 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
1de60 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
1de70 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73  void exprToRegis
1de80 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ter(Expr *p, int
1de90 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32   iReg){.  p->op2
1dea0 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f   = p->op;.  p->o
1deb0 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
1dec0 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69  .  p->iTable = i
1ded0 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72  Reg;.  ExprClear
1dee0 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
1def0 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  kip);.}../*.** E
1df00 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
1df10 73 73 69 6f 6e 20 28 65 69 74 68 65 72 20 61 20  ssion (either a 
1df20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61 6c  vector or a scal
1df30 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29 20 61  ar expression) a
1df40 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20  nd store.** the 
1df50 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e  result in contin
1df60 67 75 6f 75 73 20 74 65 6d 70 6f 72 61 72 79 20  guous temporary 
1df70 72 65 67 69 73 74 65 72 73 2e 20 20 52 65 74 75  registers.  Retu
1df80 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
1df90 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67  ** the first reg
1dfa0 69 73 74 65 72 20 75 73 65 64 20 74 6f 20 73 74  ister used to st
1dfb0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  ore the result..
1dfc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74  **.** If the ret
1dfd0 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67  urned result reg
1dfe0 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f  ister is a tempo
1dff0 72 61 72 79 20 73 63 61 6c 61 72 2c 20 74 68 65  rary scalar, the
1e000 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20  n also write.** 
1e010 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75  that register nu
1e020 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69 46 72 65  mber into *piFre
1e030 65 61 62 6c 65 2e 20 20 49 66 20 74 68 65 20 72  eable.  If the r
1e040 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72  eturned result r
1e050 65 67 69 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f  egister.** is no
1e060 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  t a temporary or
1e070 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1e080 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72 20 73  on is a vector s
1e090 65 74 20 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a  et *piFreeable.*
1e0a0 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  * to 0..*/.stati
1e0b0 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 56 65  c int exprCodeVe
1e0c0 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ctor(Parse *pPar
1e0d0 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  se, Expr *p, int
1e0e0 20 2a 70 69 46 72 65 65 61 62 6c 65 29 7b 0a 20   *piFreeable){. 
1e0f0 20 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a 20 20   int iResult;.  
1e100 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20 73 71  int nResult = sq
1e110 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
1e120 69 7a 65 28 70 29 3b 0a 20 20 69 66 28 20 6e 52  ize(p);.  if( nR
1e130 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20  esult==1 ){.    
1e140 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  iResult = sqlite
1e150 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e160 61 72 73 65 2c 20 70 2c 20 70 69 46 72 65 65 61  arse, p, piFreea
1e170 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
1e180 20 20 20 2a 70 69 46 72 65 65 61 62 6c 65 20 3d     *piFreeable =
1e190 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f   0;.    if( p->o
1e1a0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
1e1b0 23 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  #if SQLITE_OMIT_
1e1c0 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 69  SUBQUERY.      i
1e1d0 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23 65 6c 73  Result = 0;.#els
1e1e0 65 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  e.      iResult 
1e1f0 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
1e200 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
1e210 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
1e220 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e230 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 52   int i;.      iR
1e240 65 73 75 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e  esult = pParse->
1e250 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50  nMem+1;.      pP
1e260 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
1e270 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72  esult;.      for
1e280 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b  (i=0; i<nResult;
1e290 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
1e2a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61  qlite3ExprCodeFa
1e2b0 63 74 6f 72 61 62 6c 65 28 70 50 61 72 73 65 2c  ctorable(pParse,
1e2c0 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69   p->x.pList->a[i
1e2d0 5d 2e 70 45 78 70 72 2c 20 69 2b 69 52 65 73 75  ].pExpr, i+iResu
1e2e0 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lt);.      }.   
1e2f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1e300 69 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  iResult;.}.../*.
1e310 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1e320 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
1e330 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61  t Vdbe to evalua
1e340 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  te the given.** 
1e350 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74  expression.  Att
1e360 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68  empt to store th
1e370 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  e results in reg
1e380 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a  ister "target"..
1e390 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
1e3a0 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73  gister where res
1e3b0 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e  ults are stored.
1e3c0 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73  .**.** With this
1e3d0 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20   routine, there 
1e3e0 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20  is no guarantee 
1e3f0 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c  that results wil
1e400 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69  l.** be stored i
1e410 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  n target.  The r
1e420 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73  esult might be s
1e430 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74  tored in some ot
1e440 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  her.** register 
1e450 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69  if it is conveni
1e460 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54  ent to do so.  T
1e470 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1e480 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63  ion.** must chec
1e490 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  k the return cod
1e4a0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72  e and move the r
1e4b0 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65  esults to the de
1e4c0 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65  sired.** registe
1e4d0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
1e4e0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1e4f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1e500 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1e510 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
1e520 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1e530 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75  be;  /* The VM u
1e540 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1e550 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  n */.  int op;  
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e570 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62   /* The opcode b
1e580 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
1e590 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67  int inReg = targ
1e5a0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  et;       /* Res
1e5b0 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72  ults stored in r
1e5c0 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f  egister inReg */
1e5d0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1e5e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
1e5f0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
1e600 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
1e610 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
1e620 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20  t regFree2 = 0; 
1e630 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
1e640 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
1e650 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
1e660 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c  ter */.  int r1,
1e670 20 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20   r2;            
1e680 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65     /* Various re
1e690 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a  gister numbers *
1e6a0 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20  /.  Expr tempX; 
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e6c0 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65   Temporary expre
1e6d0 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20  ssion node */.  
1e6e0 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61  int p5 = 0;..  a
1e6f0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
1e700 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
1e710 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
1e720 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73   v==0 ){.    ass
1e730 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
1e740 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1e750 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1e760 20 7d 0a 0a 65 78 70 72 5f 63 6f 64 65 5f 64 6f   }..expr_code_do
1e770 6f 76 65 72 3a 0a 20 20 69 66 28 20 70 45 78 70  over:.  if( pExp
1e780 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d  r==0 ){.    op =
1e790 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73   TK_NULL;.  }els
1e7a0 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70  e{.    op = pExp
1e7b0 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69  r->op;.  }.  swi
1e7c0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1e7d0 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
1e7e0 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
1e7f0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
1e800 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
1e810 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
1e820 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
1e830 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
1e840 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20  [pExpr->iAgg];. 
1e850 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e       if( !pAggIn
1e860 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29  fo->directMode )
1e870 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1e880 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29  ( pCol->iMem>0 )
1e890 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1e8a0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
1e8b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67     }else if( pAg
1e8c0 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e  gInfo->useSortin
1e8d0 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  gIdx ){.        
1e8e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e8f0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1e900 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e  pAggInfo->sortin
1e910 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20  gIdxPTab,.      
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 70 43 6f 6c 2d 3e 69 53          pCol->iS
1e940 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72  orterColumn, tar
1e950 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  get);.        re
1e960 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1e970 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74     }.      /* Ot
1e980 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
1e990 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43  ru into the TK_C
1e9a0 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20  OLUMN case */.  
1e9b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e9c0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1e9d0 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70 72  int iTab = pExpr
1e9e0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
1e9f0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1ea00 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 69  rty(pExpr, EP_Fi
1ea10 78 65 64 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  xedCol) ){.     
1ea20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
1ea30 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
1ea40 20 67 6f 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f   goto expr_code_
1ea50 64 6f 6f 76 65 72 3b 0a 20 20 20 20 20 20 7d 0a  doover;.      }.
1ea60 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30        if( iTab<0
1ea70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1ea80 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1ea90 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
1eaa0 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48  /* Generating CH
1eab0 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
1eac0 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74  or inserting int
1ead0 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  o partial index 
1eae0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
1eaf0 75 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  urn pExpr->iColu
1eb00 6d 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65  mn - pParse->iSe
1eb10 6c 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d  lfTab;.        }
1eb20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1eb30 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70  /* Coding an exp
1eb40 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
1eb50 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  part of an index
1eb60 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61   where column na
1eb70 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mes.          **
1eb80 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65   in the index re
1eb90 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65  fer to the table
1eba0 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e   to which the in
1ebb0 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  dex belongs */. 
1ebc0 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20           iTab = 
1ebd0 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1ebe0 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   - 1;.        }.
1ebf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1ec00 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
1ec10 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
1ec20 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61  arse, pExpr->pTa
1ec30 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
1ec60 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a  , iTab, target,.
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ec90 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20  Expr->op2);.    
1eca0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
1ecb0 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63  TEGER: {.      c
1ecc0 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
1ecd0 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72  e, pExpr, 0, tar
1ece0 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  get);.      retu
1ecf0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1ed00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55  .    case TK_TRU
1ed10 45 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20 20  EFALSE: {.      
1ed20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ed30 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1ed40 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74   sqlite3ExprTrut
1ed50 68 56 61 6c 75 65 28 70 45 78 70 72 29 2c 20 74  hValue(pExpr), t
1ed60 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65  arget);.      re
1ed70 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
1ed80 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1ed90 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1eda0 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54  POINT.    case T
1edb0 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
1edc0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1edd0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1ede0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1edf0 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
1ee00 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  v, pExpr->u.zTok
1ee10 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  en, 0, target);.
1ee20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1ee30 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  get;.    }.#endi
1ee40 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  f.    case TK_ST
1ee50 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
1ee60 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1ee70 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ee80 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1ee90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
1eea0 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72  oadString(v, tar
1eeb0 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  get, pExpr->u.zT
1eec0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 72 65 74  oken);.      ret
1eed0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1eee0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
1eef0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
1ef00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ef10 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
1ef20 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  get);.      retu
1ef30 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1ef40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ef50 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
1ef60 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
1ef70 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
1ef80 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
1ef90 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68  har *z;.      ch
1efa0 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20  ar *zBlob;.     
1efb0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1efc0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1efd0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1efe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1eff0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1f000 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d  ]=='x' || pExpr-
1f010 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58  >u.zToken[0]=='X
1f020 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ' );.      asser
1f030 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1f040 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  en[1]=='\'' );. 
1f050 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d       z = &pExpr-
1f060 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20  >u.zToken[2];.  
1f070 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
1f080 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a  trlen30(z) - 1;.
1f090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b        assert( z[
1f0a0 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  n]=='\'' );.    
1f0b0 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    zBlob = sqlite
1f0c0 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74  3HexToBlob(sqlit
1f0d0 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20  e3VdbeDb(v), z, 
1f0e0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
1f0f0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1f100 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72  P_Blob, n/2, tar
1f110 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50  get, 0, zBlob, P
1f120 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
1f130 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1f140 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1f150 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
1f160 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LE: {.      asse
1f170 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1f180 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1f190 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1f1a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1f1b0 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a  >u.zToken!=0 );.
1f1c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1f1d0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
1f1e0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
1f1f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f200 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70  , OP_Variable, p
1f210 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74  Expr->iColumn, t
1f220 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
1f230 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1f240 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  n[1]!=0 ){.     
1f250 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1f260 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e   = sqlite3VListN
1f270 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d  umToName(pParse-
1f280 3e 70 56 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e  >pVList, pExpr->
1f290 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1f2a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1f2b0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f  >u.zToken[0]=='?
1f2c0 27 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70  ' || strcmp(pExp
1f2d0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d  r->u.zToken, z)=
1f2e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
1f2f0 61 72 73 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20  arse->pVList[0] 
1f300 3d 20 30 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65  = 0; /* Indicate
1f310 20 56 4c 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f   VList may no lo
1f320 6e 67 65 72 20 62 65 20 65 6e 6c 61 72 67 65 64  nger be enlarged
1f330 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
1f340 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
1f350 76 2c 20 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f  v, (char*)z, P4_
1f360 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
1f370 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1f380 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rget;.    }.    
1f390 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
1f3a0 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
1f3b0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
1f3c0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1f3d0 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
1f3e0 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
1f3f0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
1f400 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
1f410 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
1f420 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
1f430 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
1f440 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1f450 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
1f460 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
1f470 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
1f480 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20  g!=target ){.   
1f490 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f4a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
1f4b0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
1f4c0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  t);.        inRe
1f4d0 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
1f4e0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1f4f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f500 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a  P_Cast, target,.
1f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
1f530 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
1f540 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29  r->u.zToken, 0))
1f550 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f560 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  ( usedAsColumnCa
1f570 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  che(pParse, inRe
1f580 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20  g, inReg) );.   
1f590 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f5a0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1f5b0 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
1f5c0 20 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   1);.      retur
1f5d0 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23  n inReg;.    }.#
1f5e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1f5f0 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
1f600 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1f610 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a   case TK_ISNOT:.
1f620 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
1f630 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
1f640 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35   TK_NE;.      p5
1f650 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
1f660 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d  ;.      /* fall-
1f670 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63  through */.    c
1f680 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
1f690 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
1f6a0 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
1f6b0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
1f6c0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
1f6d0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
1f6e0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
1f6f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1f700 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1f710 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c 65  ExprIsVector(pLe
1f720 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ft) ){.        c
1f730 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65  odeVectorCompare
1f740 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1f750 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b  target, op, p5);
1f760 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f770 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f780 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f790 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72  Parse, pLeft, &r
1f7a0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1f7b0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1f7c0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f7d0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1f7e0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1f7f0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1f800 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
1f810 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1f820 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1f830 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
1f840 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20  QLITE_STOREP2 | 
1f850 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  p5);.        ass
1f860 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
1f870 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f880 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
1f890 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f8a0 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Lt);.        ass
1f8b0 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
1f8c0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f8d0 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
1f8e0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f8f0 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Le);.        ass
1f900 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
1f910 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f920 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
1f930 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f940 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Gt);.        ass
1f950 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
1f960 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f970 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
1f980 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f990 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Ge);.        ass
1f9a0 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
1f9b0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f9c0 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65  OP_Eq); VdbeCove
1f9d0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f9e0 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Eq);.        ass
1f9f0 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
1fa00 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1fa10 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ne); VdbeCove
1fa20 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1fa30 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  Ne);.        tes
1fa40 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1fa50 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
1fa60 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1fa70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
1fa80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fa90 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  }.    case TK_AN
1faa0 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  D:.    case TK_O
1fab0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  R:.    case TK_P
1fac0 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LUS:.    case TK
1fad0 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20  _STAR:.    case 
1fae0 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61  TK_MINUS:.    ca
1faf0 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63  se TK_REM:.    c
1fb00 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20  ase TK_BITAND:. 
1fb10 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
1fb20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  :.    case TK_SL
1fb30 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ASH:.    case TK
1fb40 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73  _LSHIFT:.    cas
1fb50 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20  e TK_RSHIFT: .  
1fb60 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
1fb70 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1fb80 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64  ( TK_AND==OP_And
1fb90 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74   );            t
1fba0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fbb0 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
1fbc0 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f  ert( TK_OR==OP_O
1fbd0 72 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  r );            
1fbe0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fbf0 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  TK_OR );.      a
1fc00 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
1fc10 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20  OP_Add );       
1fc20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1fc30 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20  ==TK_PLUS );.   
1fc40 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49     assert( TK_MI
1fc50 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74  NUS==OP_Subtract
1fc60 20 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65   );     testcase
1fc70 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29  ( op==TK_MINUS )
1fc80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fc90 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69  TK_REM==OP_Remai
1fca0 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73  nder );      tes
1fcb0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45  tcase( op==TK_RE
1fcc0 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
1fcd0 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50  t( TK_BITAND==OP
1fce0 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20  _BitAnd );      
1fcf0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1fd00 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20  _BITAND );.     
1fd10 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f   assert( TK_BITO
1fd20 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20  R==OP_BitOr );  
1fd30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fd40 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a  op==TK_BITOR );.
1fd50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1fd60 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
1fd70 65 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63  e );       testc
1fd80 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53  ase( op==TK_SLAS
1fd90 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  H );.      asser
1fda0 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
1fdb0 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20  _ShiftLeft );   
1fdc0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1fdd0 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _LSHIFT );.     
1fde0 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49   assert( TK_RSHI
1fdf0 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  FT==OP_ShiftRigh
1fe00 74 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  t );  testcase( 
1fe10 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b  op==TK_RSHIFT );
1fe20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1fe30 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e  K_CONCAT==OP_Con
1fe40 63 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74  cat );      test
1fe50 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e  case( op==TK_CON
1fe60 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  CAT );.      r1 
1fe70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fe80 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1fe90 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1fea0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1feb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fec0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1fed0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1fee0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1fef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ff00 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c  3(v, op, r2, r1,
1ff10 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1ff20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1ff30 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1ff40 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1ff50 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1ff60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ff70 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
1ff80 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
1ff90 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
1ffa0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1ffb0 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20   pLeft );.      
1ffc0 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
1ffd0 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
1ffe0 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
1fff0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
20000 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
20010 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
20020 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  t;.#ifndef SQLIT
20030 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
20040 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73  POINT.      }els
20050 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d  e if( pLeft->op=
20060 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
20070 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
20080 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
20090 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
200a0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) );.        cod
200b0 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e  eReal(v, pLeft->
200c0 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72  u.zToken, 1, tar
200d0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  get);.        re
200e0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e  turn target;.#en
200f0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
20100 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f  .        tempX.o
20110 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a  p = TK_INTEGER;.
20120 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c          tempX.fl
20130 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75  ags = EP_IntValu
20140 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  e|EP_TokenOnly;.
20150 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e          tempX.u.
20160 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  iValue = 0;.    
20170 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
20180 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
20190 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
201a0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
201b0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
201c0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
201d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
201e0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
201f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20200 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
20210 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61  ract, r2, r1, ta
20220 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74  rget);.        t
20230 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20240 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
20250 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20260 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
20270 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
20280 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
20290 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
202a0 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20  T==OP_BitNot ); 
202b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
202c0 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20  TK_BITNOT );.   
202d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
202e0 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20  T==OP_Not );    
202f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
20300 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
20310 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
20320 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
20330 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
20340 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
20350 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
20360 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
20370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20380 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
20390 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
203a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
203b0 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a  ase TK_TRUTH: {.
203c0 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75 65        int isTrue
203d0 3b 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45 20  ;    /* IS TRUE 
203e0 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a  or IS NOT TRUE *
203f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 72  /.      int bNor
20400 6d 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54 52 55  mal;   /* IS TRU
20410 45 20 6f 72 20 49 53 20 46 41 4c 53 45 20 2a 2f  E or IS FALSE */
20420 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
20430 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
20440 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20450 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
20460 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20470 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
20480 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20  .      isTrue = 
20490 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
204a0 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69  Value(pExpr->pRi
204b0 67 68 74 29 3b 0a 20 20 20 20 20 20 62 4e 6f 72  ght);.      bNor
204c0 6d 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32  mal = pExpr->op2
204d0 3d 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20 20 74  ==TK_IS;.      t
204e0 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20  estcase( isTrue 
204f0 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20  && bNormal);.   
20500 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
20510 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29  True && bNormal)
20520 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20530 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
20540 4f 50 5f 49 73 54 72 75 65 2c 20 72 31 2c 20 69  OP_IsTrue, r1, i
20550 6e 52 65 67 2c 20 21 69 73 54 72 75 65 2c 20 69  nReg, !isTrue, i
20560 73 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61 6c 29  sTrue ^ bNormal)
20570 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20580 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
20590 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
205a0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
205b0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
205c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
205d0 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
205e0 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ll );   testcase
205f0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
20600 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20610 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
20620 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63  NotNull ); testc
20630 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
20640 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
20650 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20660 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
20670 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20680 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
20690 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
206a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
206b0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
206c0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
206d0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
206e0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
206f0 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
20700 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
20710 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
20720 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
20730 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
20740 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
20750 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
20760 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20770 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
20780 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
20790 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
207a0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
207b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
207c0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
207d0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
207e0 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f    AggInfo *pInfo
207f0 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
20800 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
20810 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
20820 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
20830 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
20840 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
20850 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20860 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20870 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
20880 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70  regate: %s()", p
20890 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
208a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
208b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e        return pIn
208c0 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
208d0 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20  >iAgg].iMem;.   
208e0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
208f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20900 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
20910 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
20920 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20  pFarg;       /* 
20930 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e  List of function
20940 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
20950 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20      int nFarg;  
20960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20970 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e  mber of function
20980 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
20990 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
209a0 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  f;         /* Th
209b0 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  e function defin
209c0 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ition object */.
209d0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
209e0 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
209f0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
20a00 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63  e */.      u32 c
20a10 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
20a20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
20a30 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
20a40 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
20a50 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
20a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20a70 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
20a80 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  r */.      sqlit
20a90 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
20aa0 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  >db;  /* The dat
20ab0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
20ac0 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63   */.      u8 enc
20ad0 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20   = ENC(db);     
20ae0 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63   /* The text enc
20af0 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  oding used by th
20b00 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
20b10 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
20b20 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41  oll = 0;    /* A
20b30 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
20b40 6e 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  nce */..#ifndef 
20b50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
20b60 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28  OWFUNC.      if(
20b70 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
20b80 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
20b90 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
20ba0 29 20 26 26 20 70 45 78 70 72 2d 3e 70 57 69 6e  ) && pExpr->pWin
20bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
20bc0 72 6e 20 70 45 78 70 72 2d 3e 70 57 69 6e 2d 3e  rn pExpr->pWin->
20bd0 72 65 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 20  regResult;.     
20be0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
20bf0 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
20c00 4f 6b 28 70 50 61 72 73 65 29 20 26 26 20 73 71  Ok(pParse) && sq
20c10 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
20c20 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
20c30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
20c40 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  SQL functions ca
20c50 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20  n be expensive. 
20c60 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63  So try to move c
20c70 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e  onstant function
20c80 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  s.        ** out
20c90 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
20ca0 6f 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  op, even if that
20cb0 20 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20   means an extra 
20cc0 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20  OP_Copy. */.    
20cd0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
20ce0 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
20cf0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
20d00 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
20d10 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
20d20 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
20d30 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
20d40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
20d50 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
20d60 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
20d70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
20d80 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
20d90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
20da0 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
20db0 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
20dc0 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72      nFarg = pFar
20dd0 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72  g ? pFarg->nExpr
20de0 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   : 0;.      asse
20df0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
20e00 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
20e10 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
20e20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75    zId = pExpr->u
20e30 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70  .zToken;.      p
20e40 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
20e50 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
20e60 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  d, nFarg, enc, 0
20e70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
20e80 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f  _ENABLE_UNKNOWN_
20e90 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20  SQL_FUNCTION.   
20ea0 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26     if( pDef==0 &
20eb0 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  & pParse->explai
20ec0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  n ){.        pDe
20ed0 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
20ee0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b  unction(db, "unk
20ef0 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e  nown", nFarg, en
20f00 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  c, 0);.      }.#
20f10 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
20f20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d  pDef==0 || pDef-
20f30 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
20f40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20f50 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20f60 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69   "unknown functi
20f70 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b  on: %s()", zId);
20f80 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
20f90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
20fa0 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65  * Attempt a dire
20fb0 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ct implementatio
20fc0 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  n of the built-i
20fd0 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64  n COALESCE() and
20fe0 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c  .      ** IFNULL
20ff0 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  () functions.  T
21000 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63  his avoids unnec
21010 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f  essary evaluatio
21020 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72  n of.      ** ar
21030 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65  guments past the
21040 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20   first non-NULL 
21050 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
21060 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
21070 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
21080 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45  QLITE_FUNC_COALE
21090 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  SCE ){.        i
210a0 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d  nt endCoalesce =
210b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
210c0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
210d0 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
210e0 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =2 );.        sq
210f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
21100 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
21110 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
21120 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
21130 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  1; i<nFarg; i++)
21140 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
21150 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21160 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72   OP_NotNull, tar
21170 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  get, endCoalesce
21180 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
21190 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
211a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
211b0 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
211c0 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31  Parse, target, 1
211d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
211e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
211f0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
21200 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21210 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
21220 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  rg->a[i].pExpr, 
21230 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
21240 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
21250 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
21260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21270 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
21280 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
21290 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
212a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
212b0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  }..      /* The 
212c0 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74  UNLIKELY() funct
212d0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
212e0 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
212f0 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
21300 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61  * of the first a
21310 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
21320 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
21330 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
21340 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45  LITE_FUNC_UNLIKE
21350 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  LY ){.        as
21360 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29  sert( nFarg>=1 )
21370 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21380 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21390 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
213a0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
213b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
213c0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
213d0 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a  E_DEBUG.      /*
213e0 20 54 68 65 20 41 46 46 49 4e 49 54 59 28 29 20   The AFFINITY() 
213f0 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74  function evaluat
21400 65 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  es to a string t
21410 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 20 20  hat describes.  
21420 20 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20      ** the type 
21430 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
21440 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20  argument.  This 
21450 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
21460 69 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ing of.      ** 
21470 74 68 65 20 53 51 4c 69 74 65 20 74 79 70 65 20  the SQLite type 
21480 6c 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  logic..      */.
21490 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
214a0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
214b0 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59  TE_FUNC_AFFINITY
214c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
214d0 74 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20  t char *azAff[] 
214e0 3d 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78  = { "blob", "tex
214f0 74 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22  t", "numeric", "
21500 69 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22  integer", "real"
21510 20 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   };.        char
21520 20 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73   aff;.        as
21530 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
21540 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20  ;.        aff = 
21550 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
21560 69 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  ity(pFarg->a[0].
21570 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
21580 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
21590 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
215a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215c0 61 66 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d  aff ? azAff[aff-
215d0 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d  SQLITE_AFF_BLOB]
215e0 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20   : "none");.    
215f0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
21600 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  t;.      }.#endi
21610 66 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  f..      for(i=0
21620 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
21630 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33  .        if( i<3
21640 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  2 && sqlite3Expr
21650 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67  IsConstant(pFarg
21660 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
21670 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
21680 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20  ase( i==31 );.  
21690 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
216a0 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69  k |= MASKBIT32(i
216b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
216c0 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
216d0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
216e0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
216f0 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29  )!=0 && !pColl )
21700 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
21710 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
21720 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
21730 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
21740 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
21750 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
21760 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
21770 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b  if( constMask ){
21780 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
21790 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
217a0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
217b0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b  ->nMem += nFarg;
217c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
217d0 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73            r1 = s
217e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
217f0 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67  ge(pParse, nFarg
21800 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
21810 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e        /* For len
21820 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66  gth() and typeof
21830 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74  () functions wit
21840 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d  h a column argum
21850 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ent,.        ** 
21860 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d  set the P5 param
21870 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43  eter to the OP_C
21880 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20  olumn opcode to 
21890 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
218a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f  .        ** or O
218b0 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
218c0 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f  respectively, to
218d0 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
218e0 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20  ry data.        
218f0 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20  ** loading..    
21900 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
21910 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
21920 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55  ags & (SQLITE_FU
21930 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45  NC_LENGTH|SQLITE
21940 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d  _FUNC_TYPEOF))!=
21950 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
21960 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20  8 exprOp;.      
21970 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
21980 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
21990 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d    assert( pFarg-
219a0 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
219b0 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72  ;.          expr
219c0 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  Op = pFarg->a[0]
219d0 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20  .pExpr->op;.    
219e0 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70        if( exprOp
219f0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65  ==TK_COLUMN || e
21a00 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  xprOp==TK_AGG_CO
21a10 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
21a20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
21a30 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d  TE_FUNC_LENGTH==
21a40 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
21a50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
21a60 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
21a70 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c  UNC_TYPEOF==OPFL
21a80 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a  AG_TYPEOFARG );.
21a90 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
21aa0 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63  case( pDef->func
21ab0 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c  Flags & OPFLAG_L
21ac0 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
21ad0 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61          pFarg->a
21ae0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d  [0].pExpr->op2 =
21af0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
21b00 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c      pDef->funcFl
21b10 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45  ags & (OPFLAG_LE
21b20 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54  NGTHARG|OPFLAG_T
21b30 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20  YPEOFARG);.     
21b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21b50 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
21b60 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
21b70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54  Parse);     /* T
21b80 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
21b90 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  be */.        sq
21ba0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
21bb0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
21bc0 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20  arg, r1, 0,.    
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21be0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
21bf0 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
21c00 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b  TE_ECEL_FACTOR);
21c10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21c20 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
21c30 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69  rse);      /* Ti
21c40 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
21c50 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  e */.      }else
21c60 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30  {.        r1 = 0
21c70 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
21c80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
21c90 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
21ca0 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
21cb0 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
21cc0 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
21cd0 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
21ce0 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
21cf0 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
21d00 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
21d10 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
21d20 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
21d30 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
21d40 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
21d50 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
21d60 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
21d70 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
21d80 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
21d90 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
21da0 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
21db0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
21dc0 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
21dd0 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
21de0 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
21df0 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
21e00 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
21e10 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
21e20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
21e30 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
21e40 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
21e50 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
21e60 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
21e70 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
21e80 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
21e90 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
21ea0 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
21eb0 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
21ec0 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
21ed0 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
21ee0 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
21ef0 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
21f00 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
21f10 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
21f20 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
21f30 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
21f40 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70  Farg>=2 && (pExp
21f50 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
21f60 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
21f70 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
21f80 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
21f90 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
21fa0 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
21fb0 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
21fc0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72    }else if( nFar
21fd0 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
21fe0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
21ff0 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
22000 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
22010 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  g, pFarg->a[0].p
22020 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
22030 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
22040 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
22050 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
22060 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
22070 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
22080 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
22090 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
220a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
220b0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
220c0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
220d0 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
220e0 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  EQ);.      }.#if
220f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
22100 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e  E_OFFSET_SQL_FUN
22110 43 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  C.      if( pDef
22120 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
22130 4c 49 54 45 5f 46 55 4e 43 5f 4f 46 46 53 45 54  LITE_FUNC_OFFSET
22140 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
22150 20 2a 70 41 72 67 20 3d 20 70 46 61 72 67 2d 3e   *pArg = pFarg->
22160 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
22170 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 6f 70      if( pArg->op
22180 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
22190 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
221a0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
221b0 5f 4f 66 66 73 65 74 2c 20 70 41 72 67 2d 3e 69  _Offset, pArg->i
221c0 54 61 62 6c 65 2c 20 70 41 72 67 2d 3e 69 43 6f  Table, pArg->iCo
221d0 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
221e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
221f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22200 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22210 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
22220 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22230 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
22240 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73       {.        s
22250 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
22260 28 76 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  (v, pParse->iSel
22270 66 54 61 62 20 3f 20 4f 50 5f 50 75 72 65 46 75  fTab ? OP_PureFu
22280 6e 63 30 20 3a 20 4f 50 5f 46 75 6e 63 74 69 6f  nc0 : OP_Functio
22290 6e 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n0,.            
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
222b0 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72  nstMask, r1, tar
222c0 67 65 74 2c 20 28 63 68 61 72 2a 29 70 44 65 66  get, (char*)pDef
222d0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
222e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
222f0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
22300 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  8)nFarg);.      
22310 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  }.      if( nFar
22320 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d  g && constMask==
22330 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
22340 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
22350 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
22360 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d   nFarg);.      }
22370 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
22380 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rget;.    }.#ifn
22390 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
223a0 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
223b0 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
223c0 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
223d0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f   {.      int nCo
223e0 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  l;.      testcas
223f0 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  e( op==TK_EXISTS
22400 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
22410 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  se( op==TK_SELEC
22420 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  T );.      if( o
22430 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p==TK_SELECT && 
22440 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78  (nCol = pExpr->x
22450 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
22460 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20  ->nExpr)!=1 ){. 
22470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75         sqlite3Su
22480 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  bselectError(pPa
22490 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20  rse, nCol, 1);. 
224a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
224b0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
224c0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
224d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
224e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
224f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22500 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
22510 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  ECT_COLUMN: {.  
22520 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
22530 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
22540 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  t->iTable==0 ){.
22550 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
22560 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73  Left->iTable = s
22570 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
22580 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
22590 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b  r->pLeft, 0, 0);
225a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
225b0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
225c0 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
225d0 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
225e0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
225f0 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
22600 65 0a 20 20 20 20 20 20 20 26 26 20 70 45 78 70  e.       && pExp
22610 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20  r->iTable!=(n = 
22620 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
22630 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65  rSize(pExpr->pLe
22640 66 74 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  ft)) .      ){. 
22650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
22660 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
22670 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67  %d columns assig
22680 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a  ned %d values",.
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226b0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e  pExpr->iTable, n
226c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
226d0 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
226e0 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70  Left->iTable + p
226f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
22700 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
22710 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
22720 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
22730 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
22740 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
22750 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
22760 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
22770 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
22780 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22790 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
227a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
227b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
227c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
227d0 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
227e0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
227f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22800 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
22810 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
22820 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
22830 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
22840 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
22850 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22860 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
22870 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20   target, 0);.   
22880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
22890 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
228a0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
228b0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
228c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
228d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
228e0 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
228f0 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
22900 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
22910 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
22920 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
22930 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
22940 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
22950 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
22960 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
22970 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
22980 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
22990 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
229a0 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
229b0 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
229c0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
229d0 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
229e0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
229f0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65  TWEEN: {.      e
22a00 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
22a10 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
22a20 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rget, 0, 0);.   
22a30 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
22a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
22a50 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61   TK_SPAN:.    ca
22a60 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a  se TK_COLLATE: .
22a70 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
22a80 53 3a 20 7b 0a 20 20 20 20 20 20 70 45 78 70 72  S: {.      pExpr
22a90 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
22aa0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 70 72  .      goto expr
22ab0 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3b 20 2f 2a  _code_doover; /*
22ac0 20 32 30 31 38 2d 30 34 2d 32 38 3a 20 50 72 65   2018-04-28: Pre
22ad0 76 65 6e 74 20 64 65 65 70 20 72 65 63 75 72 73  vent deep recurs
22ae0 69 6f 6e 2e 20 4f 53 53 46 75 7a 7a 2e 20 2a 2f  ion. OSSFuzz. */
22af0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
22b00 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20   TK_TRIGGER: {. 
22b10 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
22b20 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47  pcode is TK_TRIG
22b30 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78  GER, then the ex
22b40 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65  pression is a re
22b50 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a  ference.      **
22b60 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   to a column in 
22b70 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64  the new.* or old
22b80 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73  .* pseudo-tables
22b90 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20   available to.  
22ba0 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70      ** trigger p
22bb0 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73  rograms. In this
22bc0 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c   case Expr.iTabl
22bd0 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f  e is set to 1 fo
22be0 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  r the.      ** n
22bf0 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
22c00 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20  e, or 0 for the 
22c10 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
22c20 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  le. Expr.iColumn
22c30 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
22c40 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f   to the column o
22c50 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  f the pseudo-tab
22c60 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74  le to read, or t
22c70 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a  o -1 to.      **
22c80 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   read the rowid 
22c90 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  field..      **.
22ca0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70        ** The exp
22cb0 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65  ression is imple
22cc0 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20  mented using an 
22cd0 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e  OP_Param opcode.
22ce0 20 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a   The p1.      **
22cf0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65   parameter is se
22d00 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c  t to 0 for an ol
22d10 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  d.rowid referenc
22d20 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20  e, or to (i+1). 
22d30 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72       ** to refer
22d40 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c  ence another col
22d50 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a  umn of the old.*
22d60 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77   pseudo-table, w
22d70 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  here .      ** i
22d80 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
22d90 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72   the column. For
22da0 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66   a new.rowid ref
22db0 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20  erence, p1 is.  
22dc0 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e      ** set to (n
22dd0 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20  +1), where n is 
22de0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
22df0 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73  lumns in each ps
22e00 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20  eudo-table..    
22e10 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72    ** For a refer
22e20 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65  ence to any othe
22e30 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
22e40 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
22e50 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  le, p1.      ** 
22e60 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69  is set to (n+2+i
22e70 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69  ), where n and i
22e80 20 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20   are as defined 
22e90 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a  previously. For.
22ea0 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65        ** example
22eb0 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f  , if the table o
22ec0 6e 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73  n which triggers
22ed0 20 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64   are being fired
22ee0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63   is.      ** dec
22ef0 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20  lared as:.      
22f00 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52  **.      **   CR
22f10 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
22f20 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20   b);.      **.  
22f30 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69      ** Then p1 i
22f40 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
22f50 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
22f60 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  **.      **   p1
22f70 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==0   ->    old.
22f80 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20  rowid     p1==3 
22f90 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69    ->    new.rowi
22fa0 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  d.      **   p1=
22fb0 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61  =1   ->    old.a
22fc0 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20           p1==4  
22fd0 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20   ->    new.a.   
22fe0 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20     **   p1==2   
22ff0 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20  ->    old.b     
23000 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20      p1==5   ->  
23010 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20    new.b       . 
23020 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
23030 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70  ble *pTab = pExp
23040 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  r->pTab;.      i
23050 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69  nt p1 = pExpr->i
23060 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e  Table * (pTab->n
23070 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78  Col+1) + 1 + pEx
23080 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20  pr->iColumn;..  
23090 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
230a0 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  r->iTable==0 || 
230b0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31  pExpr->iTable==1
230c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
230d0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
230e0 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69  >=-1 && pExpr->i
230f0 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f  Column<pTab->nCo
23100 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
23110 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  t( pTab->iPKey<0
23120 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   || pExpr->iColu
23130 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  mn!=pTab->iPKey 
23140 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23150 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54   p1>=0 && p1<(pT
23160 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b  ab->nCol*2+2) );
23170 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
23180 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23190 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65  Param, p1, targe
231a0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
231b0 6d 6d 65 6e 74 28 28 76 2c 20 22 72 5b 25 64 5d  mment((v, "r[%d]
231c0 3d 25 73 2e 25 73 22 2c 20 74 61 72 67 65 74 2c  =%s.%s", target,
231d0 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
231e0 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20  >iTable ? "new" 
231f0 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20  : "old"),.      
23200 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d    (pExpr->iColum
23210 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n<0 ? "rowid" : 
23220 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f  pExpr->pTab->aCo
23230 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
23240 5d 2e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 29  ].zName).      )
23250 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
23260 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
23270 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20  _POINT.      /* 
23280 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  If the column ha
23290 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c  s REAL affinity,
232a0 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c   it may currentl
232b0 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
232c0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  n.      ** integ
232d0 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41  er. Use OP_RealA
232e0 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  ffinity to make 
232f0 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c  sure it is reall
23300 79 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a  y real..      **
23310 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
23320 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35  CE-OF: R-60985-5
23330 37 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c  7662 SQLite will
23340 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c   convert the val
23350 75 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20  ue back to.     
23360 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69   ** floating poi
23370 6e 74 20 77 68 65 6e 20 65 78 74 72 61 63 74 69  nt when extracti
23380 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72  ng it from the r
23390 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20  ecord.  */.     
233a0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
233b0 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26  umn>=0 .       &
233c0 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  & pTab->aCol[pEx
233d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  pr->iColumn].aff
233e0 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
233f0 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a  F_REAL.      ){.
23400 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23410 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
23420 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61  RealAffinity, ta
23430 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  rget);.      }.#
23440 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
23450 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
23460 73 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a  se TK_VECTOR: {.
23470 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
23480 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
23490 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
234a0 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
234b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
234c0 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a   TK_IF_NULL_ROW:
234d0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
234e0 72 49 4e 52 3b 0a 20 20 20 20 20 20 61 64 64 72  rINR;.      addr
234f0 49 4e 52 20 3d 20 73 71 6c 69 74 65 33 56 64 62  INR = sqlite3Vdb
23500 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
23510 4e 75 6c 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e  NullRow, pExpr->
23520 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73  iTable);.      s
23530 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
23540 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
23550 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
23560 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
23570 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
23580 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
23590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
235a0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
235b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
235c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
235d0 61 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20 20  addrINR);.      
235e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
235f0 65 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c 20  eP3(v, addrINR, 
23600 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
23610 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
23620 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
23630 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
23640 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
23650 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
23660 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
23670 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
23680 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
23690 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
236a0 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
236b0 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
236c0 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
236d0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
236e0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
236f0 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
23700 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
23710 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
23720 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
23730 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
23740 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
23750 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
23760 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
23770 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
23780 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
23790 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
237a0 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
237b0 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
237c0 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
237d0 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73   Y is in the las
237e0 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78  t element of pEx
237f0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70  pr->x.pList if p
23800 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
23810 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f  Expr is.    ** o
23820 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  dd.  The Y is al
23830 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
23840 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
23850 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69  lements in x.pLi
23860 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65  st.    ** is eve
23870 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69  n, then Y is omi
23880 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74  tted and the "ot
23890 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20  herwise" result 
238a0 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  is NULL..    ** 
238b0 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  Ei is in pExpr->
238c0 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e  pList->a[i*2] an
238d0 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70  d Ri is pExpr->p
238e0 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a  List->a[i*2+1]..
238f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
23900 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
23910 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
23920 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72  e Ri for the fir
23930 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a  st matching Ei,.
23940 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65      ** or if the
23950 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e  re is no matchin
23960 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74  g Ei, the ELSE t
23970 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65  erm Y, or if the
23980 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20  re is.    ** no 
23990 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e  ELSE term, NULL.
239a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
239b0 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
239c0 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20  =TK_CASE ); {.  
239d0 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c      int endLabel
239e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
239f0 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
23a00 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43  bel for end of C
23a10 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20  ASE stmt */.    
23a20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20    int nextCase; 
23a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a40 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
23a50 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20  l for next WHEN 
23a60 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
23a70 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20  int nExpr;      
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f    /* 2x number o
23aa0 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
23ab0 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ad0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
23ae0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
23af0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
23b00 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
23b10 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48     /* List of WH
23b20 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
23b30 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
23b40 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
23b50 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
23b60 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
23b70 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61      Expr opCompa
23b80 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
23b90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d        /* The X==
23ba0 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  Ei expression */
23bb0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23be0 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
23bf0 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
23c00 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
23c10 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
23c20 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
23c30 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
23c40 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  .      VVA_ONLY(
23c50 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c   int iCacheLevel
23c60 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
23c70 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20  eLevel; )..     
23c80 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
23c90 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
23ca0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
23cb0 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
23cc0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
23cd0 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
23ce0 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
23cf0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
23d00 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
23d10 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
23d20 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
23d30 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
23d40 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
23d50 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
23d60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
23d70 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
23d80 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
23d90 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70   ){.        temp
23da0 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  X = *pX;.       
23db0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f   testcase( pX->o
23dc0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
23dd0 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65          exprToRe
23de0 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65  gister(&tempX, e
23df0 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
23e00 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72  arse, &tempX, &r
23e10 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20  egFree1));.     
23e20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
23e30 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
23e40 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f      memset(&opCo
23e50 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mpare, 0, sizeof
23e60 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20  (opCompare));.  
23e70 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
23e80 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20  op = TK_EQ;.    
23e90 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c      opCompare.pL
23ea0 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20  eft = &tempX;.  
23eb0 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f        pTest = &o
23ec0 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  pCompare;.      
23ed0 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31    /* Ticket b351
23ee0 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39  d95f9cd5ef17e9d9
23ef0 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39  dbae18f5ca861119
23f00 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a  0001:.        **
23f10 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   The value in re
23f20 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74  gFree1 might get
23f30 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74   SCopy-ed into t
23f40 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a  he file result..
23f50 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61          ** So ma
23f60 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
23f70 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74   regFree1 regist
23f80 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64  er is not reused
23f90 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20   for other.     
23fa0 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61     ** purposes a
23fb0 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72  nd possibly over
23fc0 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
23fd0 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20       regFree1 = 
23fe0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
23ff0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
24000 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  r-1; i=i+2){.   
24010 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24020 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
24030 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
24040 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  X ){.          a
24050 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20  ssert( pTest!=0 
24060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43  );.          opC
24070 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20  ompare.pRight = 
24080 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
24090 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pr;.        }els
240a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e{.          pTe
240b0 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  st = aListelem[i
240c0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
240d0 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43   }.        nextC
240e0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
240f0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
24100 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
24110 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pTest->op==TK_C
24120 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
24130 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
24140 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73  lse(pParse, pTes
24150 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c  t, nextCase, SQL
24160 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
24170 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
24180 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e( aListelem[i+1
24190 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
241a0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
241b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
241c0 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
241d0 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20  lem[i+1].pExpr, 
241e0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
241f0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
24200 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
24210 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
24220 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
24230 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
24240 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
24250 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29  bel(v, nextCase)
24260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24270 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30  if( (nExpr&1)!=0
24280 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24290 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
242a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
242b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
242c0 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
242d0 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78  ->a[nExpr-1].pEx
242e0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
242f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24300 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
24310 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
24320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
24330 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
24340 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
24350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
24360 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
24370 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24380 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
24390 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0 .           ||
243a0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
243b0 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65  evel==iCacheLeve
243c0 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
243d0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
243e0 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  el(v, endLabel);
243f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
24400 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
24410 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
24420 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53      case TK_RAIS
24430 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
24440 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  t( pExpr->affini
24450 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  ty==OE_Rollback 
24460 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
24470 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
24480 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20  OE_Abort.       
24490 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
244a0 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a  finity==OE_Fail.
244b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
244c0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
244d0 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29  E_Ignore.      )
244e0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
244f0 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
24500 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24510 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
24520 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
24530 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
24540 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
24550 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
24560 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
24570 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24580 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
24590 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
245a0 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  nity==OE_Abort )
245b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
245c0 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
245d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
245e0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
245f0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
24600 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
24610 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
24620 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
24630 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
24640 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24650 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  p4(.            
24660 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
24670 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65  TE_OK, OE_Ignore
24680 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
24690 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20  oken,0);.       
246a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
246b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
246c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
246d0 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
246e0 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rse, SQLITE_CONS
246f0 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a  TRAINT_TRIGGER,.
24700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
24720 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70  xpr->affinity, p
24730 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
24740 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  0, 0);.      }..
24750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24760 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
24770 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
24780 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
24790 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
247a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
247b0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
247c0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52  2);.  return inR
247d0 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63  eg;.}../*.** Fac
247e0 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65  tor out the code
247f0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
24800 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74  pression to init
24810 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
24820 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73  .**.** If regDes
24830 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65  t>=0 then the re
24840 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73  sult is always s
24850 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20 72 65  tored in that re
24860 67 69 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a  gister and the.*
24870 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20  * result is not 
24880 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65  reusable.  If re
24890 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69  gDest<0 then thi
248a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65  s routine is fre
248b0 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74  e to .** store t
248c0 68 65 20 76 61 6c 75 65 20 77 68 65 72 65 65 76  he value whereev
248d0 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68  er it wants.  Th
248e0 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
248f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24900 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73  .** is stored is
24910 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e   returned.  When
24920 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20   regDest<0, two 
24930 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73  identical expres
24940 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f  sions will.** co
24950 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72  de to the same r
24960 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
24970 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
24980 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a  tInit(.  Parse *
24990 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
249a0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
249b0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
249c0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
249d0 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77  ession to code w
249e0 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69  hen the VDBE ini
249f0 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e  tializes */.  in
24a00 74 20 72 65 67 44 65 73 74 20 20 20 20 20 20 20  t regDest       
24a10 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c  /* Store the val
24a20 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
24a30 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ter */.){.  Expr
24a40 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72  List *p;.  asser
24a50 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  t( ConstFactorOk
24a60 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20  (pParse) );.  p 
24a70 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  = pParse->pConst
24a80 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44  Expr;.  if( regD
24a90 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20  est<0 && p ){.  
24aa0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
24ab0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
24ac0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
24ad0 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d  r(pItem=p->a, i=
24ae0 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70  p->nExpr; i>0; p
24af0 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20  Item++, i--){.  
24b00 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72      if( pItem->r
24b10 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74  eusable && sqlit
24b20 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
24b30 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78  pItem->pExpr,pEx
24b40 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  pr,-1)==0 ){.   
24b50 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65       return pIte
24b60 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52  m->u.iConstExprR
24b70 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  eg;.      }.    
24b80 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20  }.  }.  pExpr = 
24b90 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
24ba0 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
24bb0 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  , 0);.  p = sqli
24bc0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
24bd0 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78  d(pParse, p, pEx
24be0 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  pr);.  if( p ){.
24bf0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
24c00 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
24c10 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70   = &p->a[p->nExp
24c20 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d  r-1];.     pItem
24c30 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67  ->reusable = reg
24c40 44 65 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28  Dest<0;.     if(
24c50 20 72 65 67 44 65 73 74 3c 30 20 29 20 72 65 67   regDest<0 ) reg
24c60 44 65 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Dest = ++pParse-
24c70 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65  >nMem;.     pIte
24c80 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52  m->u.iConstExprR
24c90 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20  eg = regDest;.  
24ca0 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  }.  pParse->pCon
24cb0 73 74 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65  stExpr = p;.  re
24cc0 74 75 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a  turn regDest;.}.
24cd0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24ce0 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
24cf0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   an expression a
24d00 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
24d10 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  ults.** into a r
24d20 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e  egister.  Return
24d30 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
24d40 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72  mber where the r
24d50 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74  esults.** are st
24d60 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
24d70 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61  he register is a
24d80 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
24d90 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20  ter that can be 
24da0 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20  deallocated,.** 
24db0 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e  then write its n
24dc0 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67  umber into *pReg
24dd0 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
24de0 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
24df0 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c  .** a temporary,
24e00 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20   then set *pReg 
24e10 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49  to zero..**.** I
24e20 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e  f pExpr is a con
24e30 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  stant, then this
24e40 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67   routine might g
24e50 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20  enerate this.** 
24e60 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65  code to fill the
24e70 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
24e80 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
24e90 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  section of the.*
24ea0 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20  * VDBE program, 
24eb0 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74  in order to fact
24ec0 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65  or it out of the
24ed0 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70   evaluation loop
24ee0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24ef0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72  ExprCodeTemp(Par
24f00 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24f10 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52   *pExpr, int *pR
24f20 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20  eg){.  int r2;. 
24f30 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
24f40 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
24f50 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f  pExpr);.  if( Co
24f60 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
24f70 73 65 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d  se).   && pExpr-
24f80 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
24f90 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
24fa0 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
24fb0 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a  oin(pExpr).  ){.
24fc0 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a      *pReg  = 0;.
24fd0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
24fe0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
24ff0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31  Parse, pExpr, -1
25000 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25010 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
25020 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
25030 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c  e);.    r2 = sql
25040 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
25050 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
25060 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72  , r1);.    if( r
25070 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a  2==r1 ){.      *
25080 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d  pReg = r1;.    }
25090 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
250a0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
250b0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
250c0 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a       *pReg = 0;.
250d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
250e0 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn r2;.}../*.** 
250f0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
25100 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
25110 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
25120 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
25130 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
25140 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
25150 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
25160 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70  guaranteed to ap
25170 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73  pear.** in regis
25180 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76  ter target..*/.v
25190 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
251a0 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
251b0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
251c0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
251d0 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73  nt inReg;..  ass
251e0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26  ert( target>0 &&
251f0 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d   target<=pParse-
25200 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70  >nMem );.  if( p
25210 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f  Expr && pExpr->o
25220 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
25230 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
25240 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
25250 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20  pVdbe, OP_Copy, 
25260 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74  pExpr->iTable, t
25270 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  arget);.  }else{
25280 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c  .    inReg = sql
25290 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
252a0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
252b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61  , target);.    a
252c0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
252d0 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73  Vdbe!=0 || pPars
252e0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
252f0 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69  led );.    if( i
25300 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20  nReg!=target && 
25310 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b  pParse->pVdbe ){
25320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
25330 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
25340 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
25350 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
25360 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
25370 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e  *.** Make a tran
25380 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78  sient copy of ex
25390 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
253a0 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20  nd then code it 
253b0 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
253c0 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69  ExprCode().  Thi
253d0 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
253e0 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65  just like sqlite
253f0 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65  3ExprCode().** e
25400 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 69  xcept that the i
25410 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20  nput expression 
25420 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
25430 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   be unchanged..*
25440 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
25450 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65  prCodeCopy(Parse
25460 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
25470 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
25480 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t){.  sqlite3 *d
25490 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
254a0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
254b0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
254c0 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64  pr, 0);.  if( !d
254d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
254e0 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ) sqlite3ExprCod
254f0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
25500 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69   target);.  sqli
25510 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
25520 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
25530 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
25540 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
25550 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
25560 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
25570 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
25580 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
25590 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
255a0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
255b0 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
255c0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
255d0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
255e0 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74  n is constant, t
255f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
25600 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65  .** might choose
25610 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70   to code the exp
25620 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69  ression at initi
25630 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a  alization time..
25640 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
25650 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c  xprCodeFactorabl
25660 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
25670 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
25680 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28  t target){.  if(
25690 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74   pParse->okConst
256a0 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65  Factor && sqlite
256b0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
256c0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71  pExpr) ){.    sq
256d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
256e0 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
256f0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65  r, target);.  }e
25700 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
25710 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
25720 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
25730 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
25740 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
25750 20 65 76 61 6c 75 61 74 65 73 20 74 68 65 20 67   evaluates the g
25760 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
25770 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73  and puts the res
25780 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ult.** in regist
25790 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  er target..**.**
257a0 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70   Also make a cop
257b0 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
257c0 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ion results into
257d0 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22   another "cache"
257e0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
257f0 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72   modify the expr
25800 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  ession so that t
25810 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20  he next time it 
25820 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a  is evaluated,.**
25830 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
25840 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63   copy of the cac
25850 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  he register..**.
25860 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25870 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72  is used for expr
25880 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
25890 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a   used multiple .
258a0 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20  ** times.  They 
258b0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  are evaluated on
258c0 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  ce and the resul
258d0 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ts of the expres
258e0 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73  sion.** are reus
258f0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
25900 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61  te3ExprCodeAndCa
25910 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
25920 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
25930 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
25940 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
25950 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d  >pVdbe;.  int iM
25960 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  em;..  assert( t
25970 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
25980 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
25990 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
259a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
259b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
259c0 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20  target);.  iMem 
259d0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
259e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
259f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
25a00 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b  , target, iMem);
25a10 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  .  exprToRegiste
25a20 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a  r(pExpr, iMem);.
25a30 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
25a40 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
25a50 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
25a60 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
25a70 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
25a80 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e  pression list in
25a90 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  to a sequence of
25aa0 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
25ab0 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a  ning at target..
25ac0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
25ad0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
25ae0 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20  nts evaluated.  
25af0 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
25b00 6e 65 64 20 77 69 6c 6c 0a 2a 2a 20 75 73 75 61  ned will.** usua
25b10 6c 6c 79 20 62 65 20 70 4c 69 73 74 2d 3e 6e 45  lly be pList->nE
25b20 78 70 72 20 62 75 74 20 6d 69 67 68 74 20 62 65  xpr but might be
25b30 20 72 65 64 75 63 65 64 20 69 66 20 53 51 4c 49   reduced if SQLI
25b40 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 0a  TE_ECEL_OMITREF.
25b50 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  ** is defined..*
25b60 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
25b70 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72  ECEL_DUP flag pr
25b80 65 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d  events the argum
25b90 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a  ents from being.
25ba0 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20  ** filled using 
25bb0 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f  OP_SCopy.  OP_Co
25bc0 70 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  py must be used 
25bd0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  instead..**.** T
25be0 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  he SQLITE_ECEL_F
25bf0 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61  ACTOR argument a
25c00 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61  llows constant a
25c10 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a  rguments to be.*
25c20 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69  * factored out i
25c30 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  nto initializati
25c40 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  on code..**.** T
25c50 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  he SQLITE_ECEL_R
25c60 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68  EF flag means th
25c70 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  at expressions i
25c80 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a  n the list with.
25c90 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  ** ExprList.a[].
25ca0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
25cb0 30 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  0 have already b
25cc0 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e  een evaluated an
25cd0 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72  d stored.** in r
25ce0 65 67 69 73 74 65 72 73 20 61 74 20 73 72 63 52  egisters at srcR
25cf0 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76  eg, and so the v
25d00 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69  alue can be copi
25d10 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a  ed from there..*
25d20 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 43 45 4c  * If SQLITE_ECEL
25d30 5f 4f 4d 49 54 52 45 46 20 69 73 20 61 6c 73 6f  _OMITREF is also
25d40 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 76   set, then the v
25d50 61 6c 75 65 73 20 77 69 74 68 20 75 2e 78 2e 69  alues with u.x.i
25d60 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 2a 2a 20  OrderByCol>0.** 
25d70 61 72 65 20 73 69 6d 70 6c 79 20 6f 6d 69 74 74  are simply omitt
25d80 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 62  ed rather than b
25d90 65 69 6e 67 20 63 6f 70 69 65 64 20 66 72 6f 6d  eing copied from
25da0 20 73 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e 74 20   srcReg..*/.int 
25db0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
25dc0 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
25dd0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
25de0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
25df0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
25e00 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20  pList,   /* The 
25e10 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
25e20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
25e30 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20   int target,    
25e40 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
25e50 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f  write results */
25e60 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20  .  int srcReg,  
25e70 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
25e80 72 65 67 69 73 74 65 72 73 20 69 66 20 53 51 4c  registers if SQL
25e90 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a  ITE_ECEL_REF */.
25ea0 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20 20    u8 flags      
25eb0 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45       /* SQLITE_E
25ec0 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29  CEL_* flags */.)
25ed0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
25ee0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
25ef0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a  .  int i, j, n;.
25f00 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66    u8 copyOp = (f
25f10 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
25f20 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70  EL_DUP) ? OP_Cop
25f30 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20  y : OP_SCopy;.  
25f40 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
25f50 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
25f60 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
25f70 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
25f80 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
25f90 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20  Parse->pVdbe!=0 
25fa0 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74  );  /* Never get
25fb0 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65 72  s this far other
25fc0 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c  wise */.  n = pL
25fd0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  ist->nExpr;.  if
25fe0 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  ( !ConstFactorOk
25ff0 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67 73  (pParse) ) flags
26000 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c   &= ~SQLITE_ECEL
26010 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70  _FACTOR;.  for(p
26020 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
26030 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49  =0; i<n; i++, pI
26040 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
26050 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d   *pExpr = pItem-
26060 3e 70 45 78 70 72 3b 0a 23 69 66 64 65 66 20 53  >pExpr;.#ifdef S
26070 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
26080 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
26090 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 62 53     if( pItem->bS
260a0 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20  orterRef ){.    
260b0 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 6e 2d 2d    i--;.      n--
260c0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
260d0 69 66 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  if.    if( (flag
260e0 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
260f0 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20  REF)!=0 && (j = 
26100 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
26110 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20  rByCol)>0 ){.   
26120 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53     if( flags & S
26130 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52  QLITE_ECEL_OMITR
26140 45 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2d  EF ){.        i-
26150 2d 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a  -;.        n--;.
26160 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26170 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26180 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
26190 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74 61  , j+srcReg-1, ta
261a0 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d  rget+i);.      }
261b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
261c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
261d0 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26  CEL_FACTOR)!=0 &
261e0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
261f0 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29  onstant(pExpr) )
26200 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
26210 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
26220 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
26230 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73  get+i);.    }els
26240 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52  e{.      int inR
26250 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
26260 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
26270 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
26280 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  +i);.      if( i
26290 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  nReg!=target+i )
262a0 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
262b0 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69   *pOp;.        i
262c0 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f  f( copyOp==OP_Co
262d0 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  py.         && (
262e0 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47  pOp=sqlite3VdbeG
262f0 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70  etOp(v, -1))->op
26300 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  code==OP_Copy.  
26310 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
26320 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52  1+pOp->p3+1==inR
26330 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
26340 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31  Op->p2+pOp->p3+1
26350 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20  ==target+i.     
26360 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26370 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20  pOp->p3++;.     
26380 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
263a0 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
263b0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69   inReg, target+i
263c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
263d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
263e0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
263f0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
26400 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
26410 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
26420 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
26430 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
26440 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
26450 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
26460 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
26470 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
26480 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
26490 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
264a0 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
264b0 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f  ** elimination o
264c0 66 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78  f x..**.** The x
264d0 4a 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72  JumpIf parameter
264e0 20 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61   determines deta
264f0 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55  ils:.**.**    NU
26500 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
26510 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20        Store the 
26520 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69  boolean result i
26530 6e 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20  n reg[dest].**  
26540 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
26550 72 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74  rue:      Jump t
26560 6f 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a  o dest if true.*
26570 2a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  *    sqlite3Expr
26580 49 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d  IfFalse:     Jum
26590 70 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c  p to dest if fal
265a0 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d  se.**.** The jum
265b0 70 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65  pIfNull paramete
265c0 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  r is ignored if 
265d0 78 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e  xJumpIf is NULL.
265e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
265f0 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
26600 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
26610 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
26620 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
26630 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
26640 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
26650 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45     /* The BETWEE
26660 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
26670 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
26680 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
26690 69 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61  ination or stora
266a0 67 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20  ge location */. 
266b0 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50   void (*xJump)(P
266c0 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c  arse*,Expr*,int,
266d0 69 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20  int), /* Action 
266e0 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74  to take */.  int
266f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
26700 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * Take the jump 
26710 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  if the BETWEEN i
26720 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78  s NULL */.){. Ex
26730 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20  pr exprAnd;     
26740 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61  /* The AND opera
26750 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44  tor in  x>=y AND
26760 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72   x<=z  */.  Expr
26770 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a   compLeft;    /*
26780 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d   The  x>=y  term
26790 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52   */.  Expr compR
267a0 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20  ight;   /* The  
267b0 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x<=z  term */.  
267c0 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20  Expr exprX;     
267d0 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62    /* The  x  sub
267e0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
267f0 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
26800 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75  ; /* Temporary u
26810 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a  se register */..
26820 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c  .  memset(&compL
26830 65 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  eft, 0, sizeof(E
26840 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  xpr));.  memset(
26850 26 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73  &compRight, 0, s
26860 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
26870 6d 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c  memset(&exprAnd,
26880 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
26890 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45  );..  assert( !E
268a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
268b0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
268c0 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d  ct) );.  exprX =
268d0 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a   *pExpr->pLeft;.
268e0 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54    exprAnd.op = T
268f0 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64  K_AND;.  exprAnd
26900 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65  .pLeft = &compLe
26910 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52  ft;.  exprAnd.pR
26920 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68  ight = &compRigh
26930 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70  t;.  compLeft.op
26940 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70   = TK_GE;.  comp
26950 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  Left.pLeft = &ex
26960 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  prX;.  compLeft.
26970 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
26980 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
26990 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  xpr;.  compRight
269a0 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63  .op = TK_LE;.  c
269b0 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d  ompRight.pLeft =
269c0 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52   &exprX;.  compR
269d0 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45  ight.pRight = pE
269e0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
269f0 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72  1].pExpr;.  expr
26a00 54 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72  ToRegister(&expr
26a10 58 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  X, exprCodeVecto
26a20 72 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  r(pParse, &exprX
26a30 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
26a40 20 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20   if( xJump ){.  
26a50 20 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20    xJump(pParse, 
26a60 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
26a70 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
26a80 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 72  else{.    /* Mar
26a90 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  k the expression
26aa0 20 69 73 20 62 65 69 6e 67 20 66 72 6f 6d 20 74   is being from t
26ab0 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
26ac0 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a  lause of a join.
26ad0 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74      ** so that t
26ae0 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  he sqlite3ExprCo
26af0 64 65 54 61 72 67 65 74 28 29 20 72 6f 75 74 69  deTarget() routi
26b00 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  ne will not atte
26b10 6d 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20  mpt to move.    
26b20 2a 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20 50  ** it into the P
26b30 61 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72 20  arse.pConstExpr 
26b40 6c 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c 64  list.  We should
26b50 20 75 73 65 20 61 20 6e 65 77 20 62 69 74 20 66   use a new bit f
26b60 6f 72 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a 20  or this,.    ** 
26b70 66 6f 72 20 63 6c 61 72 69 74 79 2c 20 62 75 74  for clarity, but
26b80 20 77 65 20 61 72 65 20 6f 75 74 20 6f 66 20 62   we are out of b
26b90 69 74 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e  its in the Expr.
26ba0 66 6c 61 67 73 20 66 69 65 6c 64 20 73 6f 20 77  flags field so w
26bb0 65 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f  e.    ** have to
26bc0 20 72 65 75 73 65 20 74 68 65 20 45 50 5f 46 72   reuse the EP_Fr
26bd0 6f 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d  omJoin bit.  Bum
26be0 6d 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70 72  mer. */.    expr
26bf0 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72  X.flags |= EP_Fr
26c00 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69  omJoin;.    sqli
26c10 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
26c20 74 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  t(pParse, &exprA
26c30 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20  nd, dest);.  }. 
26c40 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
26c50 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
26c60 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20  egFree1);..  /* 
26c70 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20  Ensure adequate 
26c80 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f  test coverage */
26c90 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
26ca0 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
26cb0 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66  fTrue  && jumpIf
26cc0 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
26cd0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
26ce0 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
26cf0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20  ite3ExprIfTrue  
26d00 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
26d10 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
26d20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
26d30 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
26d40 72 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70  rIfTrue  && jump
26d50 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
26d60 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
26d70 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26d80 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26d90 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21    && jumpIfNull!
26da0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
26db0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26dc0 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26dd0 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75  xprIfFalse && ju
26de0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
26df0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
26e00 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26e10 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61  =sqlite3ExprIfFa
26e20 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  lse && jumpIfNul
26e30 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
26e40 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
26e50 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
26e60 33 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20  3ExprIfFalse && 
26e70 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
26e80 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26e90 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26ea0 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26eb0 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
26ec0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
26ed0 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
26ee0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b  ase( xJump==0 );
26ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
26f00 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
26f10 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
26f20 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
26f30 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
26f40 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
26f50 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
26f60 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
26f70 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
26f80 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
26f90 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
26fa0 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
26fb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
26fc0 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
26fd0 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
26fe0 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
26ff0 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
27000 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
27010 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
27020 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
27030 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FNULL..**.** Thi
27040 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
27050 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
27060 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
27070 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
27080 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
27090 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
270a0 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
270b0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
270c0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
270d0 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
270e0 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
270f0 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
27100 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
27110 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
27120 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
27130 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
27140 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
27150 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
27160 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
27170 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
27180 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
27190 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
271a0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
271b0 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
271c0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
271d0 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
271e0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
271f0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
27200 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
27210 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
27220 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
27230 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
27240 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
27250 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
27260 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
27270 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
27280 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
27290 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65  R(v==0) )     re
272a0 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65  turn;  /* Existe
272b0 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
272c0 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
272d0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
272e0 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  pr==0) ) return;
272f0 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73    /* No way this
27300 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20   can happen */. 
27310 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
27320 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
27330 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
27340 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
27350 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
27360 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
27370 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27380 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27390 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
273a0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
273b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a  xpr->pLeft, d2,j
273c0 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
273d0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
273e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
273f0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
27400 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27410 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
27420 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
27430 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
27440 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
27450 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
27460 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
27470 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
27480 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
27490 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
274a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
274b0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
274c0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
274d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
274e0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
274f0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
27500 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
27510 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
27520 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
27530 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
27540 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
27550 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
27560 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
27570 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
27580 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
27590 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
275a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
275b0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
275c0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
275d0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
275e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
275f0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
27600 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
27610 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
27620 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
27630 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
27640 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20  e TK_TRUTH: {.  
27650 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20      int isNot;  
27660 20 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52      /* IS NOT TR
27670 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c  UE or IS NOT FAL
27680 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  SE */.      int 
27690 69 73 54 72 75 65 3b 20 20 20 20 20 2f 2a 20 49  isTrue;     /* I
276a0 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54  S TRUE or IS NOT
276b0 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 74   TRUE */.      t
276c0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
276d0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
276e0 69 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e 6f  isNot = pExpr->o
276f0 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20  p2==TK_ISNOT;.  
27700 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71 6c      isTrue = sql
27710 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c  ite3ExprTruthVal
27720 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ue(pExpr->pRight
27730 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27740 65 28 20 69 73 54 72 75 65 20 26 26 20 69 73 4e  e( isTrue && isN
27750 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ot );.      test
27760 63 61 73 65 28 20 21 69 73 54 72 75 65 20 26 26  case( !isTrue &&
27770 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
27780 69 66 28 20 69 73 54 72 75 65 20 5e 20 69 73 4e  if( isTrue ^ isN
27790 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ot ){.        sq
277a0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
277b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
277c0 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20  Left, dest,.    
277d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277e0 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51        isNot ? SQ
277f0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
27800 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  : 0);.      }els
27810 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
27820 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
27830 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27840 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20  ft, dest,.      
27850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27860 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51 4c       isNot ? SQL
27870 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 3a  ITE_JUMPIFNULL :
27880 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
27890 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
278a0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
278b0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
278c0 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  T:.      testcas
278d0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
278e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
278f0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
27900 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
27910 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
27920 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75   TK_NE;.      ju
27930 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54  mpIfNull = SQLIT
27940 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
27950 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
27960 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
27970 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
27980 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
27990 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
279a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
279b0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
279c0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
279d0 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
279e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20  pExpr->pLeft) ) 
279f0 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70  goto default_exp
27a00 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  r;.      testcas
27a10 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27a20 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
27a30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
27a40 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
27a50 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
27a60 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
27a70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27a80 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27a90 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
27aa0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
27ab0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
27ac0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
27ad0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
27ae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27af0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
27b00 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27b10 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
27b20 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
27b30 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
27b40 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27b50 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
27b60 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
27b70 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
27b80 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
27b90 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
27ba0 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
27bb0 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
27bc0 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
27bd0 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
27be0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
27bf0 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
27c00 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
27c10 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
27c20 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
27c30 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
27c40 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
27c50 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
27c60 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
27c70 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64  OP_Eq);.      Vd
27c80 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27c90 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
27ca0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
27cb0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
27cc0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27cd0 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
27ce0 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
27cf0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
27d00 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
27d10 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
27d20 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
27d30 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27d40 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
27d50 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
27d60 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
27d70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27d80 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
27d90 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
27da0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
27db0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
27dc0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
27dd0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27de0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
27df0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27e00 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
27e10 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
27e20 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61  TNULL: {.      a
27e30 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
27e40 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20  ==OP_IsNull );  
27e50 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
27e60 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
27e70 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
27e80 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
27e90 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70   ); testcase( op
27ea0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
27eb0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
27ec0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
27ed0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27ee0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
27ef0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27f00 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
27f10 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
27f20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27f30 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
27f40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
27f50 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
27f60 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
27f70 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27f80 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
27f90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27fa0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
27fb0 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
27fc0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
27fd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
27fe0 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
27ff0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
28000 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
28010 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ue, jumpIfNull);
28020 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
28030 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
28040 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
28050 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
28060 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
28070 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
28080 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
28090 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
280a0 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49  stIfNull = jumpI
280b0 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64  fNull ? dest : d
280c0 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20  estIfFalse;.    
280d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
280e0 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
280f0 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  r, destIfFalse, 
28100 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
28110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
28120 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
28130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
28140 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
28150 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
28160 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
28170 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
28180 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74  t: {.    default
28190 5f 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28  _expr:.      if(
281a0 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   exprAlwaysTrue(
281b0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
281c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
281d0 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
281e0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
281f0 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70  AlwaysFalse(pExp
28200 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
28210 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   No-op */.      
28220 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
28230 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
28240 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
28250 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
28260 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28270 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
28280 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c  OP_If, r1, dest,
28290 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
282a0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
282b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
282c0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
282d0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
282e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
282f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28300 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
28310 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
28320 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
28330 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
28340 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
28350 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
28360 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
28370 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
28380 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
28390 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
283a0 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
283b0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
283c0 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
283d0 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
283e0 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
283f0 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
28400 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
28410 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
28420 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
28430 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
28440 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
28450 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
28460 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
28470 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
28480 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
28490 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
284a0 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
284b0 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
284c0 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
284d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
284e0 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
284f0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
28500 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
28510 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
28520 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
28530 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
28540 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
28550 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
28560 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
28570 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
28580 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
28590 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
285a0 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
285b0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
285c0 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
285d0 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74  return; /* Exist
285e0 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
285f0 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
28600 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
28610 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20   )    return;.. 
28620 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
28630 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
28640 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
28650 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
28660 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
28670 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
28680 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
28690 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
286a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
286b0 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
286c0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
286d0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
286e0 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
286f0 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
28700 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
28710 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
28720 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
28740 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
28750 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
28760 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
28770 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
28780 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
28790 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
287a0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
287b0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
287d0 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
287e0 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
287f0 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
28800 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
28810 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
28820 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
28830 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
28840 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
28850 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
28860 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
28870 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
28880 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
28890 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
288a0 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
288b0 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
288c0 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
288d0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
288e0 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
288f0 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
28900 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
28910 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
28920 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
28930 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
28940 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
28950 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
28960 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
28970 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
28980 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28990 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
289a0 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
289b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
289c0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
289d0 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
289e0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
289f0 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
28a00 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
28a10 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
28a20 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
28a30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
28a40 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
28a50 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
28a60 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
28a70 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
28a80 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
28a90 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
28aa0 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
28ab0 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
28ac0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
28ad0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
28ae0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28af0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
28b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
28b10 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
28b20 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28b30 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
28b40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28b50 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
28b60 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
28b70 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
28b80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28b90 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
28ba0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
28bb0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
28bc0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
28bd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28be0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
28bf0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
28c00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
28c10 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
28c20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28c30 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
28c40 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
28c50 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
28c60 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d  ->pLeft, d2, jum
28c70 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
28c80 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
28c90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
28ca0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
28cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28cc0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
28cd0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
28ce0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
28cf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28d00 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
28d10 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
28d20 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
28d30 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
28d40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
28d50 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
28d60 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
28d70 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
28d80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28d90 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
28da0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28db0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
28dc0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
28dd0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
28de0 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20  TK_TRUTH: {.    
28df0 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20 2f    int isNot;   /
28e00 2a 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f 72  * IS NOT TRUE or
28e10 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f   IS NOT FALSE */
28e20 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 75  .      int isTru
28e30 65 3b 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f  e;  /* IS TRUE o
28e40 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f  r IS NOT TRUE */
28e50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28e60 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
28e70 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20  ;.      isNot = 
28e80 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49  pExpr->op2==TK_I
28e90 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72  SNOT;.      isTr
28ea0 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ue = sqlite3Expr
28eb0 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70 72  TruthValue(pExpr
28ec0 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
28ed0 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75   testcase( isTru
28ee0 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
28ef0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
28f00 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29  sTrue && isNot )
28f10 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72  ;.      if( isTr
28f20 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20  ue ^ isNot ){.  
28f30 20 20 20 20 20 20 2f 2a 20 49 53 20 54 52 55 45        /* IS TRUE
28f40 20 61 6e 64 20 49 53 20 4e 4f 54 20 46 41 4c 53   and IS NOT FALS
28f50 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  E */.        sql
28f60 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
28f70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28f80 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20  Left, dest,.    
28f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fa0 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30         isNot ? 0
28fb0 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   : SQLITE_JUMPIF
28fc0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 7d 65  NULL);..      }e
28fd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
28fe0 49 53 20 46 41 4c 53 45 20 61 6e 64 20 49 53 20  IS FALSE and IS 
28ff0 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20  NOT TRUE */.    
29000 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
29010 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
29020 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
29030 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29040 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
29050 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a  t ? 0 : SQLITE_J
29060 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
29070 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
29080 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
29090 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
290a0 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20  TK_ISNOT:.      
290b0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
290c0 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
290d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
290e0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
290f0 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
29100 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
29110 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f  S) ? TK_NE : TK_
29120 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66  EQ;.      jumpIf
29130 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55  Null = SQLITE_NU
29140 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46  LLEQ;.      /* F
29150 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
29160 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
29170 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
29180 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
29190 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
291a0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
291b0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
291c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
291d0 78 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70  xprIsVector(pExp
291e0 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f  r->pLeft) ) goto
291f0 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20   default_expr;. 
29200 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
29210 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
29220 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
29230 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
29240 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
29250 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
29260 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
29270 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
29280 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
29290 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
292a0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
292b0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
292c0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
292d0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292f0 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
29300 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
29310 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
29320 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
29330 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
29340 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
29350 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
29360 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
29370 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
29380 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
29390 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
293a0 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
293b0 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
293c0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
293d0 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
293e0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
293f0 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
29400 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
29410 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
29420 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
29430 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
29440 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29450 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
29460 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
29470 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  q);.      VdbeCo
29480 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
29490 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
294a0 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
294b0 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
294c0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
294d0 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
294e0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null==SQLITE_NUL
294f0 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LEQ);.      asse
29500 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
29510 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
29520 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Ne);.      Vdb
29530 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
29540 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
29550 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
29560 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
29570 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
29580 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
29590 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
295a0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74  NULLEQ);.      t
295b0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
295c0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
295d0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
295e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
295f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
29600 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
29610 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
29620 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  L: {.      r1 = 
29630 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
29640 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
29650 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
29660 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
29670 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
29680 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
29690 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
296a0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
296b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
296c0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  f(v, op==TK_ISNU
296d0 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
296e0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
296f0 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65  ULL );  VdbeCove
29700 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
29710 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
29720 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
29730 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
29740 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
29750 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
29760 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
29770 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
29780 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
29790 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
297a0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
297b0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
297c0 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  se, jumpIfNull);
297d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
297e0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
297f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
29800 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
29810 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d   {.      if( jum
29820 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  pIfNull ){.     
29830 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
29840 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
29850 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b  pr, dest, dest);
29860 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29870 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
29880 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
29890 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
298a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
298b0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
298c0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
298d0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
298e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
298f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
29900 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
29910 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
29920 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
29930 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
29940 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a   default_expr: .
29950 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
29960 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
29970 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29980 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
29990 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
299a0 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
299b0 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
299c0 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20         /* no-op 
299d0 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
299e0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
299f0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
29a00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
29a10 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
29a20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
29a30 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
29a40 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
29a50 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
29a60 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
29a70 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
29a80 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
29a90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
29aa0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
29ab0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
29ac0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
29ad0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
29ae0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
29af0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
29b00 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
29b10 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
29b20 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d  se, regFree2);.}
29b30 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c  ../*.** Like sql
29b40 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
29b50 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20  ) except that a 
29b60 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
29b70 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20  pExpr before.** 
29b80 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c  code generation,
29b90 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69   and that copy i
29ba0 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20  s deleted after 
29bb0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
29bc0 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73   This.** ensures
29bd0 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
29be0 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68  al pExpr is unch
29bf0 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anged..*/.void s
29c00 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
29c10 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  eDup(Parse *pPar
29c20 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
29c30 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75   int dest,int ju
29c40 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c  mpIfNull){.  sql
29c50 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
29c60 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
29c70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78  Copy = sqlite3Ex
29c80 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
29c90 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
29ca0 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
29cb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
29cc0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
29cd0 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75   pCopy, dest, ju
29ce0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  mpIfNull);.  }. 
29cf0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
29d00 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d  te(db, pCopy);.}
29d10 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
29d20 6f 6e 20 70 56 61 72 20 69 73 20 67 75 61 72 61  on pVar is guara
29d30 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 53  nteed to be an S
29d40 51 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45 78  QL variable. pEx
29d50 70 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a 2a  pr may be any.**
29d60 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73 73   type of express
29d70 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ion..**.** If pE
29d80 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20  xpr is a simple 
29d90 53 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20 69  SQL value - an i
29da0 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74  nteger, real, st
29db0 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72  ring, blob.** or
29dc0 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74 68   NULL value - th
29dd0 65 6e 20 74 68 65 20 56 44 42 45 20 63 75 72 72  en the VDBE curr
29de0 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65 70  ently being prep
29df0 61 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75 72  ared is configur
29e00 65 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65 70  ed.** to re-prep
29e10 61 72 65 20 65 61 63 68 20 74 69 6d 65 20 61 20  are each time a 
29e20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f 75  new value is bou
29e30 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70  nd to variable p
29e40 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74  Var..**.** Addit
29e50 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78 70  ionally, if pExp
29e60 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51  r is a simple SQ
29e70 4c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  L value and the 
29e80 76 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20  value is the.** 
29e90 73 61 6d 65 20 61 73 20 74 68 61 74 20 63 75 72  same as that cur
29ea0 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f 20  rently bound to 
29eb0 76 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20 6e  variable pVar, n
29ec0 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
29ed0 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
29ee0 65 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 73  e, if the values
29ef0 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d   are not the sam
29f00 65 20 6f 72 20 69 66 20 70 45 78 70 72 20 69 73  e or if pExpr is
29f10 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a 2a   not a simple.**
29f20 20 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72 6f   SQL value, zero
29f30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
29f40 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
29f50 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28  CompareVariable(
29f60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
29f70 78 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72 20  xpr *pVar, Expr 
29f80 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
29f90 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  es = 0;.  int iV
29fa0 61 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ar;.  sqlite3_va
29fb0 6c 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20 30  lue *pL, *pR = 0
29fc0 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56 61  ;.  .  sqlite3Va
29fd0 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
29fe0 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53  se->db, pExpr, S
29ff0 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
2a000 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70 52  TE_AFF_BLOB, &pR
2a010 29 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a 20  );.  if( pR ){. 
2a020 20 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d 3e     iVar = pVar->
2a030 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c  iColumn;.    sql
2a040 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
2a050 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sk(pParse->pVdbe
2a060 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c 20  , iVar);.    pL 
2a070 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
2a080 42 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72 73  BoundValue(pPars
2a090 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69  e->pReprepare, i
2a0a0 56 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Var, SQLITE_AFF_
2a0b0 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70  BLOB);.    if( p
2a0c0 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  L ){.      if( s
2a0d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2a0e0 65 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54 45  e(pL)==SQLITE_TE
2a0f0 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  XT ){.        sq
2a100 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
2a110 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75  (pL); /* Make su
2a120 72 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  re the encoding 
2a130 69 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20  is UTF-8 */.    
2a140 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20    }.      res = 
2a150 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43 6f   0==sqlite3MemCo
2a160 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30 29  mpare(pL, pR, 0)
2a170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2a180 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 29  te3ValueFree(pR)
2a190 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
2a1a0 75 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d 0a  ueFree(pL);.  }.
2a1b0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
2a1c0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
2a1d0 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
2a1e0 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
2a1f0 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
2a200 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
2a210 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
2a220 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
2a230 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
2a240 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
2a250 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
2a260 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
2a270 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
2a280 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
2a290 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
2a2a0 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
2a2b0 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
2a2c0 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
2a2d0 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
2a2e0 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
2a2f0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
2a300 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
2a310 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
2a320 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
2a330 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
2a340 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
2a350 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
2a360 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
2a370 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
2a380 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
2a390 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
2a3a0 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
2a3b0 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
2a3c0 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
2a3d0 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
2a3e0 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
2a3f0 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
2a400 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
2a410 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
2a420 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
2a430 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
2a440 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
2a450 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
2a460 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
2a470 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
2a480 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
2a490 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
2a4a0 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
2a4b0 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
2a4c0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
2a4d0 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
2a4e0 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
2a4f0 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
2a500 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
2a510 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
2a520 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
2a530 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
2a540 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
2a550 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
2a560 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
2a570 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
2a580 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
2a590 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
2a5a0 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
2a5b0 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
2a5c0 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
2a5d0 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
2a5e0 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
2a5f0 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
2a600 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
2a610 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
2a620 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
2a630 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
2a640 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
2a650 20 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e   pParse is not N
2a660 55 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52 49  ULL then TK_VARI
2a670 41 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70 41  ABLE terms in pA
2a680 20 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20 69   with bindings i
2a690 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52 65  n.** pParse->pRe
2a6a0 70 72 65 70 61 72 65 20 63 61 6e 20 62 65 20 6d  prepare can be m
2a6b0 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 6c  atched against l
2a6c0 69 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20 20  iterals in pB.  
2a6d0 54 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  The .** pParse->
2a6e0 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 62  pVdbe->expmask b
2a6f0 69 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74 65  itmask is update
2a700 64 20 66 6f 72 20 65 61 63 68 20 76 61 72 69 61  d for each varia
2a710 62 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e 0a  ble referenced..
2a720 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20  ** If pParse is 
2a730 4e 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61 6c  NULL (the normal
2a740 20 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79 20   case) then any 
2a750 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d  TK_VARIABLE term
2a760 20 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74   in .** Argument
2a770 20 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20 6e   pParse should n
2a780 6f 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e  ormally be NULL.
2a790 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
2a7a0 4c 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a 20  LL and pA or.** 
2a7b0 70 42 20 63 61 75 73 65 73 20 61 20 72 65 74 75  pB causes a retu
2a7c0 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a 2a  rn value of 2..*
2a7d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2a7e0 72 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a  rCompare(Parse *
2a7f0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 41  pParse, Expr *pA
2a800 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
2a810 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d  iTab){.  u32 com
2a820 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66  binedFlags;.  if
2a830 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
2a840 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2a850 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
2a860 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 20   }.  if( pParse 
2a870 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41  && pA->op==TK_VA
2a880 52 49 41 42 4c 45 20 26 26 20 65 78 70 72 43 6f  RIABLE && exprCo
2a890 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 70 50  mpareVariable(pP
2a8a0 61 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29 7b  arse, pA, pB) ){
2a8b0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2a8c0 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61   }.  combinedFla
2a8d0 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c  gs = pA->flags |
2a8e0 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66   pB->flags;.  if
2a8f0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
2a900 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
2a910 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  .    if( (pA->fl
2a920 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50  ags&pB->flags&EP
2a930 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26  _IntValue)!=0 &&
2a940 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70   pA->u.iValue==p
2a950 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
2a960 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2a970 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2a980 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
2a990 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20  >op!=pB->op ){. 
2a9a0 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
2a9b0 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
2a9c0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2a9d0 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66  pParse, pA->pLef
2a9e0 74 2c 70 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a  t,pB,iTab)<2 ){.
2a9f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2aa00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
2aa10 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
2aa20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
2aa30 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2aa40 41 2c 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62  A,pB->pLeft,iTab
2aa50 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
2aa60 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2aa70 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
2aa80 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
2aa90 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70  COLUMN && pA->op
2aaa0 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
2aab0 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  && pA->u.zToken 
2aac0 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
2aad0 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
2aae0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
2aaf0 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75  te3StrICmp(pA->u
2ab00 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
2ab10 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72  oken)!=0 ) retur
2ab20 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 2;.    }else i
2ab30 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
2ab40 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  LLATE ){.      i
2ab50 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2ab60 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
2ab70 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
2ab80 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
2ab90 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
2aba0 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
2abb0 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
2abc0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2abd0 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
2abe0 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
2abf0 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
2ac00 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
2ac10 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
2ac20 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   2;.  if( ALWAYS
2ac30 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ((combinedFlags 
2ac40 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d  & EP_TokenOnly)=
2ac50 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63  =0) ){.    if( c
2ac60 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
2ac70 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65  P_xIsSelect ) re
2ac80 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
2ac90 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
2aca0 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 3d 3d 30   EP_FixedCol)==0
2acb0 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
2acc0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2acd0 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 20 70  se, pA->pLeft, p
2ace0 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20  B->pLeft, iTab) 
2acf0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2ad00 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2ad10 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2ad20 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70  A->pRight, pB->p
2ad30 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 20 72  Right, iTab) ) r
2ad40 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
2ad50 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2ad60 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c  Compare(pA->x.pL
2ad70 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74  ist, pB->x.pList
2ad80 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
2ad90 20 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   2;.    assert( 
2ada0 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
2adb0 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20   EP_Reduced)==0 
2adc0 29 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  );.    if( pA->o
2add0 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 26 26 20  p!=TK_STRING && 
2ade0 70 41 2d 3e 6f 70 21 3d 54 4b 5f 54 52 55 45 46  pA->op!=TK_TRUEF
2adf0 41 4c 53 45 20 29 7b 0a 20 20 20 20 20 20 69 66  ALSE ){.      if
2ae00 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  ( pA->iColumn!=p
2ae10 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
2ae20 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28  urn 2;.      if(
2ae30 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
2ae40 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20  >iTable .       
2ae50 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d  && (pA->iTable!=
2ae60 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42  iTab || NEVER(pB
2ae70 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20  ->iTable>=0)) ) 
2ae80 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
2ae90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2aea0 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
2aeb0 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74     /* Justificat
2aec0 69 6f 6e 20 66 6f 72 20 74 68 65 20 61 73 73 65  ion for the asse
2aed0 72 74 28 29 3a 0a 20 20 20 20 2a 2a 20 77 69 6e  rt():.    ** win
2aee0 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 68 61  dow functions ha
2aef0 76 65 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  ve p->op==TK_FUN
2af00 43 54 49 4f 4e 20 62 75 74 20 61 67 67 72 65 67  CTION but aggreg
2af10 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20  ate functions.  
2af20 20 20 2a 2a 20 68 61 76 65 20 70 2d 3e 6f 70 3d    ** have p->op=
2af30 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2af40 2e 20 20 53 6f 20 61 6e 79 20 63 6f 6d 70 61 72  .  So any compar
2af50 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 6e 20  ison between an 
2af60 61 67 67 72 65 67 61 74 65 0a 20 20 20 20 2a 2a  aggregate.    **
2af70 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 61 20   function and a 
2af80 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
2af90 73 68 6f 75 6c 64 20 68 61 76 65 20 66 61 69 6c  should have fail
2afa0 65 64 20 62 65 66 6f 72 65 20 72 65 61 63 68 69  ed before reachi
2afb0 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 70  ng.    ** this p
2afc0 6f 69 6e 74 2e 20 20 41 6e 64 2c 20 69 74 20 69  oint.  And, it i
2afd0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
2afe0 6f 20 68 61 76 65 20 61 20 77 69 6e 64 6f 77 20  o have a window 
2aff0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 20 20 20  function and.   
2b000 20 2a 2a 20 61 20 73 63 61 6c 61 72 20 66 75 6e   ** a scalar fun
2b010 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73  ction with the s
2b020 61 6d 65 20 6e 61 6d 65 20 61 6e 64 20 6e 75 6d  ame name and num
2b030 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2b040 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 69 66 20  .  So.    ** if 
2b050 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
2b060 69 6e 74 2c 20 65 69 74 68 65 72 20 41 20 61 6e  int, either A an
2b070 64 20 42 20 62 6f 74 68 20 77 69 6e 64 6f 77 20  d B both window 
2b080 66 75 6e 63 74 69 6f 6e 73 20 6f 72 0a 20 20 20  functions or.   
2b090 20 2a 2a 20 6e 65 69 74 68 65 72 20 61 72 65 20   ** neither are 
2b0a0 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  a window functio
2b0b0 6e 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ns. */.    asser
2b0c0 74 28 20 28 70 41 2d 3e 70 57 69 6e 3d 3d 30 29  t( (pA->pWin==0)
2b0d0 3d 3d 28 70 42 2d 3e 70 57 69 6e 3d 3d 30 29 20  ==(pB->pWin==0) 
2b0e0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 41 2d 3e  );..    if( pA->
2b0f0 70 57 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20 20  pWin!=0 ){.     
2b100 20 69 66 28 20 73 71 6c 69 74 65 33 57 69 6e 64   if( sqlite3Wind
2b110 6f 77 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  owCompare(pParse
2b120 2c 70 41 2d 3e 70 57 69 6e 2c 70 42 2d 3e 70 57  ,pA->pWin,pB->pW
2b130 69 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  in)!=0 ) return 
2b140 32 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  2;.    }.#endif.
2b150 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2b160 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
2b170 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
2b180 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
2b190 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
2b1a0 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
2b1b0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
2b1c0 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
2b1d0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
2b1e0 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
2b1f0 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
2b200 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
2b210 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
2b220 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
2b230 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
2b240 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
2b250 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
2b260 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Tab..**.** This 
2b270 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
2b280 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
2b290 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
2b2a0 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
2b2b0 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
2b2c0 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
2b2d0 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
2b2e0 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
2b2f0 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
2b300 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
2b310 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
2b320 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
2b330 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
2b340 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
2b350 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
2b360 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
2b370 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
2b380 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
2b390 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
2b3a0 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
2b3b0 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
2b3c0 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
2b3d0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
2b3e0 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
2b3f0 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
2b400 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
2b410 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2b420 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
2b430 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
2b440 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
2b450 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
2b460 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
2b470 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
2b480 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
2b490 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
2b4a0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
2b4b0 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
2b4c0 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
2b4d0 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
2b4e0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
2b4f0 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
2b500 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
2b510 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
2b520 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2b530 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
2b540 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20  pExprA, pExprB, 
2b550 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31  iTab) ) return 1
2b560 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2b570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
2b580 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2b590 72 65 28 29 20 65 78 63 65 70 74 20 43 4f 4c 4c  re() except COLL
2b5a0 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 74  ATE operators at
2b5b0 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a   the top-level.*
2b5c0 2a 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a  * are ignored..*
2b5d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2b5e0 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 45 78 70  rCompareSkip(Exp
2b5f0 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c  r *pA, Expr *pB,
2b600 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 72 65   int iTab){.  re
2b610 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
2b620 43 6f 6d 70 61 72 65 28 30 2c 0a 20 20 20 20 20  Compare(0,.     
2b630 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2b640 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
2b650 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  A),.            
2b660 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
2b670 43 6f 6c 6c 61 74 65 28 70 42 29 2c 0a 20 20 20  Collate(pB),.   
2b680 20 20 20 20 20 20 20 20 20 20 69 54 61 62 29 3b            iTab);
2b690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2b6a0 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e 20   true if we can 
2b6b0 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77 69  prove the pE2 wi
2b6c0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ll always be tru
2b6d0 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74  e if pE1 is.** t
2b6e0 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  rue.  Return fal
2b6f0 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  se if we cannot 
2b700 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f  complete the pro
2b710 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67  of or if pE2 mig
2b720 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20  ht.** be false. 
2b730 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
2b740 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20       pE1: x==5  
2b750 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
2b760 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
2b770 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
2b780 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70  E1: x>0        p
2b790 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
2b7a0 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c       Result: fal
2b7b0 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  se.**     pE1: x
2b7c0 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20 78  =21       pE2: x
2b7d0 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20  =21 OR y=43     
2b7e0 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2b7f0 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20      pE1: x!=123 
2b800 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
2b810 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
2b820 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
2b830 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45  1: x!=?1      pE
2b840 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2b850 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
2b860 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
2b870 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49  S NULL  pE2: x I
2b880 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
2b890 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20  sult: false.**  
2b8a0 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20     pE1: x IS ?2 
2b8b0 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
2b8c0 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a   NULL    Reuslt:
2b8d0 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65   false.**.** Whe
2b8e0 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43  n comparing TK_C
2b8f0 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77  OLUMN nodes betw
2b900 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c  een pE1 and pE2,
2b910 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45   if pE2 has.** E
2b920 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65  xpr.iTable<0 the
2b930 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65  n assume a table
2b940 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79   number given by
2b950 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   iTab..**.** If 
2b960 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55  pParse is not NU
2b970 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  LL, then the val
2b980 75 65 73 20 6f 66 20 62 6f 75 6e 64 20 76 61 72  ues of bound var
2b990 69 61 62 6c 65 73 20 69 6e 20 70 45 31 20 61 72  iables in pE1 ar
2b9a0 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 65 64 20 61  e .** compared a
2b9b0 67 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 20 76  gainst literal v
2b9c0 61 6c 75 65 73 20 69 6e 20 70 45 32 20 61 6e 64  alues in pE2 and
2b9d0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e   pParse->pVdbe->
2b9e0 65 78 70 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f  expmask is.** mo
2b9f0 64 69 66 69 65 64 20 74 6f 20 72 65 63 6f 72 64  dified to record
2ba00 20 77 68 69 63 68 20 62 6f 75 6e 64 20 76 61 72   which bound var
2ba10 69 61 62 6c 65 73 20 61 72 65 20 72 65 66 65 72  iables are refer
2ba20 65 6e 63 65 64 2e 20 20 49 66 20 70 50 61 72 73  enced.  If pPars
2ba30 65 20 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74  e .** is NULL, t
2ba40 68 65 6e 20 66 61 6c 73 65 20 77 69 6c 6c 20 62  hen false will b
2ba50 65 20 72 65 74 75 72 6e 65 64 20 69 66 20 70 45  e returned if pE
2ba60 31 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 62  1 contains any b
2ba70 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 2e 0a  ound variables..
2ba80 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f  **.** When in do
2ba90 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73  ubt, return fals
2baa0 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72  e.  Returning tr
2bab0 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  ue might give a 
2bac0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
2bad0 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74  mprovement.  Ret
2bae0 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67  urning false mig
2baf0 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f  ht cause a perfo
2bb00 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
2bb10 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c  , but.** it will
2bb20 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65   always give the
2bb30 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
2bb40 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77  and is hence alw
2bb50 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74  ays safe..*/.int
2bb60 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2bb70 69 65 73 45 78 70 72 28 50 61 72 73 65 20 2a 70  iesExpr(Parse *p
2bb80 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 31  Parse, Expr *pE1
2bb90 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74  , Expr *pE2, int
2bba0 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71   iTab){.  if( sq
2bbb0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2bbc0 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45  (pParse, pE1, pE
2bbd0 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20  2, iTab)==0 ){. 
2bbe0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
2bbf0 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
2bc00 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c  TK_OR.   && (sql
2bc10 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2bc20 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c  xpr(pParse, pE1,
2bc30 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
2bc40 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b).             
2bc50 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  || sqlite3ExprIm
2bc60 70 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65  pliesExpr(pParse
2bc70 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67  , pE1, pE2->pRig
2bc80 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b  ht, iTab) ).  ){
2bc90 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2bca0 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70   }.  if( pE2->op
2bcb0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20  ==TK_NOTNULL && 
2bcc0 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55  pE1->op!=TK_ISNU
2bcd0 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54  LL && pE1->op!=T
2bce0 4b 5f 49 53 20 29 7b 0a 20 20 20 20 45 78 70 72  K_IS ){.    Expr
2bcf0 20 2a 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78   *pX = sqlite3Ex
2bd00 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
2bd10 31 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 74  1->pLeft);.    t
2bd20 65 73 74 63 61 73 65 28 20 70 58 21 3d 70 45 31  estcase( pX!=pE1
2bd30 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 69  ->pLeft );.    i
2bd40 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2bd50 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 58  mpare(pParse, pX
2bd60 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54  , pE2->pLeft, iT
2bd70 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ab)==0 ) return 
2bd80 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
2bd90 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
2bda0 20 69 73 20 74 68 65 20 45 78 70 72 20 6e 6f 64   is the Expr nod
2bdb0 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73  e callback for s
2bdc0 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2bdd0 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 29 2e 0a 2a  sNotNullRow()..*
2bde0 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
2bdf0 69 6f 6e 20 6e 6f 64 65 20 72 65 71 75 69 72 65  ion node require
2be00 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  s that the table
2be10 20 61 74 20 70 57 61 6c 6b 65 72 2d 3e 69 43 75   at pWalker->iCu
2be20 72 0a 2a 2a 20 68 61 76 65 20 61 20 6e 6f 6e 2d  r.** have a non-
2be30 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  NULL column, the
2be40 6e 20 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65  n set pWalker->e
2be50 43 6f 64 65 20 74 6f 20 31 20 61 6e 64 20 61 62  Code to 1 and ab
2be60 6f 72 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ort..*/.static i
2be70 6e 74 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c  nt impliesNotNul
2be80 6c 52 6f 77 28 57 61 6c 6b 65 72 20 2a 70 57 61  lRow(Walker *pWa
2be90 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
2bea0 72 29 7b 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  r){.  /* This ro
2beb0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
2bec0 6c 6c 65 64 20 66 6f 72 20 57 48 45 52 45 20 63  lled for WHERE c
2bed0 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e  lause expression
2bee0 73 20 61 6e 64 20 73 6f 20 69 74 0a 20 20 2a 2a  s and so it.  **
2bef0 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 61 6e 79   cannot have any
2bf00 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 65   TK_AGG_COLUMN e
2bf10 6e 74 72 69 65 73 20 62 65 63 61 75 73 65 20 74  ntries because t
2bf20 68 6f 73 65 20 61 72 65 20 6f 6e 6c 79 20 66 6f  hose are only fo
2bf30 75 6e 64 0a 20 20 2a 2a 20 69 6e 20 48 41 56 49  und.  ** in HAVI
2bf40 4e 47 20 63 6c 61 75 73 65 73 2e 20 20 57 65 20  NG clauses.  We 
2bf50 63 61 6e 20 67 65 74 20 61 20 54 4b 5f 41 47 47  can get a TK_AGG
2bf60 5f 46 55 4e 43 54 49 4f 4e 20 69 6e 20 61 20 57  _FUNCTION in a W
2bf70 48 45 52 45 20 63 6c 61 75 73 65 2c 0a 20 20 2a  HERE clause,.  *
2bf80 2a 20 62 75 74 20 74 68 61 74 20 69 73 20 61 6e  * but that is an
2bf90 20 69 6c 6c 65 67 61 6c 20 63 6f 6e 73 74 72 75   illegal constru
2bfa0 63 74 20 61 6e 64 20 74 68 65 20 71 75 65 72 79  ct and the query
2bfb0 20 77 69 6c 6c 20 62 65 20 72 65 6a 65 63 74 65   will be rejecte
2bfc0 64 20 61 74 0a 20 20 2a 2a 20 61 20 6c 61 74 65  d at.  ** a late
2bfd0 72 20 73 74 61 67 65 20 6f 66 20 70 72 6f 63 65  r stage of proce
2bfe0 73 73 69 6e 67 2c 20 73 6f 20 74 68 65 20 54 4b  ssing, so the TK
2bff0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 63 61  _AGG_FUNCTION ca
2c000 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  se does not.  **
2c010 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73   need to be cons
2c020 69 64 65 72 65 64 20 68 65 72 65 2e 20 2a 2f 0a  idered here. */.
2c030 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
2c040 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
2c050 4d 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  MN );.  testcase
2c060 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c070 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
2c080 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
2c090 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2c0a0 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
2c0b0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2c0c0 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
2c0d0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
2c0e0 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73  K_ISNOT:.    cas
2c0f0 65 20 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61  e TK_NOT:.    ca
2c100 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
2c110 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
2c120 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
2c130 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a    case TK_CASE:.
2c140 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a      case TK_IN:.
2c150 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
2c160 54 49 4f 4e 3a 0a 20 20 20 20 20 20 74 65 73 74  TION:.      test
2c170 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2c180 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
2c190 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2c1a0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29  pr->op==TK_NOT )
2c1b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2c1c0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c1d0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
2c1e0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2c1f0 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
2c200 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c210 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
2c220 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2c230 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c240 43 41 53 45 20 29 3b 0a 20 20 20 20 20 20 74 65  CASE );.      te
2c250 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2c260 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20  p==TK_IN );.    
2c270 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2c280 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  r->op==TK_FUNCTI
2c290 4f 4e 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ON );.      retu
2c2a0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2c2b0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
2c2c0 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
2c2d0 6b 65 72 2d 3e 75 2e 69 43 75 72 3d 3d 70 45 78  ker->u.iCur==pEx
2c2e0 70 72 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20  pr->iTable ){.  
2c2f0 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
2c300 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Code = 1;.      
2c310 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
2c320 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
2c330 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2c340 6e 65 3b 0a 0a 20 20 20 20 2f 2a 20 56 69 72 74  ne;..    /* Virt
2c350 75 61 6c 20 74 61 62 6c 65 73 20 61 72 65 20 61  ual tables are a
2c360 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 63 6f  llowed to use co
2c370 6e 73 74 72 61 69 6e 74 73 20 6c 69 6b 65 20 78  nstraints like x
2c380 3d 4e 55 4c 4c 2e 20 20 53 6f 0a 20 20 20 20 2a  =NULL.  So.    *
2c390 2a 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * a term of the 
2c3a0 66 6f 72 6d 20 78 3d 79 20 64 6f 65 73 20 6e 6f  form x=y does no
2c3b0 74 20 70 72 6f 76 65 20 74 68 61 74 20 79 20 69  t prove that y i
2c3c0 73 20 6e 6f 74 20 6e 75 6c 6c 20 69 66 20 78 0a  s not null if x.
2c3d0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 6f      ** is the co
2c3e0 6c 75 6d 6e 20 6f 66 20 61 20 76 69 72 74 75 61  lumn of a virtua
2c3f0 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63  l table */.    c
2c400 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63  ase TK_EQ:.    c
2c410 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
2c420 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
2c430 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
2c440 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
2c450 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20  ase TK_GE:.     
2c460 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2c470 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20  ->op==TK_EQ );. 
2c480 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2c490 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20  Expr->op==TK_NE 
2c4a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2c4b0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2c4c0 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
2c4d0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2c4e0 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20  ==TK_LE );.     
2c4f0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2c500 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ->op==TK_GT );. 
2c510 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2c520 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20  Expr->op==TK_GE 
2c530 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 45  );.      if( (pE
2c540 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
2c550 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56  TK_COLUMN && IsV
2c560 69 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 4c  irtual(pExpr->pL
2c570 65 66 74 2d 3e 70 54 61 62 29 29 0a 20 20 20 20  eft->pTab)).    
2c580 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70 52     || (pExpr->pR
2c590 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ight->op==TK_COL
2c5a0 55 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c  UMN && IsVirtual
2c5b0 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
2c5c0 70 54 61 62 29 29 0a 20 20 20 20 20 20 29 7b 0a  pTab)).      ){.
2c5d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2c5e0 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
2c5f0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
2c600 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
2c610 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a  ontinue;.  }.}..
2c620 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
2c630 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  e (non-zero) if 
2c640 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 61 6e  expression p can
2c650 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69 66   only be true if
2c660 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65   at least.** one
2c670 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
2c680 20 69 54 61 62 20 69 73 20 6e 6f 6e 2d 6e 75 6c   iTab is non-nul
2c690 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  l.  In other wor
2c6a0 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75 65 0a  ds, return true.
2c6b0 2a 2a 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e  ** if expression
2c6c0 20 70 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62   p will always b
2c6d0 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20  e NULL or false 
2c6e0 69 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  if every column 
2c6f0 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55  of iTab.** is NU
2c700 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20  LL..**.** False 
2c710 6e 65 67 61 74 69 76 65 73 20 61 72 65 20 61 63  negatives are ac
2c720 63 65 70 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74  ceptable.  In ot
2c730 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 69 73  her words, it is
2c740 20 6f 6b 20 74 6f 20 72 65 74 75 72 6e 0a 2a 2a   ok to return.**
2c750 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 65 78   zero even if ex
2c760 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20  pression p will 
2c770 6e 65 76 65 72 20 62 65 20 74 72 75 65 20 6f 66  never be true of
2c780 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
2c790 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c   iTab.** is NULL
2c7a0 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74  .  A false negat
2c7b0 69 76 65 20 69 73 20 6d 65 72 65 6c 79 20 61 20  ive is merely a 
2c7c0 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a 61 74  missed optimizat
2c7d0 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e  ion opportunity.
2c7e0 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 70 6f 73  .**.** False pos
2c7f0 69 74 69 76 65 73 20 61 72 65 20 6e 6f 74 20 61  itives are not a
2c800 6c 6c 6f 77 65 64 2c 20 68 6f 77 65 76 65 72 2e  llowed, however.
2c810 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
2c820 76 65 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  ve may result.**
2c830 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74   in an incorrect
2c840 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   answer..**.** T
2c850 65 72 6d 73 20 6f 66 20 70 20 74 68 61 74 20 61  erms of p that a
2c860 72 65 20 6d 61 72 6b 65 64 20 77 69 74 68 20 45  re marked with E
2c870 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61 6e 64 20  P_FromJoin (and 
2c880 68 65 6e 63 65 20 74 68 61 74 20 63 6f 6d 65 20  hence that come 
2c890 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f 4e 20 6f  from.** the ON o
2c8a0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
2c8b0 6f 66 20 4c 45 46 54 20 4a 4f 49 4e 53 29 20 61  of LEFT JOINS) a
2c8c0 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
2c8d0 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a 2a   the analysis..*
2c8e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2c8f0 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
2c900 63 6b 20 69 66 20 61 20 4c 45 46 54 20 4a 4f 49  ck if a LEFT JOI
2c910 4e 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72 74  N can be convert
2c920 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 6f 72  ed into.** an or
2c930 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 20 20 54 68  dinary JOIN.  Th
2c940 65 20 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20  e p argument is 
2c950 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2c960 2e 20 20 49 66 20 74 68 65 20 57 48 45 52 45 0a  .  If the WHERE.
2c970 2a 2a 20 63 6c 61 75 73 65 20 72 65 71 75 69 72  ** clause requir
2c980 65 73 20 74 68 61 74 20 73 6f 6d 65 20 63 6f 6c  es that some col
2c990 75 6d 6e 20 6f 66 20 74 68 65 20 72 69 67 68 74  umn of the right
2c9a0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 4c 45   table of the LE
2c9b0 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65 20 6e 6f  FT JOIN.** be no
2c9c0 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  n-NULL, then the
2c9d0 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62   LEFT JOIN can b
2c9e0 65 20 73 61 66 65 6c 79 20 63 6f 6e 76 65 72 74  e safely convert
2c9f0 65 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 6f 72  ed into an.** or
2ca00 64 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a  dinary join..*/.
2ca10 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
2ca20 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77  mpliesNonNullRow
2ca30 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
2ca40 61 62 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ab){.  Walker w;
2ca50 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2ca60 63 6b 20 3d 20 69 6d 70 6c 69 65 73 4e 6f 74 4e  ck = impliesNotN
2ca70 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e 78 53 65 6c  ullRow;.  w.xSel
2ca80 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
2ca90 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2caa0 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 65  back2 = 0;.  w.e
2cab0 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  Code = 0;.  w.u.
2cac0 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 73  iCur = iTab;.  s
2cad0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
2cae0 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
2caf0 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  w.eCode;.}../*.*
2cb00 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2cb10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2cb20 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
2cb30 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c   by the tree wal
2cb40 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ker.** to determ
2cb50 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72 65 73  ine if an expres
2cb60 73 69 6f 6e 20 63 61 6e 20 62 65 20 65 76 61 6c  sion can be eval
2cb70 75 61 74 65 64 20 62 79 20 72 65 66 65 72 65 6e  uated by referen
2cb80 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64  ce to the.** ind
2cb90 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f 75 74  ex only, without
2cba0 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20 61 20   having to do a 
2cbb0 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 63  search for the c
2cbc0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
2cbd0 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 20 54 68  table entry.  Th
2cbe0 65 20 49 64 78 43 6f 76 65 72 2e 70 49 64 78 20  e IdxCover.pIdx 
2cbf0 66 69 65 6c 64 20 69 73 20 74 68 65 20 69 6e 64  field is the ind
2cc00 65 78 2e 20 20 49 64 78 43 6f 76 65 72 2e 69 43  ex.  IdxCover.iC
2cc10 75 72 0a 2a 2a 20 69 73 20 74 68 65 20 63 75 72  ur.** is the cur
2cc20 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  sor for the tabl
2cc30 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78  e..*/.struct Idx
2cc40 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65 78 20  Cover {.  Index 
2cc50 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68  *pIdx;     /* Th
2cc60 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74 65  e index to be te
2cc70 73 74 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67  sted for coverag
2cc80 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  e */.  int iCur;
2cc90 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
2cca0 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
2ccb0 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e   table correspon
2ccc0 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65  ding to the inde
2ccd0 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  x */.};../*.** C
2cce0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
2ccf0 68 65 72 65 20 61 72 65 20 72 65 66 65 72 65 6e  here are referen
2cd00 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
2cd10 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 61 6c  n table .** pWal
2cd20 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2cd30 2d 3e 69 43 75 72 20 63 61 6e 20 62 65 20 73 61  ->iCur can be sa
2cd40 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 74 68  tisfied using th
2cd50 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61 6c 6b  e index.** pWalk
2cd60 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
2cd70 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  >pIdx..*/.static
2cd80 20 69 6e 74 20 65 78 70 72 49 64 78 43 6f 76 65   int exprIdxCove
2cd90 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
2cda0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2cdb0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2cdc0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26  ==TK_COLUMN.   &
2cdd0 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
2cde0 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78  =pWalker->u.pIdx
2cdf0 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20 20 26  Cover->iCur.   &
2ce00 26 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  & sqlite3ColumnO
2ce10 66 49 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d 3e  fIndex(pWalker->
2ce20 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64  u.pIdxCover->pId
2ce30 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  x, pExpr->iColum
2ce40 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70 57  n)<0.  ){.    pW
2ce50 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31  alker->eCode = 1
2ce60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
2ce70 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65  _Abort;.  }.  re
2ce80 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2ce90 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  e;.}../*.** Dete
2cea0 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e 64 65  rmine if an inde
2ceb0 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c 65 20  x pIdx on table 
2cec0 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72  with cursor iCur
2ced0 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a 2a   contains will.*
2cee0 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
2cef0 20 70 45 78 70 72 2e 20 20 52 65 74 75 72 6e 20   pExpr.  Return 
2cf00 74 72 75 65 20 69 66 20 74 68 65 20 69 6e 64 65  true if the inde
2cf10 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74 68 65  x does cover the
2cf20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
2cf30 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  nd false if the 
2cf40 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
2cf50 20 72 65 66 65 72 65 6e 63 65 73 20 74 61 62 6c   references tabl
2cf60 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61  e columns.** tha
2cf70 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64 20  t are not found 
2cf80 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  in the index pId
2cf90 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65  x..**.** An inde
2cfa0 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20 65 78  x covering an ex
2cfb0 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20 74  pression means t
2cfc0 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
2cfd0 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76 61  on can be.** eva
2cfe0 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f 6e 6c  luated using onl
2cff0 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  y the index and 
2d000 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
2d010 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a 20  o lookup the.** 
2d020 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
2d030 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e  ble entry..*/.in
2d040 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76  t sqlite3ExprCov
2d050 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20 20 45  eredByIndex(.  E
2d060 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
2d070 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
2d080 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a 2f 0a  to be tested */.
2d090 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
2d0a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
2d0b0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
2d0c0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2d0d0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64 65   table */.  Inde
2d0e0 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2d0f0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61  /* The index tha
2d100 74 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  t might be used 
2d110 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  for coverage */.
2d120 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
2d130 20 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72   struct IdxCover
2d140 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74 28   xcov;.  memset(
2d150 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
2d160 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72 20 3d  );.  xcov.iCur =
2d170 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70 49   iCur;.  xcov.pI
2d180 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e 78  dx = pIdx;.  w.x
2d190 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
2d1a0 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20 20 77  xprIdxCover;.  w
2d1b0 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d 20 26  .u.pIdxCover = &
2d1c0 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33 57  xcov;.  sqlite3W
2d1d0 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
2d1e0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e  r);.  return !w.
2d1f0 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  eCode;.}.../*.**
2d200 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2d210 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2d220 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
2d230 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  by the tree walk
2d240 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72  er.** to count r
2d250 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
2d260 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  le columns in th
2d270 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61  e arguments of a
2d280 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20  n .** aggregate 
2d290 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64  function, in ord
2d2a0 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
2d2b0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75  the.** sqlite3Fu
2d2c0 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20  nctionThisSrc() 
2d2d0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75  routine..*/.stru
2d2e0 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20  ct SrcCount {.  
2d2f0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
2d300 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c   /* One particul
2d310 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  ar FROM clause i
2d320 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79  n a nested query
2d330 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b   */.  int nThis;
2d340 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2d350 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
2d360 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72  o columns in pSr
2d370 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  cList */.  int n
2d380 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e  Other;      /* N
2d390 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2d3a0 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
2d3b0 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  n other FROM cla
2d3c0 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  uses */.};../*.*
2d3d0 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
2d3e0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2d3f0 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a   to columns..*/.
2d400 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
2d410 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a  rcCount(Walker *
2d420 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2d430 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Expr){.  /* The 
2d440 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73  NEVER() on the s
2d450 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65  econd term is be
2d460 63 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e  cause sqlite3Fun
2d470 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
2d480 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79  ().  ** is alway
2d490 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
2d4a0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2d4b0 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61  zeAggregates() a
2d4c0 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54  nd so the.  ** T
2d4d0 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e  K_COLUMNs have n
2d4e0 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76  ot yet been conv
2d4f0 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47  erted into TK_AG
2d500 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20  G_COLUMN.  If.  
2d510 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
2d520 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20  onUsesThisSrc() 
2d530 69 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e  is used differen
2d540 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72  tly in the futur
2d550 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45  e, the.  ** NEVE
2d560 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  R() will need to
2d570 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a   be removed. */.
2d580 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
2d590 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45  =TK_COLUMN || NE
2d5a0 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  VER(pExpr->op==T
2d5b0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b  K_AGG_COLUMN) ){
2d5c0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2d5d0 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
2d5e0 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
2d5f0 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53  pSrcCount;.    S
2d600 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
2d610 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20  ->pSrc;.    int 
2d620 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53  nSrc = pSrc ? pS
2d630 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20  rc->nSrc : 0;.  
2d640 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72    for(i=0; i<nSr
2d650 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
2d660 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
2d670 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  ==pSrc->a[i].iCu
2d680 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
2d690 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53    }.    if( i<nS
2d6a0 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  rc ){.      p->n
2d6b0 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  This++;.    }els
2d6c0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68  e{.      p->nOth
2d6d0 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  er++;.    }.  }.
2d6e0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2d6f0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2d700 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79  Determine if any
2d710 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
2d720 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46  s to the pExpr F
2d730 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63  unction referenc
2d740 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20  e.** pSrcList.  
2d750 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
2d760 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65  hey do.  Also re
2d770 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
2d780 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
2d790 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72   no arguments or
2d7a0 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61   has only consta
2d7b0 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
2d7c0 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70  eturn false if p
2d7d0 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63  Expr.** referenc
2d7e0 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e  es columns but n
2d7f0 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61  ot columns of ta
2d800 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53  bles found in pS
2d810 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73  rcList..*/.int s
2d820 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
2d830 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a  esThisSrc(Expr *
2d840 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a  pExpr, SrcList *
2d850 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c  pSrcList){.  Wal
2d860 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20  ker w;.  struct 
2d870 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20  SrcCount cnt;.  
2d880 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
2d890 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
2d8a0 4f 4e 20 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  ON );.  w.xExprC
2d8b0 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72  allback = exprSr
2d8c0 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  cCount;.  w.xSel
2d8d0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
2d8e0 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74  .  w.u.pSrcCount
2d8f0 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70   = &cnt;.  cnt.p
2d900 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a  Src = pSrcList;.
2d910 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b    cnt.nThis = 0;
2d920 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20  .  cnt.nOther = 
2d930 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  0;.  sqlite3Walk
2d940 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78  ExprList(&w, pEx
2d950 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
2d960 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73  return cnt.nThis
2d970 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72  >0 || cnt.nOther
2d980 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ==0;.}../*.** Ad
2d990 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
2d9a0 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
2d9b0 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
2d9c0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
2d9d0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
2d9e0 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
2d9f0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
2da00 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
2da10 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2da20 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
2da30 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
2da40 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
2da50 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
2da60 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
2da70 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
2da80 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
2da90 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
2daa0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
2dab0 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
2dac0 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
2dad0 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  umn,.       &i. 
2dae0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
2daf0 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
2db00 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
2db10 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
2db20 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
2db30 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
2db40 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
2db50 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
2db60 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
2db70 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
2db80 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2db90 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
2dba0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
2dbb0 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
2dbc0 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
2dbd0 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
2dbe0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
2dbf0 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
2dc00 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
2dc10 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
2dc20 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
2dc30 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
2dc40 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  unc,.       &i. 
2dc50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
2dc60 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  }    ../*.** Thi
2dc70 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61  s is the xExprCa
2dc80 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65  llback for a tre
2dc90 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73  e walker.  It is
2dca0 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c   used to.** impl
2dcb0 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70  ement sqlite3Exp
2dcc0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2dcd0 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74  es().  See sqlit
2dce0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2dcf0 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61  regates.** for a
2dd00 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
2dd10 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
2dd20 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
2dd30 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57  egate(Walker *pW
2dd40 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2dd50 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
2dd60 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
2dd70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
2dd80 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  C;.  Parse *pPar
2dd90 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
2dda0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
2ddb0 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
2ddc0 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f  cList;.  AggInfo
2ddd0 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43   *pAggInfo = pNC
2dde0 2d 3e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 3b 0a  ->uNC.pAggInfo;.
2ddf0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
2de00 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 55 41 67  ncFlags & NC_UAg
2de10 67 49 6e 66 6f 20 29 3b 0a 20 20 73 77 69 74 63  gInfo );.  switc
2de20 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
2de30 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
2de40 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
2de50 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
2de60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2de70 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2de80 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
2de90 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2dea0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
2deb0 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ;.      /* Check
2dec0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
2ded0 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20  olumn is in one 
2dee0 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
2def0 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20   the FROM.      
2df00 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
2df10 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
2df20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
2df30 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30  WAYS(pSrcList!=0
2df40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ) ){.        str
2df50 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2df60 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69   *pItem = pSrcLi
2df70 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66  st->a;.        f
2df80 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
2df90 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
2dfa0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2dfb0 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
2dfc0 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20  o_col *pCol;.   
2dfd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2dfe0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2dff0 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
2e000 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
2e010 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2e020 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
2e030 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29  pItem->iCursor )
2e040 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2e050 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
2e060 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
2e070 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66  s that pExpr ref
2e080 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20  ers to a table. 
2e090 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
2e0a0 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f  at is in the FRO
2e0b0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
2e0c0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
2e0d0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a    .            *
2e0e0 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
2e0f0 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   Make an entry f
2e100 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  or the column in
2e110 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2e120 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20  ] if there.     
2e130 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
2e140 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20   an entry there 
2e150 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20  already..       
2e160 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2e170 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
2e180 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41         pCol = pA
2e190 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20  ggInfo->aCol;.  
2e1a0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
2e1b0 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; k<pAggInfo->n
2e1c0 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f  Column; k++, pCo
2e1d0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
2e1e0 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54      if( pCol->iT
2e1f0 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
2e200 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
2e210 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2e220 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
2e230 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
2e240 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2e250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2e260 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2e270 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
2e280 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  k>=pAggInfo->nCo
2e290 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20  lumn).          
2e2a0 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67     && (k = addAg
2e2b0 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  gInfoColumn(pPar
2e2c0 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
2e2d0 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ))>=0 .         
2e2e0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2e2f0 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67      pCol = &pAgg
2e300 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20  Info->aCol[k];. 
2e310 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2e320 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  l->pTab = pExpr-
2e330 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
2e340 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c       pCol->iTabl
2e350 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  e = pExpr->iTabl
2e360 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2e370 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pCol->iColumn =
2e380 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
2e390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2e3a0 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  Col->iMem = ++pP
2e3b0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2e3c0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2e3d0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
2e3e0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
2e3f0 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20    pCol->pExpr = 
2e400 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
2e410 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66       if( pAggInf
2e420 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  o->pGroupBy ){. 
2e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2e440 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20  nt j, n;.       
2e450 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73           ExprLis
2e460 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66  t *pGB = pAggInf
2e470 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  o->pGroupBy;.   
2e480 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
2e490 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2e4a0 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e  m *pTerm = pGB->
2e4b0 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a;.             
2e4c0 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70     n = pGB->nExp
2e4d0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
2e4e0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
2e4f0 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
2e500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e510 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65    Expr *pE = pTe
2e520 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
2e530 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2e540 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pE->op==TK_COLU
2e550 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65  MN && pE->iTable
2e560 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
2e570 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
2e580 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f           pE->iCo
2e590 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
2e5a0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
2e5b0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2e5c0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
2e5d0 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
2e5e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e600 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2e610 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e630 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
2e640 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b  orterColumn<0 ){
2e650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e660 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2e670 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d  lumn = pAggInfo-
2e680 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b  >nSortingColumn+
2e690 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
2e6a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2e6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2e6c0 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20  There is now an 
2e6d0 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20  entry for pExpr 
2e6e0 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
2e6f0 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20  l[] (either.    
2e700 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75          ** becau
2e710 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20  se it was there 
2e720 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73  before or becaus
2e730 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65  e we just create
2e740 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20  d it)..         
2e750 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68     ** Convert th
2e760 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20  e pExpr to be a 
2e770 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65  TK_AGG_COLUMN re
2e780 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a  ferring to that.
2e790 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
2e7a0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
2e7b0 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20  entry..         
2e7c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2e7d0 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2e7e0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
2e7f0 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
2e800 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
2e810 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
2e820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
2e830 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
2e840 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
2e850 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
2e860 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20   = (i16)k;.     
2e870 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2e880 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
2e890 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
2e8a0 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
2e8b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
2e8c0 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
2e8d0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
2e8e0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
2e8f0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
2e900 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
2e910 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
2e920 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
2e930 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46  lags & NC_InAggF
2e940 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  unc)==0.       &
2e950 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65  & pWalker->walke
2e960 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f  rDepth==pExpr->o
2e970 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  p2.      ){.    
2e980 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
2e990 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20  see if pExpr is 
2e9a0 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
2e9b0 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65  nother aggregate
2e9c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e   .        ** fun
2e9d0 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c  ction that is al
2e9e0 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67  ready in the pAg
2e9f0 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  gInfo structure.
2ea00 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2ea10 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
2ea20 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20  o_func *pItem = 
2ea30 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
2ea40 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2ea50 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2ea60 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  unc; i++, pItem+
2ea70 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2ea80 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2ea90 70 61 72 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70  pare(0, pItem->p
2eaa0 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29  Expr, pExpr, -1)
2eab0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2eac0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2ead0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2eae0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
2eaf0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
2eb00 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
2eb10 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
2eb20 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
2eb30 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
2eb40 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
2eb50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2eb60 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
2eb70 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
2eb80 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
2eb90 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64  foFunc(pParse->d
2eba0 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  b, pAggInfo);.  
2ebb0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
2ebc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ebd0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2ebe0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2ebf0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2ec00 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2ec10 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
2ec20 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
2ec30 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
2ec40 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
2ec50 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
2ec60 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
2ec70 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
2ec80 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2ec90 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2eca0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
2ecb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2ecc0 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
2ecd0 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
2ece0 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
2ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed00 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
2ed10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2ed20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c       pExpr->x.pL
2ed30 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ist ? pExpr->x.p
2ed40 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
2ed50 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
2ed60 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2ed70 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
2ed80 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
2ed90 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
2eda0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
2edb0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
2edc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2edd0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2ede0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
2edf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2ee00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ee10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
2ee20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
2ee30 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
2ee40 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
2ee50 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
2ee60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
2ee70 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2ee80 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2ee90 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
2eea0 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
2eeb0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2eec0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2eed0 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
2eee0 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
2eef0 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
2ef00 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
2ef10 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
2ef20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2ef30 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Prune;.      }el
2ef40 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
2ef50 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2ef60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ef70 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
2ef80 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
2ef90 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
2efa0 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
2efb0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2efc0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2efd0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2efe0 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
2eff0 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  .  pWalker->walk
2f000 65 72 44 65 70 74 68 2b 2b 3b 0a 20 20 72 65 74  erDepth++;.  ret
2f010 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2f020 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2f030 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2f040 73 49 6e 53 65 6c 65 63 74 45 6e 64 28 57 61 6c  sInSelectEnd(Wal
2f050 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2f060 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2f070 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2f080 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  ER(pSelect);.  p
2f090 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65  Walker->walkerDe
2f0a0 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pth--;.}../*.** 
2f0b0 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70  Analyze the pExp
2f0c0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f  r expression loo
2f0d0 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  king for aggrega
2f0e0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
2f0f0 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65  .** for variable
2f100 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
2f110 65 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e  e added to AggIn
2f120 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70  fo object that p
2f130 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20  NC->pAggInfo.** 
2f140 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69  points to.  Addi
2f150 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61  tional entries a
2f160 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41  re made on the A
2f170 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73  ggInfo object as
2f180 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a  .** necessary..*
2f190 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2f1a0 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
2f1b0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
2f1c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
2f1d0 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
2f1e0 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f  d by sqlite3Reso
2f1f0 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a  lveExprNames()..
2f200 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2f210 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2f220 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74  ates(NameContext
2f230 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78   *pNC, Expr *pEx
2f240 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  pr){.  Walker w;
2f250 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2f260 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
2f270 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65  egate;.  w.xSele
2f280 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  ctCallback = ana
2f290 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
2f2a0 53 65 6c 65 63 74 3b 0a 20 20 77 2e 78 53 65 6c  Select;.  w.xSel
2f2b0 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 61  ectCallback2 = a
2f2c0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2f2d0 49 6e 53 65 6c 65 63 74 45 6e 64 3b 0a 20 20 77  InSelectEnd;.  w
2f2e0 2e 77 61 6c 6b 65 72 44 65 70 74 68 20 3d 20 30  .walkerDepth = 0
2f2f0 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
2f300 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  C;.  assert( pNC
2f310 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
2f320 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2f330 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
2f340 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
2f350 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2f360 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
2f370 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
2f380 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
2f390 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
2f3a0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2f3b0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
2f3c0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
2f3d0 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
2f3e0 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
2f3f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2f400 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2f410 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  t(NameContext *p
2f420 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  NC, ExprList *pL
2f430 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45  ist){.  struct E
2f440 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
2f450 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
2f460 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
2f470 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
2f480 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
2f490 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
2f4a0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
2f4b0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2f4c0 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
2f4d0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
2f4e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2f4f0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69  ** Allocate a si
2f500 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65  ngle new registe
2f510 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c  r for use to hol
2f520 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69  d some intermedi
2f530 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69  ate result..*/.i
2f540 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2f550 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
2f560 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
2f570 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29  e->nTempReg==0 )
2f580 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70  {.    return ++p
2f590 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
2f5a0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
2f5b0 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61  ->aTempReg[--pPa
2f5c0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a  rse->nTempReg];.
2f5d0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
2f5e0 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20  ate a register, 
2f5f0 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65  making available
2f600 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73   for reuse for s
2f610 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72  ome other.** pur
2f620 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  pose..**.** If a
2f630 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72   register is cur
2f640 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65  rently being use
2f650 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d by the column 
2f660 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  cache, then.** t
2f670 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  he deallocation 
2f680 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
2f690 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  l the column cac
2f6a0 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65  he line that use
2f6b0 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  s.** the registe
2f6c0 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e  r becomes stale.
2f6d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2f6e0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
2f6f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2f700 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
2f710 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
2f720 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
2f730 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
2f740 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eg) ){.    int i
2f750 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f  ;.    struct yCo
2f760 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66  lCache *p;.    f
2f770 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
2f780 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70  ->aColCache; i<p
2f790 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
2f7a0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
2f7b0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
2f7c0 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iReg ){.        
2f7d0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a  p->tempReg = 1;.
2f7e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
2f7f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f800 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
2f810 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
2f820 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
2f830 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
2f840 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
2f850 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
2f860 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
2f870 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74  egisters..*/.int
2f880 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2f890 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
2f8a0 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  se, int nReg){. 
2f8b0 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28   int i, n;.  if(
2f8c0 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74 75 72   nReg==1 ) retur
2f8d0 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  n sqlite3GetTemp
2f8e0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
2f8f0 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67   = pParse->iRang
2f900 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72  eReg;.  n = pPar
2f910 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20  se->nRangeReg;. 
2f920 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a   if( nReg<=n ){.
2f930 20 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65      assert( !use
2f940 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
2f950 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29  Parse, i, i+n-1)
2f960 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
2f970 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65  iRangeReg += nRe
2f980 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  g;.    pParse->n
2f990 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67  RangeReg -= nReg
2f9a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2f9b0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
2f9c0 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
2f9d0 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d  Mem += nReg;.  }
2f9e0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76  .  return i;.}.v
2f9f0 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
2fa00 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  seTempRange(Pars
2fa10 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2fa20 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
2fa30 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b    if( nReg==1 ){
2fa40 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
2fa50 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
2fa60 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65  e, iReg);.    re
2fa70 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
2fa80 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
2fa90 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ve(pParse, iReg,
2faa0 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52   nReg);.  if( nR
2fab0 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
2fac0 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
2fad0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
2fae0 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
2faf0 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
2fb00 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
2fb10 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
2fb20 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
2fb30 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
2fb40 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  le for reuse..*/
2fb50 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65  .void sqlite3Cle
2fb60 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50  arTempRegCache(P
2fb70 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
2fb80 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2fb90 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
2fba0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
2fbb0 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74  }../*.** Validat
2fbc0 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72  e that no tempor
2fbd0 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c  ary register fal
2fbe0 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  ls within the ra
2fbf0 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74  nge of.** iFirst
2fc00 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69  ..iLast, inclusi
2fc10 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ve.  This routin
2fc20 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66  e is only call f
2fc30 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72  rom within asser
2fc40 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
2fc50 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
2fc60 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71  ITE_DEBUG.int sq
2fc70 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61  lite3NoTempsInRa
2fc80 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2fc90 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69  e, int iFirst, i
2fca0 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74  nt iLast){.  int
2fcb0 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   i;.  if( pParse
2fcc0 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20  ->nRangeReg>0.  
2fcd0 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e   && pParse->iRan
2fce0 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52  geReg+pParse->nR
2fcf0 61 6e 67 65 52 65 67 20 3e 20 69 46 69 72 73 74  angeReg > iFirst
2fd00 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
2fd10 52 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61 73  RangeReg <= iLas
2fd20 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75  t.  ){.     retu
2fd30 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
2fd40 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
2fd50 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20  TempReg; i++){. 
2fd60 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
2fd70 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72  TempReg[i]>=iFir
2fd80 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54  st && pParse->aT
2fd90 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74  empReg[i]<=iLast
2fda0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2fdb0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2fdc0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2fdd0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
2fde0 55 47 20 2a 2f 0a                                UG */.