/ Hex Artifact Content
Login

Artifact 261d1eb0954a7813d512d8edafd6db26736a3dcb650785652a6234d5ddb394aa:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  xpr->pTab ){.   
07f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54   return sqlite3T
0800: 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  ableColumnAffini
0810: 74 79 28 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  ty(pExpr->pTab, 
0820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
0830: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0840: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
0850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0860: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
0870: 67 73 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20  gs&EP_xIsSelect 
0880: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
0890: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08a0: 79 28 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y(.        pExpr
08b0: 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65  ->pLeft->x.pSele
08c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  ct->pEList->a[pE
08d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
08e0: 78 70 72 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  xpr.    );.  }. 
08f0: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61   return pExpr->a
0900: 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  ffinity;.}../*.*
0910: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
0920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
0930: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0940: 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c  r to be the coll
0950: 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
0960: 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65  e named by pToke
0970: 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f  n.   Return a po
0980: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45  inter to a new E
0990: 78 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a  xpr node that.**
09a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
09b0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
09c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
09d0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
09e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 61  rror occurs, tha
09f0: 74 20 66 61 63 74 20 69 73 20 72 65 63 6f 72 64  t fact is record
0a00: 65 64 20 69 6e 20 70 50 61 72 73 65 2d 3e 64 62  ed in pParse->db
0a10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 45 78 70  .** and the pExp
0a20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 72  r parameter is r
0a30: 65 74 75 72 6e 65 64 20 75 6e 63 68 61 6e 67 65  eturned unchange
0a40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0a50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0a60: 65 54 6f 6b 65 6e 28 0a 20 20 50 61 72 73 65 20  eToken(.  Parse 
0a70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0a80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0a90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
0aa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
0ab0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 22      /* Add the "
0ac0: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
0ad0: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
0ae0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  on */.  const To
0af0: 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20  ken *pCollName, 
0b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c   /* Name of coll
0b10: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
0b20: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b40: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
0b50: 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  pCollName */.){.
0b60: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
0b70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
0b80: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0b90: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0ba0: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0bb0: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71  , pCollName, deq
0bc0: 75 6f 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  uote);.    if( p
0bd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
0be0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72  w->pLeft = pExpr
0bf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
0c00: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
0c10: 65 7c 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  e|EP_Skip;.     
0c20: 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
0c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0c40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 45 78 70 72 20  n pExpr;.}.Expr 
0c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43  *sqlite3ExprAddC
0c60: 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 50 61 72  ollateString(Par
0c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0c80: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
0c90: 68 61 72 20 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65  har *zC){.  Toke
0ca0: 6e 20 73 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  n s;.  assert( z
0cb0: 43 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  C!=0 );.  sqlite
0cc0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 2c 20 28  3TokenInit(&s, (
0cd0: 63 68 61 72 2a 29 7a 43 29 3b 0a 20 20 72 65 74  char*)zC);.  ret
0ce0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0cf0: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
0d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 73  Parse, pExpr, &s
0d10: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  , 0);.}../*.** S
0d20: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0d30: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0d40: 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69 6b 65  s and any unlike
0d50: 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c  ly().** or likel
0d60: 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69 6f 6e  ihood() function
0d70: 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   at the root of 
0d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
0d90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0da0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0db0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0dc0: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0dd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0de0: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0df0: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
0e00: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0e10: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b   EP_Unlikely) ){
0e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
0e30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0e40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
0e50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ect) );.      as
0e60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70  sert( pExpr->x.p
0e70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
0e80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
0ea0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  CTION );.      p
0eb0: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Expr = pExpr->x.
0ec0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
0ed0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
0ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
0f00: 45 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  E );.      pExpr
0f10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0f30: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0f40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0f60: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0f70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0f80: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0f90: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0fa0: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0fb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0fc0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
0fd0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 29  3ExprNNCollSeq()
0fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
0ff0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
1000: 29 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65  ) works the same
1010: 20 65 78 61 63 74 20 74 68 61 74 20 69 74 20 72   exact that it r
1020: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65  eturns the.** de
1030: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1040: 69 66 20 70 45 78 70 72 20 68 61 73 20 6e 6f 20  if pExpr has no 
1050: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
1060: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  n..**.** The col
1070: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1080: 6d 69 67 68 74 20 62 65 20 64 65 74 65 72 6d 69  might be determi
1090: 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  ned by a COLLATE
10a0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f 72 20   operator.** or 
10b0: 62 79 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  by the presence 
10c0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68  of a column with
10d0: 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   a defined colla
10e0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
10f0: 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  * COLLATE operat
1100: 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74 20 70  ors take first p
1110: 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65 66 74  recedence.  Left
1120: 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65 0a 2a   operands take.*
1130: 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  * precedence ove
1140: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 73  r right operands
1150: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1160: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1170: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1180: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1190: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c  arse->db;.  Coll
11b0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
11c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
11d0: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
11e0: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 2d  .    int op = p-
11f0: 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >op;.    if( p->
1200: 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e 65 72  flags & EP_Gener
1210: 69 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ic ) break;.    
1220: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
1230: 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  || op==TK_UPLUS 
1240: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  ){.      p = p->
1250: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f 6e  pLeft;.      con
1260: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1270: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   if( op==TK_COLL
1280: 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54 4b 5f 52  ATE || (op==TK_R
1290: 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 6f 70  EGISTER && p->op
12a0: 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 29 20 29  2==TK_COLLATE) )
12b0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
12c0: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
12d0: 71 28 70 50 61 72 73 65 2c 20 45 4e 43 28 64 62  q(pParse, ENC(db
12e0: 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  ), 0, p->u.zToke
12f0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1310: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1320: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1330: 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  MN.          || 
1340: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
1350: 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45  || op==TK_TRIGGE
1360: 52 29 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 54  R).     && p->pT
1370: 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ab!=0.    ){.   
1380: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
1390: 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62  ISTER && p->pTab
13a0: 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e  !=0 happens when
13b0: 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69   pExpr was origi
13c0: 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61  nally.      ** a
13d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77   TK_COLUMN but w
13e0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76  as previously ev
13f0: 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68  aluated and cach
1400: 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
1410: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 20   */.      int j 
1420: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
1430: 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a      if( j>=0 ){.
1440: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1450: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70  ar *zColl = p->p
1460: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
1470: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  ll;.        pCol
1480: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
1490: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
14a0: 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20  b), zColl, 0);. 
14b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14d0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
14e0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
14f0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26   if( p->pLeft &&
1500: 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67   (p->pLeft->flag
1510: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
1520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 20  =0 ){.        p 
1530: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
1540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1550: 20 45 78 70 72 20 2a 70 4e 65 78 74 20 20 3d 20   Expr *pNext  = 
1560: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1570: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
1580: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
1590: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
15a0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
15b0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
15c0: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
15d0: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
15e0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
15f0: 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20 68 6f 6c   /* p->flags hol
1600: 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65 20 61 6e  ds EP_Collate an
1610: 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  d p->pLeft->flag
1620: 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20 41 6e 64  s does not.  And
1630: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 78  .        ** p->x
1640: 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e 6f 74 2e  .pSelect cannot.
1650: 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e 70 4c 65    So if p->x.pLe
1660: 66 74 20 65 78 69 73 74 73 2c 20 69 74 20 6d 75  ft exists, it mu
1670: 73 74 20 68 6f 6c 64 20 61 74 0a 20 20 20 20 20  st hold at.     
1680: 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20     ** least one 
1690: 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54 68 75 73  EP_Collate. Thus
16a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
16b0: 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f 0a 20 20  wo ALWAYS. */.  
16c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 2e 70        if( p->x.p
16d0: 4c 69 73 74 21 3d 30 20 26 26 20 41 4c 57 41 59  List!=0 && ALWAY
16e0: 53 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  S(!ExprHasProper
16f0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
1700: 63 74 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ct)) ){.        
1710: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1720: 20 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41     for(i=0; ALWA
1730: 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d  YS(i<p->x.pList-
1740: 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a 20  >nExpr); i++){. 
1750: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 45             if( E
1760: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1770: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
1780: 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61 74  pExpr, EP_Collat
1790: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
17a0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78      pNext = p->x
17b0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
17c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1800: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
1810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1820: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
1830: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1840: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
1850: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
1860: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
1870: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1880: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
1890: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
18a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18b0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
18c0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
18d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
18e0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
18f0: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
1900: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1910: 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f 6c 6c  .** defautl coll
1920: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
1930: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1950: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
1960: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1970: 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  q() routine work
1980: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
1990: 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72 65 74  t that it.** ret
19a0: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
19b0: 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64  re is no defined
19c0: 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 43   collation..*/.C
19d0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
19e0: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50 61 72  xprNNCollSeq(Par
19f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1a00: 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c   *pExpr){.  Coll
1a10: 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Seq *p = sqlite3
1a20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1a30: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  se, pExpr);.  if
1a40: 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70 50 61  ( p==0 ) p = pPa
1a50: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1a60: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  ll;.  assert( p!
1a70: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
1a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a90: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 74 77  n TRUE if the tw
1aa0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 68 61  o expressions ha
1ab0: 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  ve equivalent co
1ac0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ad0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1ae0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63  3ExprCollSeqMatc
1af0: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
1b00: 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72   Expr *pE1, Expr
1b10: 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c 53 65   *pE2){.  CollSe
1b20: 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71 6c 69  q *pColl1 = sqli
1b30: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b40: 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b 0a 20  (pParse, pE1);. 
1b50: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32   CollSeq *pColl2
1b60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
1b70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b80: 70 45 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  pE2);.  return s
1b90: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1ba0: 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f  oll1->zName, pCo
1bb0: 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 3b 0a  ll2->zName)==0;.
1bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1bd0: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
1be0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1bf0: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
1c00: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
1c10: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
1c20: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
1c30: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c40: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1c50: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
1c60: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
1c70: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
1c80: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
1c90: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1ca0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
1cb0: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
1cc0: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
1cd0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1ce0: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
1cf0: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
1d00: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
1d10: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
1d20: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
1d30: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
1d40: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
1d50: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
1d60: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
1d70: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
1d80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1d90: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1da0: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
1db0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1dc0: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
1dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1de0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
1df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1e00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1e10: 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BLOB;.    }.  }e
1e20: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
1e30: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
1e40: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
1e50: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1e60: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
1e70: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
1e80: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
1e90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
1ea0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
1eb0: 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BLOB;.  }else{. 
1ec0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
1ed0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
1ee0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
1ef0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
1f00: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
1f10: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
1f20: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
1f30: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
1f40: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
1f50: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1f60: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1f70: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
1f80: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
1f90: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1fa0: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
1fb0: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
1fc0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
1fd0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
1fe0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
1ff0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
2000: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
2010: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
2020: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
2030: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
2040: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
2050: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
2060: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
2070: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
2080: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
2090: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
20a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
20b0: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45  >op==TK_NE || pE
20c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
20d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
20e0: 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65 72  ISNOT );.  asser
20f0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
2100: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
2110: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2120: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2130: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2140: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
2150: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
2160: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
2170: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c  ght, aff);.  }el
2180: 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72  se if( ExprHasPr
2190: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21a0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
21b0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
21c0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
21f0: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65  Expr, aff);.  }e
2200: 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20 29  lse if( aff==0 )
2210: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
2220: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d  TE_AFF_BLOB;.  }
2230: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
2240: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
2250: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
2260: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
2270: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
2280: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
2290: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
22a0: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
22b0: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
22c0: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
22d0: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
22e0: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
22f0: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
2300: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
2310: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
2320: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
2330: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
2340: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
2350: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
2360: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
2370: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
2380: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
2390: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
23a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
23b0: 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  FF_BLOB:.      r
23c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
23d0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
23e0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
23f0: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
2400: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
2410: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2420: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2430: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
2440: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
2450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2460: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
2470: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2480: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
2490: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
24a0: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
24b0: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
24c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
24d0: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
24e0: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
24f0: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
2500: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
2510: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
2520: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
2530: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
2540: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
2550: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28  xpr2);.  aff = (
2560: 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  u8)sqlite3Compar
2570: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31  eAffinity(pExpr1
2580: 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d  , aff) | (u8)jum
2590: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
25a0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
25b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25c0: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
25d0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
25e0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
25f0: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
2600: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
2610: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
2620: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
2630: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
2640: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
2650: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
2660: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
2670: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
2680: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
2690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
26a0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
26b0: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
26c0: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
26d0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
26e0: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
26f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2700: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
2710: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
2720: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
2730: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
2740: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
2750: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2760: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
2770: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
2780: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
2790: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
27a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
27b0: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
27c0: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
27d0: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
27e0: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
27f0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
2800: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
2810: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
2820: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2830: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2840: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d  rse, pLeft);.  }
2850: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20  else if( pRight 
2860: 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67  && (pRight->flag
2870: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21  s & EP_Collate)!
2880: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  =0 ){.    pColl 
2890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
28a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
28b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
28c0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
28d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
28e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
28f0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2900: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2910: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2920: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
2930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2940: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
2950: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
2960: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
2970: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
2980: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
2990: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
29a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
29b0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
29c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
29d0: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
29e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
29f0: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
2a00: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
2a10: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
2a20: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
2a30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
2a40: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
2a50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
2a70: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
2a80: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
2a90: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
2aa0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
2ab0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
2ac0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
2ad0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
2ae0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
2af0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
2b00: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
2b10: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
2b20: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
2b30: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
2b40: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
2b50: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
2b60: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
2b70: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
2b80: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
2b90: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
2ba0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2bb0: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
2bc0: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
2bd0: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2c00: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
2c10: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
2c20: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
2c30: 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29  ->pVdbe, (u8)p5)
2c40: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2c60: 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73   true if express
2c70: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
2c80: 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20  ector, or false 
2c90: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
2ca0: 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66   A vector is def
2cb0: 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72  ined as any expr
2cc0: 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75  ession that resu
2cd0: 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f  lts in two or mo
2ce0: 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66  re.** columns of
2cf0: 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20   result.  Every 
2d00: 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69  TK_VECTOR node i
2d10: 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61  s an vector beca
2d20: 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65  use the.** parse
2d30: 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72  r will not gener
2d40: 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20  ate a TK_VECTOR 
2d50: 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20  with fewer than 
2d60: 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20  two entries..** 
2d70: 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20  But a TK_SELECT 
2d80: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
2d90: 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63  a vector or a sc
2da0: 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79  alar. It is only
2db0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
2dc0: 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61   vector if it ha
2dd0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65  s two or more re
2de0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  sult columns..*/
2df0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2e00: 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70  IsVector(Expr *p
2e10: 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Expr){.  return 
2e20: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2e30: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a  rSize(pExpr)>1;.
2e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2e50: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2e60: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
2e70: 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70  gument is of typ
2e80: 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20  e TK_VECTOR .** 
2e90: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
2ea0: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
2eb0: 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20   in the vector. 
2ec0: 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  Or, if the expre
2ed0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75  ssion.** is a su
2ee0: 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e  b-select, return
2ef0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2f00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75  olumns in the su
2f10: 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a  b-select. For.**
2f20: 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20   any other type 
2f30: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  of expression, r
2f40: 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20  eturn 1..*/.int 
2f50: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
2f60: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70  rSize(Expr *pExp
2f70: 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45  r){.  u8 op = pE
2f80: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
2f90: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
2fa0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32   op = pExpr->op2
2fb0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56  ;.  if( op==TK_V
2fc0: 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74  ECTOR ){.    ret
2fd0: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  urn pExpr->x.pLi
2fe0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c  st->nExpr;.  }el
2ff0: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  se if( op==TK_SE
3000: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
3010: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  rn pExpr->x.pSel
3020: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
3030: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
3040: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
3050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
3060: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
3070: 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70  bexpression of p
3080: 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74  Vector that is t
3090: 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d  he i-th.** colum
30a0: 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20  n of the vector 
30b0: 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69  (numbered starti
30c0: 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65  ng with 0).  The
30d0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
30e0: 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73  ensure that i is
30f0: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a   within range..*
3100: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3110: 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6c  is really a scal
3120: 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72 22  ar (and "scalar"
3130: 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20 73   here includes s
3140: 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68 61  ubqueries.** tha
3150: 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  t return a singl
3160: 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20  e column!) then 
3170: 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20 75  return pVector u
3180: 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  nmodified..**.**
3190: 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e 73   pVector retains
31a0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
31b0: 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65 78  e returned subex
31c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
31d0: 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69 73  If the vector is
31e0: 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20   a (SELECT ...) 
31f0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
3200: 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73 0a  ion returned is.
3210: 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70 72  ** just the expr
3220: 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69  ession for the i
3230: 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  -th term of the 
3240: 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
3250: 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65  may.** not be re
3260: 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ady for evaluati
3270: 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 74  on because the t
3280: 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73 20  able cursor has 
3290: 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
32a0: 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45  positioned..*/.E
32b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74  xpr *sqlite3Vect
32c0: 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45  orFieldSubexpr(E
32d0: 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e  xpr *pVector, in
32e0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
32f0: 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  i<sqlite3ExprVec
3300: 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29  torSize(pVector)
3310: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
3320: 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56  3ExprIsVector(pV
3330: 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61 73  ector) ){.    as
3340: 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f  sert( pVector->o
3350: 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72  p2==0 || pVector
3360: 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
3370: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56 65  R );.    if( pVe
3380: 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  ctor->op==TK_SEL
3390: 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e  ECT || pVector->
33a0: 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  op2==TK_SELECT )
33b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
33c0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
33d0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
33e0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
33f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
3400: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3410: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
3420: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3430: 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  pVector;.}../*.*
3440: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
3450: 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20  turn a new Expr 
3460: 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65  object which whe
3470: 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73  n passed to.** s
3480: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
3490: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61   will generate a
34a0: 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64  ll necessary cod
34b0: 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20  e to compute.** 
34c0: 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f  the iField-th co
34d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
34e0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56  or expression pV
34f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ector..**.** It 
3500: 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f  is ok for pVecto
3510: 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  r to be a scalar
3520: 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69   (as long as iFi
3530: 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e  eld==0).  .** In
3540: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
3550: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
3560: 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44  ike sqlite3ExprD
3570: 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  up()..**.** The 
3580: 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20  caller owns the 
3590: 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62  returned Expr ob
35a0: 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70  ject and is resp
35b0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65  onsible for.** e
35c0: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65  nsuring that the
35d0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
35e0: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
35f0: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  freed..**.** The
3600: 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20   caller retains 
3610: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65  ownership of pVe
3620: 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f  ctor.  If pVecto
3630: 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54  r is a TK_SELECT
3640: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
3650: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77 69  turned object wi
3660: 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56 65  ll reference pVe
3670: 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63  ctor and so pVec
3680: 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a  tor must remain.
3690: 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ** valid for the
36a0: 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65 74   life of the ret
36b0: 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49  urned object.  I
36c0: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
36d0: 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61  K_VECTOR.** or a
36e0: 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
36f0: 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20  on, then it can 
3700: 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f  be deleted as so
3710: 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74 69  on as this routi
3720: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a  ne.** returns..*
3730: 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20  *.** A trick to 
3740: 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43  cause a TK_SELEC
3750: 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20  T pVector to be 
3760: 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72  deleted together
3770: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74   with.** the ret
3780: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3790: 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20 74  t is to attach t
37a0: 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68  he pVector to th
37b0: 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a  e pRight field.*
37c0: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
37d0: 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  d TK_SELECT_COLU
37e0: 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a  MN Expr object..
37f0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3800: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
3810: 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ld(.  Parse *pPa
3820: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3830: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3840: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3850: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
3860: 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20  ector.  List of 
3870: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61  expressions or a
3880: 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20   sub-SELECT */. 
3890: 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20   int iField     
38a0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
38b0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
38c0: 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  tor to return */
38d0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74  .){.  Expr *pRet
38e0: 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d  ;.  if( pVector-
38f0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
3900: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  {.    assert( pV
3910: 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45  ector->flags & E
3920: 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20  P_xIsSelect );. 
3930: 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c     /* The TK_SEL
3940: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
3950: 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  node:.    **.   
3960: 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20   ** pLeft:      
3970: 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e       pVector con
3980: 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43  taining TK_SELEC
3990: 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e  T.  Not deleted.
39a0: 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20  .    ** pRight: 
39b0: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65           not use
39c0: 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76  d.  But recursiv
39d0: 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  ely deleted..   
39e0: 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20   ** iColumn:    
39f0: 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20       Index of a 
3a00: 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f  column in pVecto
3a10: 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a  r.    ** iTable:
3a20: 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20 74            0 or t
3a30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
3a40: 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53 20  umns on the LHS 
3a50: 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74  of an assignment
3a60: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69  .    ** pLeft->i
3a70: 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69  Table:   First i
3a80: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
3a90: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
3aa0: 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20  esult, or 0.    
3ab0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3ac0: 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c      if the resul
3ad0: 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d  t is not yet com
3ae0: 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  puted..    **.  
3af0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72    ** sqlite3Expr
3b00: 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69  Delete() specifi
3b10: 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20  cally skips the 
3b20: 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65  recursive delete
3b30: 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74   of.    ** pLeft
3b40: 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f   on TK_SELECT_CO
3b50: 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74  LUMN nodes.  But
3b60: 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f   pRight is follo
3b70: 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a  wed, so pVector.
3b80: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74      ** can be at
3b90: 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74  tached to pRight
3ba0: 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e   to cause this n
3bb0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  ode to take owne
3bc0: 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20  rship of.    ** 
3bd0: 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61  pVector.  Typica
3be0: 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62  lly there will b
3bf0: 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45  e multiple TK_SE
3c00: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  LECT_COLUMN node
3c10: 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
3c20: 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69  e same pLeft poi
3c30: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63  nter to the pVec
3c40: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3c50: 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  e of them.    **
3c60: 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56   will own the pV
3c70: 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ector..    */.  
3c80: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
3c90: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3ca0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20  _SELECT_COLUMN, 
3cb0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
3cc0: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Ret ){.      pRe
3cd0: 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69  t->iColumn = iFi
3ce0: 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  eld;.      pRet-
3cf0: 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72  >pLeft = pVector
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3d10: 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70  rt( pRet==0 || p
3d20: 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  Ret->iTable==0 )
3d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3d40: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
3d50: 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63  TK_VECTOR ) pVec
3d60: 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  tor = pVector->x
3d70: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
3d80: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65  ].pExpr;.    pRe
3d90: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
3da0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
3db0: 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d 0a  Vector, 0);.  }.
3dc0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65  ../*.** If expre
3de0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f  ssion pExpr is o
3df0: 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54  f type TK_SELECT
3e00: 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
3e10: 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69  to evaluate.** i
3e20: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  t. Return the re
3e30: 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20  gister in which 
3e40: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
3e50: 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65  ored (or, if the
3e60: 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20   .** sub-select 
3e70: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
3e80: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68  n one column, th
3e90: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3ea0: 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74  ray.** of regist
3eb0: 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65  ers in which the
3ec0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3ed0: 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  d)..**.** If pEx
3ee0: 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53  pr is not a TK_S
3ef0: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3f00: 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
3f10: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f  tatic int exprCo
3f20: 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
3f30: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3f40: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72  *pExpr){.  int r
3f50: 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  eg = 0;.#ifndef 
3f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3f70: 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72  UERY.  if( pExpr
3f80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3f90: 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c  ){.    reg = sql
3fa0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
3fb0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
3fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
3fd0: 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b  if.  return reg;
3fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
3ff0: 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74  nt pVector point
4000: 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78  s to a vector ex
4010: 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65  pression - eithe
4020: 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a  r a TK_VECTOR.**
4030: 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68   or TK_SELECT th
4040: 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  at returns more 
4050: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e  than one column.
4060: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4070: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65  eturns.** the re
4080: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66  gister number of
4090: 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
40a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
40b0: 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  lue of.** elemen
40c0: 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20  t iField of the 
40d0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  vector..**.** If
40e0: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
40f0: 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69  _SELECT expressi
4100: 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  on, then code fo
4110: 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a  r it must have .
4120: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
4130: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
4140: 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73  the exprCodeSubs
4150: 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e  elect() routine.
4160: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
4170: 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65   parameter regSe
4180: 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74  lect should be t
4190: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
41a0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
41b0: 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  s.** containing 
41c0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
41d0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a  he sub-select. .
41e0: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
41f0: 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56   is of type TK_V
4200: 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65  ECTOR, then code
4210: 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74   for the request
4220: 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67  ed field.** is g
4230: 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69  enerated. In thi
4240: 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65  s case (*pRegFre
4250: 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  e) may be set to
4260: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
4270: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  * a temporary re
4280: 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65  gister to be fre
4290: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
42a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
42b0: 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  g..**.** Before 
42c0: 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75  returning, outpu
42d0: 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70  t parameter (*pp
42e0: 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20  Expr) is set to 
42f0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4300: 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72  Expr object corr
4310: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65  esponding to ele
4320: 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68  ment iElem of th
4330: 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61  e vector..*/.sta
4340: 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74  tic int exprVect
4350: 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61  orRegister(.  Pa
4360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4380: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
4390: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
43a0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
43b0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f      /* Vector to
43c0: 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74   extract element
43d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
43e0: 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Field,          
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4400: 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66  eld to extract f
4410: 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20  rom pVector */. 
4420: 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20   int regSelect, 
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
4450: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
4460: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
4470: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
4480: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70       /* OUT: Exp
4490: 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20  ression element 
44a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72  */.  int *pRegFr
44b0: 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
44c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d       /* OUT: Tem
44d0: 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
44e0: 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70  ee */.){.  u8 op
44f0: 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a   = pVector->op;.
4500: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
4510: 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54  _VECTOR || op==T
4520: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70  K_REGISTER || op
4530: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
4540: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
4550: 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70 45  STER ){.    *ppE
4560: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65 63  xpr = sqlite3Vec
4570: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
4580: 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64 29  pVector, iField)
4590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 65  ;.    return pVe
45a0: 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69  ctor->iTable+iFi
45b0: 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  eld;.  }.  if( o
45c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
45d0: 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56      *ppExpr = pV
45e0: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
45f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65  ->pEList->a[iFie
4600: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ld].pExpr;.     
4610: 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74  return regSelect
4620: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a  +iField;.  }.  *
4630: 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72  ppExpr = pVector
4640: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
4650: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65  eld].pExpr;.  re
4660: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
4670: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
4680: 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72   *ppExpr, pRegFr
4690: 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ee);.}../*.** Ex
46a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
46b0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  s a comparison b
46c0: 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f  etween two vecto
46d0: 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74  r values. Comput
46e0: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  e.** the result 
46f0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
4700: 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c  n (1, 0, or NULL
4710: 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  ) and write that
4720: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  .** result into 
4730: 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a  register dest..*
4740: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4750: 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65  must satisfy the
4760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f   following preco
4770: 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  nditions:.**.** 
4780: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
4790: 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d  =TK_IS:      op=
47a0: 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53  =TK_EQ and p5==S
47b0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
47c0: 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d     if pExpr->op=
47d0: 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d  =TK_ISNOT:   op=
47e0: 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53  =TK_NE and p5==S
47f0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20  QLITE_NULLEQ.** 
4800: 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20     otherwise:   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d               op=
4820: 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70  =pExpr->op and p
4830: 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76  5==0.*/.static v
4840: 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f  oid codeVectorCo
4850: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
4860: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
4870: 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  * Code generator
4880: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4890: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
48a0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
48b0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
48c0: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
48d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
48e0: 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
48f0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
4900: 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20  /.  u8 op,      
4910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
4920: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
4930: 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
4940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4950: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20  QLITE_NULLEQ or 
4960: 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  zero */.){.  Vdb
4970: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
4980: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c  Vdbe;.  Expr *pL
4990: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
49a0: 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft;.  Expr *pRig
49b0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
49c0: 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20  ht;.  int nLeft 
49d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
49e0: 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
49f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
4a00: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e  egLeft = 0;.  in
4a10: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
4a20: 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20    u8 opx = op;. 
4a30: 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d 20   int addrDone = 
4a40: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4a50: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  abel(v);..  if( 
4a60: 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45 78  nLeft!=sqlite3Ex
4a70: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52 69  prVectorSize(pRi
4a80: 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ght) ){.    sqli
4a90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4aa0: 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
4ab0: 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72 65  isused");.    re
4ac0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
4ad0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
4ae0: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
4af0: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
4b20: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20  p==TK_ISNOT .   
4b30: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72  ==TK_LT || pExpr
4b50: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20  ->op==TK_GT .   
4b60: 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70      || pExpr->op
4b70: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72  ==TK_LE || pExpr
4b80: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 29  ->op==TK_GE .  )
4b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
4ba0: 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45  r->op==op || (pE
4bb0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26  xpr->op==TK_IS &
4bc0: 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20  & op==TK_EQ).   
4bd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78           || (pEx
4be0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
4bf0: 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29   && op==TK_NE) )
4c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c10: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d  0 || pExpr->op!=
4c20: 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  op );.  assert( 
4c30: 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  p5==SQLITE_NULLE
4c40: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
4c50: 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20 53  op );..  p5 |= S
4c60: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a 20  QLITE_STOREP2;. 
4c70: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20   if( opx==TK_LE 
4c80: 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20  ) opx = TK_LT;. 
4c90: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20   if( opx==TK_GE 
4ca0: 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a  ) opx = TK_GT;..
4cb0: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4cc0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4cd0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4ce0: 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43  regRight = exprC
4cf0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
4d00: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20  rse, pRight);.. 
4d10: 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f   for(i=0; 1 /*Lo
4d20: 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72 65  op exits by "bre
4d30: 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20  ak"*/; i++){.   
4d40: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
4d50: 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  0, regFree2 = 0;
4d60: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20 2a  .    Expr *pL, *
4d70: 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31 2c  pR; .    int r1,
4d80: 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28   r2;.    assert(
4d90: 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66 74   i>=0 && i<nLeft
4da0: 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30 20   );.    if( i>0 
4db0: 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  ) sqlite3ExprCac
4dc0: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
4dd0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4de0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4df0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4e00: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e10: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e20: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e30: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e40: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e50: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e60: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e70: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e80: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e90: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4ea0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4eb0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4ec0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ed0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ee0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ef0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4f00: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f10: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f20: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f30: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f40: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f50: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f60: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f70: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f80: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f90: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4fa0: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fb0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fc0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fd0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fe0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4ff0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5000: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5010: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5020: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5030: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5040: 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70  i>0 ) sqlite3Exp
5050: 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
5060: 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c  );.    if( i==nL
5070: 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62  eft-1 ){.      b
5080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5090: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29  if( opx==TK_EQ )
50a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
50b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
50c0: 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64  IfNot, dest, add
50d0: 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65  rDone); VdbeCove
50e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70  rage(v);.      p
50f0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
5100: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  NULL;.    }else 
5110: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29  if( opx==TK_NE )
5120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5130: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5140: 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f  If, dest, addrDo
5150: 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ne); VdbeCoverag
5160: 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c  e(v);.      p5 |
5170: 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  = SQLITE_KEEPNUL
5180: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
5190: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
51a0: 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  TK_LT || op==TK_
51b0: 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20  GT || op==TK_LE 
51c0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  || op==TK_GE );.
51d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c  eAddOp2(v, OP_El
51f0: 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72  seNotEq, 0, addr
5200: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  Done);.      Vdb
5210: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
5220: 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20  p==TK_LT);.     
5230: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
5240: 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20  v, op==TK_GT);. 
5250: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5260: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45  eIf(v, op==TK_LE
5270: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5280: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
5290: 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28  K_GE);.      if(
52a0: 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70   i==nLeft-2 ) op
52b0: 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20  x = op;.    }.  
52c0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
52d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
52e0: 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66  ddrDone);.}..#if
52f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
5300: 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43  _DEPTH>0./*.** C
5310: 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65  heck that argume
5320: 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65  nt nHeight is le
5330: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
5340: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a   to the maximum.
5350: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
5360: 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20  pth allowed. If 
5370: 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65  it is not, leave
5380: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5390: 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  e in.** pParse..
53a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
53b0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61  prCheckHeight(Pa
53c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
53d0: 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74   nHeight){.  int
53e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
53f0: 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20  .  int mxHeight 
5400: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
5410: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5420: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
5430: 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48   if( nHeight>mxH
5440: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  eight ){.    sql
5450: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5460: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78  rse, .       "Ex
5470: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73  pression tree is
5480: 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69   too large (maxi
5490: 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20  mum depth %d)", 
54a0: 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a  mxHeight.    );.
54b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
54c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
54d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn rc;.}../* Th
54e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
54f0: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69  e functions, hei
5500: 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69  ghtOfExpr(), hei
5510: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a  ghtOfExprList().
5520: 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53  ** and heightOfS
5530: 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65  elect(), are use
5540: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
5550: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
5560: 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72  t.** of any expr
5570: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
5580: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74  renced by the st
5590: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
55a0: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61  s the.** first a
55b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
55c0: 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68  f this maximum h
55d0: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
55e0: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
55f0: 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a  t value pointed.
5600: 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68  ** to by pnHeigh
5610: 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  t, the second pa
5620: 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65  rameter, then se
5630: 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74  t *pnHeight to t
5640: 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f  hat.** value..*/
5650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5660: 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a  ghtOfExpr(Expr *
5670: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5680: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5690: 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74    if( p->nHeight
56a0: 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20  >*pnHeight ){.  
56b0: 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
56c0: 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  p->nHeight;.    
56d0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
56e0: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
56f0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
5700: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5710: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5720: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
5730: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
5740: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69   i++){.      hei
5750: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69  ghtOfExpr(p->a[i
5760: 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68  ].pExpr, pnHeigh
5770: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
5780: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5790: 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63  htOfSelect(Selec
57a0: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
57b0: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
57c0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
57d0: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48  r(p->pWhere, pnH
57e0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
57f0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76  htOfExpr(p->pHav
5800: 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ing, pnHeight);.
5810: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5820: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65  (p->pLimit, pnHe
5830: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5840: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
5850: 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29  EList, pnHeight)
5860: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5870: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
5880: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
5890: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
58a0: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
58b0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
58c0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
58d0: 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67  ->pPrior, pnHeig
58e0: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
58f0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
5900: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
5910: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
5920: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
5930: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
5940: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
5950: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
5960: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
5970: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
5980: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
5990: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
59a0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
59b0: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
59c0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
59d0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
59e0: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
59f0: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
5a00: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
5a10: 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61  agate EP_Propaga
5a20: 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d  te flags up from
5a30: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f   Expr.x.pList to
5a40: 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20   Expr.flags,.** 
5a50: 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
5a60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5a70: 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70  xprSetHeight(Exp
5a80: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  r *p){.  int nHe
5a90: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5aa0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66  htOfExpr(p->pLef
5ab0: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5ac0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5ad0: 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74  pRight, &nHeight
5ae0: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
5af0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5b00: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
5b10: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5b20: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e  p->x.pSelect, &n
5b30: 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  Height);.  }else
5b40: 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20   if( p->x.pList 
5b50: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
5b60: 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69  xprList(p->x.pLi
5b70: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
5b80: 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     p->flags |= E
5b90: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71  P_Propagate & sq
5ba0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
5bb0: 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  gs(p->x.pList);.
5bc0: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
5bd0: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
5be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
5bf0: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
5c00: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
5c10: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
5c20: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
5c30: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
5c40: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
5c50: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
5c60: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
5c70: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
5c80: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
5c90: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
5ca0: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
5cb0: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
5cc0: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
5cd0: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
5ce0: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
5cf0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
5d00: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
5d10: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5d20: 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p){.  if( pParse
5d30: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
5d40: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
5d50: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
5d60: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
5d70: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
5d80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
5d90: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
5da0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
5db0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5dc0: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
5dd0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5de0: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
5df0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
5e00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
5e10: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
5e20: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
5e30: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
5e40: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
5e50: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
5e60: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
5e70: 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67   /* ABOVE:  Heig
5e80: 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65  ht enforcement e
5e90: 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20  nabled.  BELOW: 
5ea0: 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65  Height enforceme
5eb0: 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20  nt off */./*.** 
5ec0: 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  Propagate all EP
5ed0: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5ee0: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5ef0: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5f00: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5f10: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5f20: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5f30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5f40: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5f50: 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  p && p->x.pList 
5f60: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
5f70: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
5f80: 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66  ect) ){.    p->f
5f90: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
5fa0: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
5fb0: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5fc0: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  .pList);.  }.}.#
5fd0: 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65  define exprSetHe
5fe0: 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f  ight(y).#endif /
5ff0: 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  * SQLITE_MAX_EXP
6000: 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a  R_DEPTH>0 */../*
6010: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6020: 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c   is the core all
6030: 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20  ocator for Expr 
6040: 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e  nodes..**.** Con
6050: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
6060: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
6070: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
6080: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
6090: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
60a0: 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54  e and for the pT
60b0: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  oken argument is
60c0: 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61   a single alloca
60d0: 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  tion.** obtained
60e0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
60f0: 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61  alloc().  The ca
6100: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
6110: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
6120: 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
6130: 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75   the node eventu
6140: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
6150: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  .**.** If dequot
6160: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
6170: 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74  the token (if it
6180: 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75   exists) is dequ
6190: 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75  oted..** If dequ
61a0: 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f  ote is false, no
61b0: 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65   dequoting is pe
61c0: 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64 65  rformed.  The de
61d0: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
61e0: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
61f0: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
6200: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
6210: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
6220: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
6230: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
6240: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
6250: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
6260: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
6270: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
6280: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
6290: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
62a0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
62b0: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
62c0: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
62d0: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
62e0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
62f0: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
6300: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
6310: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
6320: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
6330: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
6340: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
6350: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
6360: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
6370: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
6380: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
6390: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
63a0: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
63b0: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
63c0: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
63d0: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
63e0: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
63f0: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
6400: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
6410: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
6420: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
6430: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
6440: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6450: 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  awNN() */.  int 
6460: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6470: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6480: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6490: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
64a0: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
64b0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
64c0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
64d0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
64e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
64f0: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
6500: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
6510: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
6520: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
6530: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
6540: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
6550: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
6560: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
6570: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
6580: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
6590: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
65a0: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
65b0: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
65c0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
65d0: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
65e0: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
65f0: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
6600: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
6610: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
6620: 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  )+nExtra);.  if(
6630: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
6640: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
6650: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6660: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
6670: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
6680: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
6690: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
66a0: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
66b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
66c0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
66d0: 6c 75 65 7c 45 50 5f 4c 65 61 66 3b 0a 20 20 20  lue|EP_Leaf;.   
66e0: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61       pNew->u.iVa
66f0: 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20  lue = iValue;.  
6700: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6710: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
6720: 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  n = (char*)&pNew
6730: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  [1];.        ass
6740: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d  ert( pToken->z!=
6750: 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d  0 || pToken->n==
6760: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
6770: 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d   pToken->n ) mem
6780: 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  cpy(pNew->u.zTok
6790: 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  en, pToken->z, p
67a0: 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20  Token->n);.     
67b0: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
67c0: 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30  n[pToken->n] = 0
67d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
67e0: 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33  quote && sqlite3
67f0: 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e  Isquote(pNew->u.
6800: 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20  zToken[0]) ){.  
6810: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
6820: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
6830: 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73  "' ) pNew->flags
6840: 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64   |= EP_DblQuoted
6850: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
6860: 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77 2d  te3Dequote(pNew-
6870: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
6880: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6890: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
68a0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
68b0: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
68c0: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
68d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
68e0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
68f0: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
6900: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
6910: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
6920: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
6930: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
6940: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
6950: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
6960: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
6970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
6980: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
6990: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
69a0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
69b0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
69c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
69d0: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
69e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
69f0: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
6a00: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
6a10: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6a20: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
6a30: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
6a40: 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   x.n = sqlite3St
6a50: 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 3b 0a  rlen30(zToken);.
6a60: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
6a70: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70  ExprAlloc(db, op
6a80: 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  , &x, 0);.}../*.
6a90: 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74 72 65  ** Attach subtre
6aa0: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
6ab0: 67 68 74 20 74 6f 20 74 68 65 20 45 78 70 72 20  ght to the Expr 
6ac0: 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a  node pRoot..**.*
6ad0: 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c  * If pRoot==NULL
6ae0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
6af0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
6b00: 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  tion error has o
6b10: 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74  ccurred..** In t
6b20: 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65  hat case, delete
6b30: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 70 4c   the subtrees pL
6b40: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
6b50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
6b60: 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65  xprAttachSubtree
6b70: 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
6b80: 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c  ,.  Expr *pRoot,
6b90: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a  .  Expr *pLeft,.
6ba0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29    Expr *pRight.)
6bb0: 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30  {.  if( pRoot==0
6bc0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6bd0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6be0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   );.    sqlite3E
6bf0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  xprDelete(db, pL
6c00: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
6c10: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6c20: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
6c30: 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  {.    if( pRight
6c40: 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d   ){.      pRoot-
6c50: 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74  >pRight = pRight
6c60: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66  ;.      pRoot->f
6c70: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
6c80: 67 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66  gate & pRight->f
6c90: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lags;.    }.    
6ca0: 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20  if( pLeft ){.   
6cb0: 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20     pRoot->pLeft 
6cc0: 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70  = pLeft;.      p
6cd0: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
6ce0: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c  P_Propagate & pL
6cf0: 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  eft->flags;.    
6d00: 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48 65 69  }.    exprSetHei
6d10: 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a  ght(pRoot);.  }.
6d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
6d30: 65 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77  e an Expr node w
6d40: 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61  hich joins as ma
6d50: 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72 65  ny as two subtre
6d60: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72  es..**.** One or
6d70: 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62   both of the sub
6d80: 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c  trees can be NUL
6d90: 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  L.  Return a poi
6da0: 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a  nter to the new.
6db0: 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f  ** Expr node.  O
6dc0: 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72  r, if an OOM err
6dd0: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70  or occurs, set p
6de0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
6df0: 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65  cFailed,.** free
6e00: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61 6e   the subtrees an
6e10: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
6e20: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50  /.Expr *sqlite3P
6e30: 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70  Expr(.  Parse *p
6e40: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
6e50: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
6e60: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  xt */.  int op, 
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70  /* Expression op
6e90: 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  code */.  Expr *
6ea0: 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  pLeft,          
6eb0: 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e    /* Left operan
6ec0: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  d */.  Expr *pRi
6ed0: 67 68 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  ght            /
6ee0: 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20  * Right operand 
6ef0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b  */.){.  Expr *p;
6f00: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e  .  if( op==TK_AN
6f10: 44 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  D && pParse->nEr
6f20: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  r==0 ){.    /* T
6f30: 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
6f40: 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66   short-circuit f
6f50: 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  alse optimizatio
6f60: 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20  n for AND */.   
6f70: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
6f80: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
6f90: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
6fa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
6fb0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6fc0: 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62  RawNN(pParse->db
6fd0: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
6fe0: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
6ff0: 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
7000: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
7010: 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f 70        p->op = op
7020: 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a 20   & TKFLG_MASK;. 
7030: 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d       p->iAgg = -
7040: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
7050: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
7060: 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64  btrees(pParse->d
7070: 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  b, p, pLeft, pRi
7080: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ght);.  }.  if( 
7090: 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  p ) {.    sqlite
70a0: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
70b0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
70c0: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ght);.  }.  retu
70d0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn p;.}../*.** A
70e0: 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68  dd pSelect to th
70f0: 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  e Expr.x.pSelect
7100: 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20   field.  Or, if 
7110: 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64  pExpr is NULL (d
7120: 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72  ue.** do a memor
7130: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
7140: 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74  lure) then delet
7150: 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62  e the pSelect ob
7160: 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ject..*/.void sq
7170: 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c  lite3PExprAddSel
7180: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
7190: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
71a0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
71b0: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b  {.  if( pExpr ){
71c0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53  .    pExpr->x.pS
71d0: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
71e0: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
71f0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
7200: 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71  IsSelect|EP_Subq
7210: 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
7220: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
7230: 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20  ndFlags(pParse, 
7240: 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  pExpr);.  }else{
7250: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
7260: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
7270: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
7280: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
7290: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
72a0: 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  lect);.  }.}.../
72b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
72c0: 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  ession is always
72d0: 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72 20   either TRUE or 
72e0: 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69 76  FALSE (respectiv
72f0: 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  ely),.** then re
7300: 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20  turn 1.  If one 
7310: 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
7320: 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75 65   the truth value
7330: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
7340: 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65  ssion at compile
7350: 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a  -time return 0..
7360: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
7370: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
7380: 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75  If is OK to retu
7390: 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20 69  rn 0 here even i
73a0: 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  f.** the express
73b0: 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c  ion really is al
73c0: 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61  ways false or fa
73d0: 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67  lse (a false neg
73e0: 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69  ative)..** But i
73f0: 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72 65  t is a bug to re
7400: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
7410: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68  pression might h
7420: 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
7430: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20   boolean values 
7440: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69 72  in different cir
7450: 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61  cumstances (a fa
7460: 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a  lse positive.).*
7470: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
7480: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
7490: 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64   is part of cond
74a0: 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a  itional for a.**
74b0: 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
74c0: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
74d0: 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d  mine at compile-
74e0: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
74f0: 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75  not.** is it tru
7500: 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61  e or false, so a
7510: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a  lways return 0..
7520: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
7530: 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78 70  prAlwaysTrue(Exp
7540: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d  r *p){.  int v =
7550: 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
7560: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
7570: 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
7580: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
7590: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
75a0: 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72  r(p, &v) ) retur
75b0: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21  n 0;.  return v!
75c0: 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  =0;.}.static int
75d0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
75e0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
75f0: 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78   v = 0;.  if( Ex
7600: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7610: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
7620: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
7630: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e  !sqlite3ExprIsIn
7640: 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72  teger(p, &v) ) r
7650: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
7660: 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n v==0;.}../*.**
7670: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
7680: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
7690: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
76a0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
76b0: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
76c0: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
76d0: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
76e0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f  sion..**.** If o
76f0: 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f  ne side or the o
7700: 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20  ther of the AND 
7710: 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66  is known to be f
7720: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65  alse, then inste
7730: 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69  ad.** of returni
7740: 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73  ng an AND expres
7750: 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72  sion, just retur
7760: 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  n a constant exp
7770: 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20  ression with.** 
7780: 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65  a value of false
7790: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
77a0: 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65  e3ExprAnd(sqlite
77b0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65  3 *db, Expr *pLe
77c0: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
77d0: 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d  ){.  if( pLeft==
77e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
77f0: 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20  pRight;.  }else 
7800: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b  if( pRight==0 ){
7810: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66  .    return pLef
7820: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  t;.  }else if( e
7830: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
7840: 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77  Left) || exprAlw
7850: 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29  aysFalse(pRight)
7860: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7870: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  xprDelete(db, pL
7880: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
7890: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
78a0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
78b0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
78c0: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45  lloc(db, TK_INTE
78d0: 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74  GER, &sqlite3Int
78e0: 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20  Tokens[0], 0);. 
78f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
7900: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
7910: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
7920: 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _AND, 0, 0);.   
7930: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
7940: 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70  chSubtrees(db, p
7950: 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  New, pLeft, pRig
7960: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
7970: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
7980: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
7990: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
79a0: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
79b0: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
79c0: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
79d0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
79e0: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
79f0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
7a00: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
7a10: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
7a20: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
7a30: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7a40: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
7a50: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
7a60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
7a70: 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49  oc(db, TK_FUNCTI
7a80: 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  ON, pToken, 1);.
7a90: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
7aa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7ab0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
7ac0: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
7ad0: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
7ae0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
7af0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7b00: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
7b10: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45 78  st = pList;.  Ex
7b20: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
7b30: 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63 29 3b  ew, EP_HasFunc);
7b40: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
7b50: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
7b60: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
7b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
7b80: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
7b90: 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  s(pParse, pNew);
7ba0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
7bc0: 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  a variable numbe
7bd0: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
7be0: 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20  on that encodes 
7bf0: 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e  a wildcard.** in
7c00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
7c10: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a  L statement.  .*
7c20: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63  *.** Wildcards c
7c30: 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
7c40: 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73  ingle "?" are as
7c50: 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20  signed the next 
7c60: 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61  sequential.** va
7c70: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a  riable number..*
7c80: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
7c90: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
7ca0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
7cb0: 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e  he number "nnn".
7cc0: 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72    We make.** sur
7cd0: 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74  e "nnn" is not t
7ce0: 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f 69 64 20  oo big to avoid 
7cf0: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
7d00: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
7d10: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
7d20: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
7d30: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
7d40: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
7d50: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
7d60: 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20  ":aaa", "@aaa", 
7d70: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
7d80: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
7d90: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
7da0: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
7db0: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
7dc0: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
7dd0: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
7de0: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
7df0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
7e00: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
7e10: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
7e20: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
7e30: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7e40: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
7e50: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
7e60: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
7e70: 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73 71 6c 69  , u32 n){.  sqli
7e80: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7e90: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
7ea0: 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61 72 20 78  ar *z;.  ynVar x
7eb0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
7ec0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
7ed0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
7ee0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
7ef0: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64  _IntValue|EP_Red
7f00: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
7f10: 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70  y) );.  z = pExp
7f20: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61  r->u.zToken;.  a
7f30: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
7f40: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30   assert( z[0]!=0
7f50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
7f60: 3d 28 75 33 32 29 73 71 6c 69 74 65 33 53 74 72  =(u32)sqlite3Str
7f70: 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20 20 69 66  len30(z) );.  if
7f80: 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20  ( z[1]==0 ){.   
7f90: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
7fa0: 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41  the form "?".  A
7fb0: 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76  ssign the next v
7fc0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
7fd0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b  /.    assert( z[
7fe0: 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 78  0]=='?' );.    x
7ff0: 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61   = (ynVar)(++pPa
8000: 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65  rse->nVar);.  }e
8010: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 64 6f 41  lse{.    int doA
8020: 64 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  dd = 0;.    if( 
8030: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  z[0]=='?' ){.   
8040: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
8050: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
8060: 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e  ".  Convert "nnn
8070: 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  " to an integer 
8080: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  and.      ** use
8090: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
80a0: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
80b0: 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20      i64 i;.     
80c0: 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20 20 20 20   int bOk;.      
80d0: 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f 2a 4f 50  if( n==2 ){ /*OP
80e0: 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 54 52  TIMIZATION-IF-TR
80f0: 55 45 2a 2f 0a 20 20 20 20 20 20 20 20 69 20 3d  UE*/.        i =
8100: 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f 2a 20 54   z[1]-'0';  /* T
8110: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
8120: 66 20 3f 4e 20 66 6f 72 20 61 20 73 69 6e 67 6c  f ?N for a singl
8130: 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a 20 20 20  e digit N */.   
8140: 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20       bOk = 1;.  
8150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8160: 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69     bOk = 0==sqli
8170: 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c  te3Atoi64(&z[1],
8180: 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45   &i, n-1, SQLITE
8190: 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a  _UTF8);.      }.
81a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
81b0: 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  i==0 );.      te
81c0: 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a  stcase( i==1 );.
81d0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
81e0: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
81f0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
8200: 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b  BLE_NUMBER]-1 );
8210: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8220: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
8230: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8240: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a  ABLE_NUMBER] );.
8250: 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30        if( bOk==0
8260: 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d   || i<1 || i>db-
8270: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
8280: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
8290: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20  MBER] ){.       
82a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
82b0: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
82c0: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
82d0: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
82e0: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
82f0: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51     db->aLimit[SQ
8300: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
8310: 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20  BLE_NUMBER]);.  
8320: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8330: 20 20 20 20 7d 0a 20 20 20 20 20 20 78 20 3d 20      }.      x = 
8340: 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20  (ynVar)i;.      
8350: 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e 56  if( x>pParse->nV
8360: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ar ){.        pP
8370: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e  arse->nVar = (in
8380: 74 29 78 3b 0a 20 20 20 20 20 20 20 20 64 6f 41  t)x;.        doA
8390: 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  dd = 1;.      }e
83a0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 56  lse if( sqlite3V
83b0: 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50  ListNumToName(pP
83c0: 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 78 29  arse->pVList, x)
83d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==0 ){.        d
83e0: 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  oAdd = 1;.      
83f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
8400: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20     /* Wildcards 
8410: 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61  like ":aaa", "$a
8420: 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20  aa" or "@aaa".  
8430: 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  Reuse the same v
8440: 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  ariable.      **
8450: 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 70   number as the p
8460: 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20  rior appearance 
8470: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
8480: 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65  , or if the name
8490: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65  .      ** has ne
84a0: 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66  ver appeared bef
84b0: 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73  ore, reuse the s
84c0: 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ame variable num
84d0: 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ber.      */.   
84e0: 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29 73 71     x = (ynVar)sq
84f0: 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d 65 54 6f  lite3VListNameTo
8500: 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70 56 4c 69  Num(pParse->pVLi
8510: 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  st, z, n);.     
8520: 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20 20   if( x==0 ){.   
8530: 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29       x = (ynVar)
8540: 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29  (++pParse->nVar)
8550: 3b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64 20  ;.        doAdd 
8560: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
8570: 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 41 64 64   }.    if( doAdd
8580: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
8590: 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pVList = sqlit
85a0: 65 33 56 4c 69 73 74 41 64 64 28 64 62 2c 20 70  e3VListAdd(db, p
85b0: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a  Parse->pVList, z
85c0: 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20 7d 0a 20  , n, x);.    }. 
85d0: 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c   }.  pExpr->iCol
85e0: 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66 28 20 78  umn = x;.  if( x
85f0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
8600: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
8610: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
8620: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8630: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
8640: 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  ny SQL variables
8650: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
8660: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
8670: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
8680: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  n tree..*/.stati
8690: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
86a0: 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  E void sqlite3Ex
86b0: 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74  prDeleteNN(sqlit
86c0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
86d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
86e0: 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20   );.  /* Sanity 
86f0: 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68  check: Assert th
8700: 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20  at the IntValue 
8710: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  is non-negative 
8720: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
8730: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
8740: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8750: 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d  _IntValue) || p-
8760: 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  >u.iValue>=0 );.
8770: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8780: 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48 61  BUG.  if( ExprHa
8790: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
87a0: 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48 61  Leaf) && !ExprHa
87b0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
87c0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
87d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 65    assert( p->pLe
87e0: 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ft==0 );.    ass
87f0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
8800: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8810: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30   p->x.pSelect==0
8820: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
8830: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
8840: 70 65 72 74 79 28 70 2c 20 28 45 50 5f 54 6f 6b  perty(p, (EP_Tok
8850: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29  enOnly|EP_Leaf))
8860: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45   ){.    /* The E
8870: 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e  xpr.x union is n
8880: 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65  ever used at the
8890: 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78   same time as Ex
88a0: 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20  pr.pRight */.   
88b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c   assert( p->x.pL
88c0: 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ist==0 || p->pRi
88d0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  ght==0 );.    if
88e0: 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 70 2d  ( p->pLeft && p-
88f0: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op!=TK_SELECT_C
8900: 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33 45  OLUMN ) sqlite3E
8910: 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20  xprDeleteNN(db, 
8920: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  p->pLeft);.    i
8930: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a  f( p->pRight ){.
8940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8950: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 2d  rDeleteNN(db, p-
8960: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 65  >pRight);.    }e
8970: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
8980: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
8990: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
89a0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
89b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
89c0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
89d0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
89e0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
89f0: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  db, p->x.pList);
8a00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8a10: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8a20: 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  (p, EP_MemToken)
8a30: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
8a40: 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  (db, p->u.zToken
8a50: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
8a60: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8a70: 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73  Static) ){.    s
8a80: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
8a90: 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  b, p);.  }.}.voi
8aa0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
8ab0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
8ac0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
8ad0: 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70 72   p ) sqlite3Expr
8ae0: 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b  DeleteNN(db, p);
8af0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
8b00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
8b10: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
8b20: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
8b30: 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  n structure .** 
8b40: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
8b50: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
8b60: 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  is is always one
8b70: 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   of EXPR_FULLSIZ
8b80: 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43  E,.** EXPR_REDUC
8b90: 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54  EDSIZE or EXPR_T
8ba0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f  OKENONLYSIZE..*/
8bb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
8bc0: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
8bd0: 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48  *p){.  if( ExprH
8be0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8bf0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65  _TokenOnly) ) re
8c00: 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  turn EXPR_TOKENO
8c10: 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45  NLYSIZE;.  if( E
8c20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8c30: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20  , EP_Reduced) ) 
8c40: 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55  return EXPR_REDU
8c50: 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72  CEDSIZE;.  retur
8c60: 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  n EXPR_FULLSIZE;
8c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75  .}../*.** The du
8c80: 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72  pedExpr*Size() r
8c90: 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74  outines each ret
8ca0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8cb0: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
8cc0: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63  .** to store a c
8cd0: 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73  opy of an expres
8ce0: 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69  sion or expressi
8cf0: 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64  on tree.  They d
8d00: 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20  iffer in.** how 
8d10: 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65  much of the tree
8d20: 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a   is measured..**
8d30: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
8d40: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20  rStructSize()   
8d50: 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74    Size of only t
8d60: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
8d70: 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  e .**     dupedE
8d80: 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20  xprNodeSize()   
8d90: 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72      Size of Expr
8da0: 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b   + space for tok
8db0: 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  en.**     dupedE
8dc0: 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20  xprSize()       
8dd0: 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e      Expr + token
8de0: 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f   + subtree compo
8df0: 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  nents.**.*******
8e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e40: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
8e50: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
8e60: 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  ze() function re
8e70: 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73  turns two values
8e80: 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a   OR-ed together:
8e90: 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70    .** (1) the sp
8ea0: 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
8eb0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
8ec0: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e  xpr structure on
8ed0: 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74  ly and .** (2) t
8ee0: 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20  he EP_xxx flags 
8ef0: 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68  that indicate wh
8f00: 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65  at the structure
8f10: 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e   size should be.
8f20: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
8f30: 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20  alues is always 
8f40: 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
8f50: 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45     EXPR_FULLSIZE
8f60: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45  .**      EXPR_RE
8f70: 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50  DUCEDSIZE   | EP
8f80: 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20  _Reduced.**     
8f90: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
8fa0: 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  IZE | EP_TokenOn
8fb0: 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ly.**.** The siz
8fc0: 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  e of the structu
8fd0: 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  re can be found 
8fe0: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72  by masking the r
8ff0: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f  eturn value.** o
9000: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  f this routine w
9010: 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20  ith 0xfff.  The 
9020: 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75  flags can be fou
9030: 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68  nd by masking th
9040: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
9050: 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65  e with EP_Reduce
9060: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a  d|EP_TokenOnly..
9070: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
9080: 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52  with flags==EXPR
9090: 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73  DUP_REDUCE, this
90a0: 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20   routines works 
90b0: 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20  on full-size.** 
90c0: 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72  (unreduced) Expr
90d0: 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79   objects as they
90e0: 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63   or originally c
90f0: 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68  onstructed by th
9100: 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72  e parser..** Dur
9110: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ing expression a
9120: 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69  nalysis, extra i
9130: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f  nformation is co
9140: 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64  mputed and moved
9150: 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70   into.** later p
9160: 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72  arts of teh Expr
9170: 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74   object and that
9180: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
9190: 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f  on might get cho
91a0: 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74  pped.** off if t
91b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
91c0: 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20   reduced.  Note 
91d0: 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65  also that it doe
91e0: 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a  s not work to.**
91f0: 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50   make an EXPRDUP
9200: 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20  _REDUCE copy of 
9210: 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65 73  a reduced expres
9220: 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c  sion.  It is onl
9230: 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65  y legal.** to re
9240: 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65 20  duce a pristine 
9250: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
9260: 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e  from the parser.
9270: 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61    The implementa
9280: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64  tion.** of duped
9290: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29  ExprStructSize()
92a0: 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c   contain multipl
92b0: 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  e assert() state
92c0: 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d  ments that attem
92d0: 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65  pt.** to enforce
92e0: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
92f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9300: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
9310: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
9320: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
9330: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
9340: 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  flags==EXPRDUP_R
9350: 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d  EDUCE || flags==
9360: 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65  0 ); /* Only one
9370: 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f   flag value allo
9380: 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  wed */.  assert(
9390: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d   EXPR_FULLSIZE<=
93a0: 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72  0xfff );.  asser
93b0: 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50 5f  t( (0xfff & (EP_
93c0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
93d0: 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69  Only))==0 );.  i
93e0: 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20 70  f( 0==flags || p
93f0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
9400: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6e 53  COLUMN ){.    nS
9410: 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53  ize = EXPR_FULLS
9420: 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IZE;.  }else{.  
9430: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
9440: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9450: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
9460: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73  duced) );.    as
9470: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
9480: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
9490: 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61  mJoin) ); .    a
94a0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
94b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65  roperty(p, EP_Me
94c0: 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61  mToken) );.    a
94d0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
94e0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f  roperty(p, EP_No
94f0: 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69  Reduce) );.    i
9500: 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70  f( p->pLeft || p
9510: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
9520: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
9530: 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50  REDUCEDSIZE | EP
9540: 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65  _Reduced;.    }e
9550: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
9560: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
9570: 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  );.      nSize =
9580: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
9590: 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  IZE | EP_TokenOn
95a0: 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ly;.    }.  }.  
95b0: 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a  return nSize;.}.
95c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
95d0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
95e0: 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
95f0: 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
9600: 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f  e the copy .** o
9610: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
9620: 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20  ture and a copy 
9630: 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54  of the Expr.u.zT
9640: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
9650: 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69  that.** string i
9660: 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73  s defined.).*/.s
9670: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
9680: 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72  xprNodeSize(Expr
9690: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
96a0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64  .  int nByte = d
96b0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
96c0: 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30  ze(p, flags) & 0
96d0: 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70  xfff;.  if( !Exp
96e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
96f0: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
9700: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
9710: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
9720: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
9730: 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a  .zToken)+1;.  }.
9740: 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
9750: 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nByte);.}../*.**
9760: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
9770: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
9780: 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  ired to create a
9790: 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68   duplicate of th
97a0: 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  e .** expression
97b0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
97c0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
97d0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
97e0: 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20  nt is a.** mask 
97f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44  containing EXPRD
9800: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
9810: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
9820: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
9830: 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20  space to create 
9840: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
9850: 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73  pr struct.** its
9860: 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66 66  elf and the buff
9870: 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20 62  er referred to b
9880: 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c  y Expr.u.zToken,
9890: 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49   if any..**.** I
98a0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
98b0: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
98c0: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
98d0: 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73  n value includes
98e0: 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75   .** space to du
98f0: 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72  plicate all Expr
9900: 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72   nodes in the tr
9910: 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70  ee formed by Exp
9920: 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20  r.pLeft .** and 
9930: 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72 69  Expr.pRight vari
9940: 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66  ables (but not f
9950: 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72 65  or any structure
9960: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20  s pointed to or 
9970: 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72  .** descended fr
9980: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
9990: 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53  ist or Expr.x.pS
99a0: 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73 29  elect variables)
99b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
99c0: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45 78  dupedExprSize(Ex
99d0: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
99e0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
99f0: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
9a00: 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64     nByte = duped
9a10: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20  ExprNodeSize(p, 
9a20: 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
9a30: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
9a40: 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42  DUCE ){.      nB
9a50: 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72  yte += dupedExpr
9a60: 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66  Size(p->pLeft, f
9a70: 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78 70  lags) + dupedExp
9a80: 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c  rSize(p->pRight,
9a90: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20   flags);.    }. 
9aa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74   }.  return nByt
9ab0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
9ac0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
9ad0: 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45  ilar to sqlite3E
9ae0: 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70 74  xprDup(), except
9af0: 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66 65   that if pzBuffe
9b00: 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c  r .** is not NUL
9b10: 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72  L then *pzBuffer
9b20: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70   is assumed to p
9b30: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
9b40: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a   large enough .*
9b50: 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  * to store the c
9b60: 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f  opy of expressio
9b70: 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20  n p, the copies 
9b80: 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a  of p->u.zToken.*
9b90: 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65  * (if applicable
9ba0: 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65  ), and the copie
9bb0: 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66  s of the p->pLef
9bc0: 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20  t and p->pRight 
9bd0: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
9be0: 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72  if any. Before r
9bf0: 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66  eturning, *pzBuf
9c00: 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74 68  fer is set to th
9c10: 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
9c20: 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  t the.** portion
9c30: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
9c40: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
9c50: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
9c60: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
9c70: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
9c80: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 64  , Expr *p, int d
9c90: 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a  upFlags, u8 **pz
9ca0: 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20  Buffer){.  Expr 
9cb0: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
9cc0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
9cd0: 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c  urn */.  u8 *zAl
9ce0: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f  loc;           /
9cf0: 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 66  * Memory space f
9d00: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62 75 69  rom which to bui
9d10: 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 2a  ld Expr object *
9d20: 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63 46 6c  /.  u32 staticFl
9d30: 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45 50 5f  ag;       /* EP_
9d40: 53 74 61 74 69 63 20 69 66 20 73 70 61 63 65 20  Static if space 
9d50: 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  not obtained fro
9d60: 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61  m malloc */..  a
9d70: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
9d80: 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20    assert( p );. 
9d90: 20 61 73 73 65 72 74 28 20 64 75 70 46 6c 61 67   assert( dupFlag
9da0: 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73  s==0 || dupFlags
9db0: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
9dc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a   );.  assert( pz
9dd0: 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70  Buffer==0 || dup
9de0: 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  Flags==EXPRDUP_R
9df0: 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46  EDUCE );..  /* F
9e00: 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20  igure out where 
9e10: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65 77  to write the new
9e20: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 2e   Expr structure.
9e30: 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75 66 66   */.  if( pzBuff
9e40: 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63  er ){.    zAlloc
9e50: 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20   = *pzBuffer;.  
9e60: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
9e70: 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73  P_Static;.  }els
9e80: 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20  e{.    zAlloc = 
9e90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
9ea0: 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64 45 78  awNN(db, dupedEx
9eb0: 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  prSize(p, dupFla
9ec0: 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74 69 63  gs));.    static
9ed0: 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Flag = 0;.  }.  
9ee0: 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a  pNew = (Expr *)z
9ef0: 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e  Alloc;..  if( pN
9f00: 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74  ew ){.    /* Set
9f10: 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65   nNewSize to the
9f20: 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20   size allocated 
9f30: 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72  for the structur
9f40: 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20  e pointed to.   
9f50: 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69   ** by pNew. Thi
9f60: 73 20 69 73 20 65 69 74 68 65 72 20 45 58 50 52  s is either EXPR
9f70: 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f  _FULLSIZE, EXPR_
9f80: 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20  REDUCEDSIZE or. 
9f90: 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e     ** EXPR_TOKEN
9fa0: 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e  ONLYSIZE. nToken
9fb0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
9fc0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63  umber of bytes c
9fd0: 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62  onsumed.    ** b
9fe0: 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  y the copy of th
9ff0: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
a000: 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20  ring (if any).. 
a010: 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20     */.    const 
a020: 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74  unsigned nStruct
a030: 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72  Size = dupedExpr
a040: 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 64 75  StructSize(p, du
a050: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e  pFlags);.    con
a060: 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20  st int nNewSize 
a070: 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20  = nStructSize & 
a080: 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e  0xfff;.    int n
a090: 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 21  Token;.    if( !
a0a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a0b0: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
a0c0: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
a0d0: 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d  {.      nToken =
a0e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
a0f0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20  (p->u.zToken) + 
a100: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
a110: 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a      nToken = 0;.
a120: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 75      }.    if( du
a130: 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  pFlags ){.      
a140: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
a150: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
a160: 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20  duced)==0 );.   
a170: 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63     memcpy(zAlloc
a180: 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a  , p, nNewSize);.
a190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a1a0: 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28 75 33   u32 nSize = (u3
a1b0: 32 29 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  2)exprStructSize
a1c0: 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  (p);.      memcp
a1d0: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69  y(zAlloc, p, nSi
a1e0: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ze);.      if( n
a1f0: 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49  Size<EXPR_FULLSI
a200: 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20 6d  ZE ){ .        m
a210: 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53  emset(&zAlloc[nS
a220: 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55  ize], 0, EXPR_FU
a230: 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20  LLSIZE-nSize);. 
a240: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a250: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f    /* Set the EP_
a260: 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65  Reduced, EP_Toke
a270: 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74  nOnly, and EP_St
a280: 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f  atic flags appro
a290: 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20  priately. */.   
a2a0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20   pNew->flags &= 
a2b0: 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  ~(EP_Reduced|EP_
a2c0: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61  TokenOnly|EP_Sta
a2d0: 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  tic|EP_MemToken)
a2e0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  ;.    pNew->flag
a2f0: 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  s |= nStructSize
a300: 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45   & (EP_Reduced|E
a310: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20  P_TokenOnly);.  
a320: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
a330: 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20   staticFlag;..  
a340: 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d    /* Copy the p-
a350: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
a360: 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
a370: 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20   if( nToken ){. 
a380: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65       char *zToke
a390: 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  n = pNew->u.zTok
a3a0: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c  en = (char*)&zAl
a3b0: 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20  loc[nNewSize];. 
a3c0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b       memcpy(zTok
a3d0: 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  en, p->u.zToken,
a3e0: 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a   nToken);.    }.
a3f0: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d  .    if( 0==((p-
a400: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
a410: 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e 4f  gs) & (EP_TokenO
a420: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b  nly|EP_Leaf)) ){
a430: 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  .      /* Fill i
a440: 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53  n the pNew->x.pS
a450: 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78  elect or pNew->x
a460: 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a  .pList member. *
a470: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
a480: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
a490: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
a4a0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
a4b0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
a4c0: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
a4d0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75 70  ->x.pSelect, dup
a4e0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 65  Flags);.      }e
a4f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
a500: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c  w->x.pList = sql
a510: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
a520: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20  db, p->x.pList, 
a530: 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  dupFlags);.     
a540: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a550: 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70   Fill in pNew->p
a560: 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70  Left and pNew->p
a570: 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66  Right. */.    if
a580: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
a590: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
a5a0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
a5b0: 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63   ){.      zAlloc
a5c0: 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64   += dupedExprNod
a5d0: 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67  eSize(p, dupFlag
a5e0: 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45  s);.      if( !E
a5f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a600: 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  New, EP_TokenOnl
a610: 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20  y|EP_Leaf) ){.  
a620: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
a630: 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a 20  t = p->pLeft ?. 
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c       exprDup(db,
a660: 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44   p->pLeft, EXPRD
a670: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
a680: 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  oc) : 0;.       
a690: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
a6a0: 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20 20 20  p->pRight ?.    
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20 70     exprDup(db, p
a6d0: 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55  ->pRight, EXPRDU
a6e0: 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f  P_REDUCE, &zAllo
a6f0: 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 0a  c) : 0;.      }.
a700: 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66        if( pzBuff
a710: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  er ){.        *p
a720: 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63  zBuffer = zAlloc
a730: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
a740: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
a750: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a760: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
a770: 45 50 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  EP_Leaf) ){.    
a780: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70      if( pNew->op
a790: 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  ==TK_SELECT_COLU
a7a0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
a7b0: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
a7c0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  >pLeft;.        
a7d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f    assert( p->iCo
a7e0: 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  lumn==0 || p->pR
a7f0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
a800: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a810: 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d  pRight==0  || p-
a820: 3e 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66  >pRight==p->pLef
a830: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t );.        }el
a840: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
a850: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
a860: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
a870: 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
a880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
a890: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  New->pRight = sq
a8a0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a8b0: 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a   p->pRight, 0);.
a8c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a8d0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
a8e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
a8f0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65   and return a de
a900: 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f  ep copy of the o
a910: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
a920: 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61  the second .** a
a930: 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f  rgument. If an O
a940: 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  OM condition is 
a950: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c  encountered, NUL
a960: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  L is returned.**
a970: 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c   and the db->mal
a980: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73  locFailed flag s
a990: 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  et..*/.#ifndef S
a9a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73  QLITE_OMIT_CTE.s
a9b0: 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74 68  tatic With *with
a9c0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
a9d0: 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74   With *p){.  Wit
a9e0: 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  h *pRet = 0;.  i
a9f0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
aa00: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
aa10: 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61  p) + sizeof(p->a
aa20: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d  [0]) * (p->nCte-
aa30: 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73  1);.    pRet = s
aa40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
aa50: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
aa60: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
aa70: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
aa80: 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70    pRet->nCte = p
aa90: 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f  ->nCte;.      fo
aaa0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
aab0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
aac0: 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pRet->a[i].pSele
aad0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
aae0: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  ctDup(db, p->a[i
aaf0: 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ].pSelect, 0);. 
ab00: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
ab10: 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65  ].pCols = sqlite
ab20: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
ab30: 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20   p->a[i].pCols, 
ab40: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  0);.        pRet
ab50: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
ab60: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ab70: 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  b, p->a[i].zName
ab80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ab90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
aba0: 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  et;.}.#else.# de
abb0: 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79  fine withDup(x,y
abc0: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
abd0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
abe0: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
abf0: 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69  s make deep copi
ac00: 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  es of expression
ac10: 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  s,.** expression
ac20: 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73   lists, ID lists
ac30: 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61  , and select sta
ac40: 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f  tements.  The co
ac50: 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64  pies can.** be d
ac60: 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67  eleted (by being
ac70: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72   passed to their
ac80: 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44   respective ...D
ac90: 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73  elete() routines
aca0: 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66  ).** without eff
acb0: 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  ecting the origi
acc0: 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nals..**.** The 
acd0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
ace0: 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20   ID, and source 
acf0: 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20  lists return by 
ad00: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
ad10: 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  up(),.** sqlite3
ad20: 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64  IdListDup(), and
ad30: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
ad40: 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20  up() can not be 
ad50: 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64  further expanded
ad60: 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65   .** by subseque
ad70: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
ad80: 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20  te*ListAppend() 
ad90: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20  routines..**.** 
ada0: 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20  Any tables that 
adb0: 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68  the SrcList migh
adc0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e  t point to are n
add0: 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a  ot duplicated..*
ade0: 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
adf0: 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e  arameter contain
ae00: 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  s a combination 
ae10: 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 58  of the EXPRDUP_X
ae20: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20  XX flags..** If 
ae30: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
ae40: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
ae50: 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75  then the structu
ae60: 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  re returned is a
ae70: 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65  .** truncated ve
ae80: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75  rsion of the usu
ae90: 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75 72  al Expr structur
aea0: 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73  e that will be s
aeb0: 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74  tored as.** part
aec0: 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
aed0: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
aee0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
aef0: 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72   schema..*/.Expr
af00: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70   *sqlite3ExprDup
af10: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
af20: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
af30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  ){.  assert( fla
af40: 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
af50: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
af60: 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20 65  ;.  return p ? e
af70: 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c  xprDup(db, p, fl
af80: 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a 45  ags, 0) : 0;.}.E
af90: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
afa0: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
afb0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
afc0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
afd0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
afe0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
aff0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
b000: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
b010: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70  int i;.  Expr *p
b020: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d  PriorSelectCol =
b030: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   0;.  assert( db
b040: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
b050: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b060: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
b070: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
b080: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
b090: 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20 20 69  ize(db, p));.  i
b0a0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
b0b0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
b0c0: 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72 3b  Expr = p->nExpr;
b0d0: 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e 65 77 2d  .  pItem = pNew-
b0e0: 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d  >a;.  pOldItem =
b0f0: 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30   p->a;.  for(i=0
b100: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
b110: 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64  +, pItem++, pOld
b120: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
b130: 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f  r *pOldExpr = pO
b140: 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  ldItem->pExpr;. 
b150: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
b160: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  r;.    pItem->pE
b170: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
b180: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70  rDup(db, pOldExp
b190: 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  r, flags);.    i
b1a0: 66 28 20 70 4f 6c 64 45 78 70 72 20 0a 20 20 20  f( pOldExpr .   
b1b0: 20 20 26 26 20 70 4f 6c 64 45 78 70 72 2d 3e 6f    && pOldExpr->o
b1c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
b1d0: 55 4d 4e 0a 20 20 20 20 20 26 26 20 28 70 4e 65  UMN.     && (pNe
b1e0: 77 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  wExpr = pItem->p
b1f0: 45 78 70 72 29 21 3d 30 20 0a 20 20 20 20 29 7b  Expr)!=0 .    ){
b200: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b210: 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  NewExpr->iColumn
b220: 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a 20 20  ==0 || i>0 );.  
b230: 20 20 20 20 69 66 28 20 70 4e 65 77 45 78 70 72      if( pNewExpr
b240: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ->iColumn==0 ){.
b250: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b260: 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66 74 3d  pOldExpr->pLeft=
b270: 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69 67 68  =pOldExpr->pRigh
b280: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72  t );.        pPr
b290: 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d 20 70  iorSelectCol = p
b2a0: 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  NewExpr->pLeft =
b2b0: 20 70 4e 65 77 45 78 70 72 2d 3e 70 52 69 67 68   pNewExpr->pRigh
b2c0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
b2d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b2e0: 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  i>0 );.        a
b2f0: 73 73 65 72 74 28 20 70 49 74 65 6d 5b 2d 31 5d  ssert( pItem[-1]
b300: 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  .pExpr!=0 );.   
b310: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
b320: 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  wExpr->iColumn==
b330: 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d  pItem[-1].pExpr-
b340: 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20  >iColumn+1 );.  
b350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
b360: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d 70  riorSelectCol==p
b370: 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e  Item[-1].pExpr->
b380: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20  pLeft );.       
b390: 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74   pNewExpr->pLeft
b3a0: 20 3d 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43   = pPriorSelectC
b3b0: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
b3c0: 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  }.    pItem->zNa
b3d0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
b3e0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b3f0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
b400: 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71  Item->zSpan = sq
b410: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b420: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61  , pOldItem->zSpa
b430: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73  n);.    pItem->s
b440: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49  ortOrder = pOldI
b450: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
b460: 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20      pItem->done 
b470: 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  = 0;.    pItem->
b480: 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c  bSpanIsTab = pOl
b490: 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  dItem->bSpanIsTa
b4a0: 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20  b;.    pItem->u 
b4b0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20  = pOldItem->u;. 
b4c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
b4d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75  ;.}../*.** If cu
b4e0: 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c  rsors, triggers,
b4f0: 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75   views and subqu
b500: 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d  eries are all om
b510: 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  itted from.** th
b520: 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f  e build, then no
b530: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
b540: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78  ing routines, ex
b550: 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c  cept for .** sql
b560: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c  ite3SelectDup(),
b570: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
b580: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
b590: 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a  () is sometimes.
b5a0: 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  ** called with a
b5b0: 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a   NULL argument..
b5c0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
b5d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
b5e0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
b5f0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
b600: 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65  R) \. || !define
b610: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
b620: 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20  BQUERY).SrcList 
b630: 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  *sqlite3SrcListD
b640: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
b650: 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  SrcList *p, int 
b660: 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73  flags){.  SrcLis
b670: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
b680: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
b690: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
b6a0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
b6b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
b6c0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
b6d0: 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a  (p->nSrc>0 ? siz
b6e0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
b6f0: 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b  p->nSrc-1) : 0);
b700: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
b710: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
b720: 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
b730: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
b740: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  rn 0;.  pNew->nS
b750: 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  rc = pNew->nAllo
b760: 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66  c = p->nSrc;.  f
b770: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72  or(i=0; i<p->nSr
b780: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
b790: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
b7a0: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
b7b0: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
b7c0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
b7d0: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
b7e0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c  ->a[i];.    Tabl
b7f0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65  e *pTab;.    pNe
b800: 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d  wItem->pSchema =
b810: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65   pOldItem->pSche
b820: 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ma;.    pNewItem
b830: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
b840: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b850: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  , pOldItem->zDat
b860: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
b870: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
b880: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b890: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
b8a0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
b8b0: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
b8c0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
b8d0: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
b8e0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
b8f0: 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66  fg = pOldItem->f
b900: 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  g;.    pNewItem-
b910: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
b920: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
b930: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72    pNewItem->addr
b940: 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74  FillSub = pOldIt
b950: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b  em->addrFillSub;
b960: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72  .    pNewItem->r
b970: 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49  egReturn = pOldI
b980: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
b990: 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d      if( pNewItem
b9a0: 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
b9b0: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74   ){.      pNewIt
b9c0: 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
b9d0: 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  y = sqlite3DbStr
b9e0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b9f0: 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29  ->u1.zIndexedBy)
ba00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
ba10: 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d  Item->pIBIndex =
ba20: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e   pOldItem->pIBIn
ba30: 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  dex;.    if( pNe
ba40: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  wItem->fg.isTabF
ba50: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  unc ){.      pNe
ba60: 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  wItem->u1.pFuncA
ba70: 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  rg = .          
ba80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
ba90: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
baa0: 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c  >u1.pFuncArg, fl
bab0: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
bac0: 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d  pTab = pNewItem-
bad0: 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  >pTab = pOldItem
bae0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
baf0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54  pTab ){.      pT
bb00: 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
bb10: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65     }.    pNewIte
bb20: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
bb30: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
bb40: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c  , pOldItem->pSel
bb50: 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ect, flags);.   
bb60: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d   pNewItem->pOn =
bb70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
bb80: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f  db, pOldItem->pO
bb90: 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  n, flags);.    p
bba0: 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20  NewItem->pUsing 
bbb0: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
bbc0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
bbd0: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
bbe0: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
bbf0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
bc00: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
bc10: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
bc20: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
bc30: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
bc40: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
bc50: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
bc60: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64  t i;.  assert( d
bc70: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
bc80: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
bc90: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
bca0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
bcb0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
bcc0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
bcd0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
bce0: 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64  ew->nId = p->nId
bcf0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
bd00: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
bd10: 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69  NN(db, p->nId*si
bd20: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
bd30: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
bd40: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
bd50: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65  DbFreeNN(db, pNe
bd60: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
bd70: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
bd80: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
bd90: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
bda0: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
bdb0: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
bdc0: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
bdd0: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
bde0: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
bdf0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
be00: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
be10: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
be20: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
be30: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
be40: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
be50: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
be60: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
be70: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
be80: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
be90: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
bea0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
beb0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
bec0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
bed0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bee0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
bef0: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
bf00: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
bf10: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
bf20: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
bf30: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
bf40: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
bf50: 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  pDup, int flags)
bf60: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65 74  {.  Select *pRet
bf70: 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a   = 0;.  Select *
bf80: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c  pNext = 0;.  Sel
bf90: 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65 74  ect **pp = &pRet
bfa0: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a  ;.  Select *p;..
bfb0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
bfc0: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70 3b  );.  for(p=pDup;
bfd0: 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29   p; p=p->pPrior)
bfe0: 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e  {.    Select *pN
bff0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
c000: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c010: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20  zeof(*p) );.    
c020: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62 72  if( pNew==0 ) br
c030: 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  eak;.    pNew->p
c040: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
c050: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
c060: 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29  ->pEList, flags)
c070: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63  ;.    pNew->pSrc
c080: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
c090: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
c0a0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c0b0: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
c0c0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
c0d0: 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73  p->pWhere, flags
c0e0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72  );.    pNew->pGr
c0f0: 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
c100: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
c110: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67  ->pGroupBy, flag
c120: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48  s);.    pNew->pH
c130: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
c140: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
c150: 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20  aving, flags);. 
c160: 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42     pNew->pOrderB
c170: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
c180: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
c190: 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a  rderBy, flags);.
c1a0: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70      pNew->op = p
c1b0: 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ->op;.    pNew->
c1c0: 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pNext = pNext;. 
c1d0: 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
c1e0: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  = 0;.    pNew->p
c1f0: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
c200: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
c210: 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  imit, flags);.  
c220: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
c230: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f   0;.    pNew->iO
c240: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
c250: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
c260: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53  p->selFlags & ~S
c270: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
c280: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  .    pNew->addrO
c290: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
c2a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  .    pNew->addrO
c2b0: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b  penEphm[1] = -1;
c2c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65  .    pNew->nSele
c2d0: 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65  ctRow = p->nSele
c2e0: 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d  ctRow;.    pNew-
c2f0: 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70  >pWith = withDup
c300: 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a  (db, p->pWith);.
c310: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c320: 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70  tSetName(pNew, p
c330: 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20  ->zSelName);.   
c340: 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20   *pp = pNew;.   
c350: 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50 72   pp = &pNew->pPr
c360: 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d  ior;.    pNext =
c370: 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65   pNew;.  }..  re
c380: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
c390: 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  se.Select *sqlit
c3a0: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
c3b0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
c3c0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
c3d0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
c3e0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
c3f0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
c400: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
c410: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
c420: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
c430: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
c440: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
c450: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
c460: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
c470: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
c480: 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20 6d  pList argument m
c490: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 55  ust be either NU
c4a0: 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  LL or a pointer 
c4b0: 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a 2a  to an ExprList.*
c4c0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
c4d0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
c4e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
c4f0: 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20 72  ppend().  This r
c500: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e 6f  outine.** may no
c510: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
c520: 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61 69  n ExprList obtai
c530: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
c540: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a  ExprListDup()..*
c550: 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73 20  * Reason:  This 
c560: 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20  routine assumes 
c570: 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
c580: 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69 73  of slots in pLis
c590: 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20 70  t->a[].** is a p
c5a0: 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54 68  ower of two.  Th
c5b0: 61 74 20 69 73 20 74 72 75 65 20 66 6f 72 20 73  at is true for s
c5c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
c5d0: 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a 2a  pend() returns.*
c5e0: 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65 63  * but is not nec
c5f0: 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 66 72  essarily true fr
c600: 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  om the return va
c610: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45 78  lue of sqlite3Ex
c620: 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a 0a  prListDup()..**.
c630: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
c640: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
c650: 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69  occurs, the enti
c660: 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64  re list is freed
c670: 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20   and.** NULL is 
c680: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f  returned.  If no
c690: 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  n-NULL is return
c6a0: 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  ed, then it is g
c6b0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61  uaranteed.** tha
c6c0: 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  t the new entry 
c6d0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
c6e0: 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78   appended..*/.Ex
c6f0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
c700: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
c710: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c720: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
c730: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c740: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
c750: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
c760: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
c770: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
c780: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
c790: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
c7a0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
c7b0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
c7c0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
c7d0: 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
c7e0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
c7f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c800: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
c810: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
c820: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
c830: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
c840: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c850: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  NN(db, sizeof(Ex
c860: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
c870: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
c880: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
c890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
c8a0: 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20  t->nExpr = 0;.  
c8b0: 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74  }else if( (pList
c8c0: 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74  ->nExpr & (pList
c8d0: 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29  ->nExpr-1))==0 )
c8e0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
c8f0: 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d  pNew;.    pNew =
c900: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
c910: 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20 20  c(db, pList, .  
c920: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
c930: 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c 69  f(*pList)+(2*pLi
c940: 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a 73  st->nExpr - 1)*s
c950: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
c960: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ]));.    if( pNe
c970: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  w==0 ){.      go
c980: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
c990: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
c9a0: 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  w;.  }.  pItem =
c9b0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
c9c0: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61 73  ->nExpr++];.  as
c9d0: 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73  sert( offsetof(s
c9e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c9f0: 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65  tem,zName)==size
ca00: 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  of(pItem->pExpr)
ca10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
ca20: 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78  fsetof(struct Ex
ca30: 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78 70  prList_item,pExp
ca40: 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  r)==0 );.  memse
ca50: 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  t(&pItem->zName,
ca60: 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  0,sizeof(*pItem)
ca70: 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74  -offsetof(struct
ca80: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a   ExprList_item,z
ca90: 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d 2d  Name));.  pItem-
caa0: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
cab0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
cac0: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
cad0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
cae0: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
caf0: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
cb00: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
cb10: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
cb20: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
cb30: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
cb40: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  st);.  return 0;
cb50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d  .}../*.** pColum
cb60: 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72  ns and pExpr for
cb70: 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69 67  m a vector assig
cb80: 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 70  nment which is p
cb90: 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a  art of the SET.*
cba0: 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55  * clause of an U
cbb0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
cbc0: 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
cbd0: 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63  **        (a,b,c
cbe0: 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32  ) = (expr1,expr2
cbf0: 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20  ,expr3).** Or:  
cc00: 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c    (a,b,c) = (SEL
cc10: 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e  ECT x,y,z FROM .
cc20: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ...).**.** For e
cc30: 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ach term of the 
cc40: 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e  vector assignmen
cc50: 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e  t, append new en
cc60: 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  tries to the.** 
cc70: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
cc80: 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63  pList.  In the c
cc90: 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65 72  ase of a subquer
cca0: 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70  y on the RHS, ap
ccb0: 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43  pend.** TK_SELEC
ccc0: 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73  T_COLUMN express
ccd0: 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  ions..*/.ExprLis
cce0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
ccf0: 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a  stAppendVector(.
cd00: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
cd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
cd20: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
cd30: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
cd40: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
cd50: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
cd60: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
cd70: 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  L */.  IdList *p
cd80: 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a  Columns,      /*
cd90: 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f   List of names o
cda0: 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73  f LHS of the ass
cdb0: 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  ignment */.  Exp
cdc0: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
cdd0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78      /* Vector ex
cde0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
cdf0: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
ce00: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
ce10: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
ce20: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
ce30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
ce40: 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20   iFirst = pList 
ce50: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
ce60: 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e   0;.  /* pColumn
ce70: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55  s can only be NU
ce80: 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d  LL due to an OOM
ce90: 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c   but an OOM will
cea0: 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65   cause an.  ** e
ceb0: 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69  xit prior to thi
cec0: 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20  s routine being 
ced0: 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28  invoked */.  if(
cee0: 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d   NEVER(pColumns=
cef0: 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f  =0) ) goto vecto
cf00: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a  r_append_error;.
cf10: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
cf20: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
cf30: 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a  end_error;..  /*
cf40: 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61   If the RHS is a
cf50: 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65   vector, then we
cf60: 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79   can immediately
cf70: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
cf80: 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a  at .  ** the siz
cf90: 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64  e of the RHS and
cfa0: 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74   LHS match.  But
cfb0: 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 61   if the RHS is a
cfc0: 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77   SELECT, .  ** w
cfd0: 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20 69  ildcards ("*") i
cfe0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
cff0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d   of the SELECT m
d000: 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
d010: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63  before.  ** we c
d020: 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63  an do the size c
d030: 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74  heck, so defer t
d040: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e  he size check un
d050: 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
d060: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
d070: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45  pExpr->op!=TK_SE
d080: 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73  LECT && pColumns
d090: 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65  ->nId!=(n=sqlite
d0a0: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
d0b0: 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73  pExpr)) ){.    s
d0c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d0d0: 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d  Parse, "%d colum
d0e0: 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76  ns assigned %d v
d0f0: 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20  alues",.        
d100: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
d110: 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20  umns->nId, n);. 
d120: 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61     goto vector_a
d130: 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d  ppend_error;.  }
d140: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
d150: 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b  Columns->nId; i+
d160: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53  +){.    Expr *pS
d170: 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ubExpr = sqlite3
d180: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
d190: 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ld(pParse, pExpr
d1a0: 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  , i);.    pList 
d1b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
d1c0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
d1d0: 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72 29  pList, pSubExpr)
d1e0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
d1f0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d200: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69   pList->nExpr==i
d210: 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20  First+i+1 );.   
d220: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73     pList->a[pLis
d230: 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  t->nExpr-1].zNam
d240: 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b  e = pColumns->a[
d250: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
d260: 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a  pColumns->a[i].z
d270: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Name = 0;.    }.
d280: 20 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e    }..  if( !db->
d290: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
d2a0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
d2b0: 4c 45 43 54 20 26 26 20 41 4c 57 41 59 53 28 70  LECT && ALWAYS(p
d2c0: 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
d2d0: 45 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20 70  Expr *pFirst = p
d2e0: 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e  List->a[iFirst].
d2f0: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
d300: 74 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b 0a  t( pFirst!=0 );.
d310: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 72      assert( pFir
d320: 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  st->op==TK_SELEC
d330: 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  T_COLUMN );.    
d340: 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74   .    /* Store t
d350: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
d360: 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f  ent in pRight so
d370: 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65   it will be dele
d380: 74 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  ted when.    ** 
d390: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
d3a0: 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65  elete() is calle
d3b0: 64 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d  d */.    pFirst-
d3c0: 3e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b  >pRight = pExpr;
d3d0: 0a 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a  .    pExpr = 0;.
d3e0: 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72  .    /* Remember
d3f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d400: 20 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20 73   LHS in iTable s
d410: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 68  o that we can ch
d420: 65 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  eck that.    ** 
d430: 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20  the RHS and LHS 
d440: 73 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72 69  sizes match duri
d450: 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ng code generati
d460: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72 73  on. */.    pFirs
d470: 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c  t->iTable = pCol
d480: 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a  umns->nId;.  }..
d490: 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72  vector_append_er
d4a0: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ror:.  sqlite3Ex
d4b0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
d4c0: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  pr);.  sqlite3Id
d4d0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
d4e0: 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75  Columns);.  retu
d4f0: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
d500: 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74 20  ** Set the sort 
d510: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61  order for the la
d520: 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68  st element on th
d530: 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74  e given ExprList
d540: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d550: 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74  3ExprListSetSort
d560: 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a  Order(ExprList *
d570: 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65  p, int iSortOrde
d580: 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  r){.  if( p==0 )
d590: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
d5a0: 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44  t( SQLITE_SO_UND
d5b0: 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49  EFINED<0 && SQLI
d5c0: 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20  TE_SO_ASC>=0 && 
d5d0: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30  SQLITE_SO_DESC>0
d5e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
d5f0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66  >nExpr>0 );.  if
d600: 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29  ( iSortOrder<0 )
d610: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
d620: 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73  >a[p->nExpr-1].s
d630: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
d640: 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72  _SO_ASC );.    r
d650: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e  eturn;.  }.  p->
d660: 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f  a[p->nExpr-1].so
d670: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53  rtOrder = (u8)iS
d680: 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a  ortOrder;.}../*.
d690: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c  ** Set the ExprL
d6a0: 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c  ist.a[].zName el
d6b0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73  ement of the mos
d6c0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
d6d0: 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20   item.** on the 
d6e0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
d6f0: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67  .**.** pList mig
d700: 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f  ht be NULL follo
d710: 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  wing an OOM erro
d720: 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68  r.  But pName sh
d730: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a  ould never be.**
d740: 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d   NULL.  If a mem
d750: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
d760: 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65  ails, the pParse
d770: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
d780: 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65  ed flag.** is se
d790: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d7a0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
d7b0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
d7c0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
d7d0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d7e0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d7f0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
d800: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
d810: 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a   add the span. *
d820: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
d830: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
d840: 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20  ame to be added 
d850: 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65  */.  int dequote
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d870: 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68  True to cause th
d880: 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71  e name to be deq
d890: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  uoted */.){.  as
d8a0: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
d8b0: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
d8c0: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
d8d0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
d8e0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
d8f0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
d900: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
d910: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
d920: 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73     pItem = &pLis
d930: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
d940: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
d950: 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
d960: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  0 );.    pItem->
d970: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
d980: 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d  bStrNDup(pParse-
d990: 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  >db, pName->z, p
d9a0: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66  Name->n);.    if
d9b0: 28 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69  ( dequote ) sqli
d9c0: 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d  te3Dequote(pItem
d9d0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a  ->zName);.  }.}.
d9e0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
d9f0: 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61  xprList.a[].zSpa
da00: 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  n element of the
da10: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
da20: 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20  dded item.** on 
da30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
da40: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ist..**.** pList
da50: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66   might be NULL f
da60: 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20  ollowing an OOM 
da70: 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61  error.  But pSpa
da80: 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  n should never b
da90: 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61  e.** NULL.  If a
daa0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
dab0: 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50  on fails, the pP
dac0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
dad0: 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69  Failed flag.** i
dae0: 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s set..*/.void s
daf0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
db00: 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a  tSpan(.  Parse *
db10: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
db20: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
db30: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
db40: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
db50: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
db60: 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61  h to add the spa
db70: 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e  n. */.  ExprSpan
db80: 20 2a 70 53 70 61 6e 20 20 20 20 20 20 20 20 20   *pSpan         
db90: 2f 2a 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62  /* The span to b
dba0: 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20  e added */.){.  
dbb0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
dbc0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
dbd0: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
dbe0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
dbf0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
dc00: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
dc10: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
dc20: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
dc30: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
dc40: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
dc50: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
dc60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
dc70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
dc80: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70   pItem->pExpr==p
dc90: 53 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Span->pExpr );. 
dca0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
dcb0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
dcc0: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  n);.    pItem->z
dcd0: 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
dce0: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
dcf0: 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74  r*)pSpan->zStart
dd00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61        (int)(pSpa
dd30: 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d  n->zEnd - pSpan-
dd40: 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d  >zStart));.  }.}
dd50: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
dd60: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
dd70: 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d  EList contains m
dd80: 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20  ore than iLimit 
dd90: 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61  elements,.** lea
dda0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
ddb0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
ddc0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
ddd0: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
dde0: 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  h(.  Parse *pPar
ddf0: 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
de00: 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20  pEList,.  const 
de10: 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b  char *zObject.){
de20: 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72  .  int mx = pPar
de30: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
de40: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
de50: 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  MN];.  testcase(
de60: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
de70: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a  t->nExpr==mx );.
de80: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
de90: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
dea0: 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69  xpr==mx+1 );.  i
deb0: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
dec0: 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b  ist->nExpr>mx ){
ded0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
dee0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
def0: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
df00: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
df10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
df20: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65  lete an entire e
df30: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
df40: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
df50: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65  _NOINLINE void e
df60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
df70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
df80: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
df90: 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e   int i = pList->
dfa0: 6e 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20  nExpr;.  struct 
dfb0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
dfc0: 49 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61  Item =  pList->a
dfd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
dfe0: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
dff0: 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  do{.    sqlite3E
e000: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
e010: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
e020: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e030: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
e040: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e050: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e060: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
e070: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d  ++;.  }while( --
e080: 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  i>0 );.  sqlite3
e090: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
e0a0: 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  st);.}.void sqli
e0b0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
e0c0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
e0d0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
e0e0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 65  .  if( pList ) e
e0f0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28  xprListDeleteNN(
e100: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
e110: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
e120: 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c  bitwise-OR of al
e130: 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65  l Expr.flags fie
e140: 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e  lds in the given
e150: 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f  .** ExprList..*/
e160: 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70 72  .u32 sqlite3Expr
e170: 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20  ListFlags(const 
e180: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
e190: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32  {.  int i;.  u32
e1a0: 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74   m = 0;.  assert
e1b0: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
e1c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
e1d0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
e1e0: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
e1f0: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
e200: 78 70 72 3b 0a 20 20 20 20 20 61 73 73 65 72 74  xpr;.     assert
e210: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
e220: 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66     m |= pExpr->f
e230: 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75  lags;.  }.  retu
e240: 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn m;.}../*.** T
e250: 68 69 73 20 69 73 20 61 20 53 45 4c 45 43 54 2d  his is a SELECT-
e260: 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f  node callback fo
e270: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
e280: 20 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a 20   walker that.** 
e290: 61 6c 77 61 79 73 20 22 66 61 69 6c 73 22 2e 20  always "fails". 
e2a0: 20 42 79 20 22 66 61 69 6c 22 20 69 6e 20 74 68   By "fail" in th
e2b0: 69 73 20 63 61 73 65 2c 20 77 65 20 6d 65 61 6e  is case, we mean
e2c0: 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d   set.** pWalker-
e2d0: 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20 61  >eCode to zero a
e2e0: 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20  nd abort..**.** 
e2f0: 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73  This callback is
e300: 20 75 73 65 64 20 62 79 20 6d 75 6c 74 69 70 6c   used by multipl
e310: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61 6c  e expression wal
e320: 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  kers..*/.int sql
e330: 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61  ite3SelectWalkFa
e340: 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  il(Walker *pWalk
e350: 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  er, Select *NotU
e360: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
e370: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
e380: 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  );.  pWalker->eC
e390: 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ode = 0;.  retur
e3a0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 0a  n WRC_Abort;.}..
e3b0: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  /*.** These rout
e3c0: 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20  ines are Walker 
e3d0: 63 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74  callbacks used t
e3e0: 6f 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69  o check expressi
e3f0: 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66  ons to.** see if
e400: 20 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74   they are "const
e410: 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65  ant" for some de
e420: 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73  finition of cons
e430: 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61  tant.  The.** Wa
e440: 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65  lker.eCode value
e450: 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20   determines the 
e460: 74 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e  type of "constan
e470: 74 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  t" we are lookin
e480: 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20  g.** for..**.** 
e490: 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72  These callback r
e4a0: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
e4b0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
e4c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
e4d0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
e4e0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20  prIsConstant()  
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
e510: 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  1.**     sqlite3
e520: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
e530: 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20  tJoin()         
e540: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
e550: 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ==2.**     sqlit
e560: 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
e570: 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20  stant()         
e580: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
e590: 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c  de==3.**     sql
e5a0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
e5b0: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20  ntOrFunction()  
e5c0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
e5d0: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a  Code==4 or 5.**.
e5e0: 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  ** In all cases,
e5f0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73   the callbacks s
e600: 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d  et Walker.eCode=
e610: 30 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74  0 and abort if t
e620: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
e630: 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74   is found to not
e640: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a   be a constant..
e650: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
e660: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
e670: 72 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75  rFunction() is u
e680: 73 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69  sed for evaluati
e690: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  ng expressions.*
e6a0: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
e6b0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
e6c0: 54 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  The Walker.eCode
e6d0: 20 76 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e   value is 5 when
e6e0: 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65   parsing.** an e
e6f0: 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61  xisting schema a
e700: 6e 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73  nd 4 when proces
e710: 73 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65  sing a new state
e720: 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a  ment.  A bound.*
e730: 2a 20 70 61 72 61 6d 65 74 65 72 20 72 61 69 73  * parameter rais
e740: 65 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20  es an error for 
e750: 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20  new statements, 
e760: 62 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20  but is silently 
e770: 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20  converted.** to 
e780: 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e  NULL for existin
e790: 67 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73  g schemas.  This
e7a0: 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d   allows sqlite_m
e7b0: 61 73 74 65 72 20 74 61 62 6c 65 73 20 74 68 61  aster tables tha
e7c0: 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20  t .** contain a 
e7d0: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
e7e0: 62 65 63 61 75 73 65 20 74 68 65 79 20 77 65 72  because they wer
e7f0: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f  e generated by o
e800: 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  lder versions.**
e810: 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65   of SQLite to be
e820: 20 70 61 72 73 65 64 20 62 79 20 6e 65 77 65 72   parsed by newer
e830: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
e840: 69 74 65 20 77 69 74 68 6f 75 74 20 72 61 69 73  ite without rais
e850: 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d  ing a.** malform
e860: 65 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e  ed schema error.
e870: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
e880: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
e890: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
e8a0: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
e8b0: 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65  ..  /* If pWalke
e8c0: 72 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68  r->eCode is 2 th
e8d0: 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74  en any term of t
e8e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
e8f0: 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20  at comes from.  
e900: 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  ** the ON or USI
e910: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
e920: 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61  left join disqua
e930: 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65  lifies the expre
e940: 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20  ssion.  ** from 
e950: 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64  being considered
e960: 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20   constant. */.  
e970: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
e980: 64 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73  de==2 && ExprHas
e990: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
e9a0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
e9b0: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
e9c0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  de = 0;.    retu
e9d0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
e9e0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
e9f0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  pr->op ){.    /*
ea00: 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69   Consider functi
ea10: 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61  ons to be consta
ea20: 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20  nt if all their 
ea30: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f  arguments are co
ea40: 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e  nstant.    ** an
ea50: 64 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72  d either pWalker
ea60: 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20  ->eCode==4 or 5 
ea70: 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  or the function 
ea80: 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53  has the.    ** S
ea90: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
eaa0: 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61   flag. */.    ca
eab0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
eac0: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
ead0: 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45  r->eCode>=4 || E
eae0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
eaf0: 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e  Expr,EP_ConstFun
eb00: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  c) ){.        re
eb10: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
eb20: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
eb30: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
eb40: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
eb50: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
eb60: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
eb70: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
eb80: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
eb90: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
eba0: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
ebb0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
ebc0: 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  MN:.      testca
ebd0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
ebe0: 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65  K_ID );.      te
ebf0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
ec00: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
ec10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ec20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
ec30: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
ec40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
ec50: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
ec60: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
ec70: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
ec80: 64 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e  de==3 && pExpr->
ec90: 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d  iTable==pWalker-
eca0: 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20  >u.iCur ){.     
ecb0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
ecc0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
ecd0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
ece0: 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
ecf0: 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  e TK_IF_NULL_ROW
ed00: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
ed10: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
ed20: 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29 3b 0a 20  IF_NULL_ROW );. 
ed30: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
ed40: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ode = 0;.      r
ed50: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
ed60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
ed70: 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28  IABLE:.      if(
ed80: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
ed90: 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =5 ){.        /*
eda0: 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72   Silently conver
edb0: 74 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  t bound paramete
edc0: 72 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  rs that appear i
edd0: 6e 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a  nside of CREATE.
ede0: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65          ** state
edf0: 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c  ments into a NUL
ee00: 4c 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74  L when parsing t
ee10: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
ee20: 65 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20  ent text out.   
ee30: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73       ** of the s
ee40: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
ee50: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45  le */.        pE
ee60: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
ee70: 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
ee80: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
ee90: 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  e==4 ){.        
eea0: 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d  /* A bound param
eeb0: 65 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45  eter in a CREATE
eec0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
eed0: 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a  originates from.
eee0: 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
eef0: 65 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75  e3_prepare() cau
ef00: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ses an error */.
ef10: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
ef20: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
ef30: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
ef40: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
ef50: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
ef60: 75 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75  ugh */.    defau
ef70: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
ef80: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
ef90: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
efa0: 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
efb0: 46 61 69 6c 20 77 69 6c 6c 20 64 69 73 61 6c 6c  Fail will disall
efc0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ow */.      test
efd0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
efe0: 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a  =TK_EXISTS ); /*
eff0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
f000: 6c 6b 46 61 69 6c 20 77 69 6c 6c 20 64 69 73 61  lkFail will disa
f010: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65  llow */.      re
f020: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
f030: 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  e;.  }.}.static 
f040: 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28  int exprIsConst(
f050: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69  Expr *p, int ini
f060: 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29  tFlag, int iCur)
f070: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
f080: 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c  w.eCode = initFl
f090: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
f0a0: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
f0b0: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
f0c0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
f0d0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  = sqlite3SelectW
f0e0: 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20  alkFail;.#ifdef 
f0f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77  SQLITE_DEBUG.  w
f100: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
f110: 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  2 = sqlite3Selec
f120: 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65  tWalkAssert2;.#e
f130: 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43 75 72 20  ndif.  w.u.iCur 
f140: 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65  = iCur;.  sqlite
f150: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
f160: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
f170: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  de;.}../*.** Wal
f180: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
f190: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
f1a0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
f1b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
f1c0: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
f1d0: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
f1e0: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
f1f0: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
f200: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
f210: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
f220: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
f230: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
f240: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
f250: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
f260: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
f270: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
f280: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
f290: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
f2a0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
f2b0: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
f2c0: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
f2d0: 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b  sConst(p, 1, 0);
f2e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
f2f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
f300: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
f310: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
f320: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
f330: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
f340: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
f350: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
f360: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
f370: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
f380: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
f390: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
f3a0: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
f3b0: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
f3c0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
f3d0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
f3e0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
f3f0: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
f400: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
f410: 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a  Const(p, 2, 0);.
f420: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
f430: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
f440: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
f450: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
f460: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
f470: 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67  .** for any sing
f480: 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61  le row of the ta
f490: 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
f4a0: 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20  iCur.  In other 
f4b0: 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78  words, the.** ex
f4c0: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f  pression must no
f4d0: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e  t refer to any n
f4e0: 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
f4f0: 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e   function nor an
f500: 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72  y.** table other
f510: 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69   than iCur..*/.i
f520: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
f530: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78  TableConstant(Ex
f540: 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29  pr *p, int iCur)
f550: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
f560: 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75  sConst(p, 3, iCu
f570: 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71  r);.}.../*.** sq
f580: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20  lite3WalkExpr() 
f590: 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  callback used by
f5a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
f5b0: 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28  nstantOrGroupBy(
f5c0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
f5d0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
f5e0: 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 57 61 6c  antOrGroupBy(Wal
f5f0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
f600: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78  pr *pExpr){.  Ex
f610: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
f620: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 47   = pWalker->u.pG
f630: 72 6f 75 70 42 79 3b 0a 20 20 69 6e 74 20 69 3b  roupBy;.  int i;
f640: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
f650: 70 45 78 70 72 20 69 73 20 69 64 65 6e 74 69 63  pExpr is identic
f660: 61 6c 20 74 6f 20 61 6e 79 20 47 52 4f 55 50 20  al to any GROUP 
f670: 42 59 20 74 65 72 6d 2e 20 49 66 20 73 6f 2c 20  BY term. If so, 
f680: 63 6f 6e 73 69 64 65 72 0a 20 20 2a 2a 20 69 74  consider.  ** it
f690: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a 20   constant.  */. 
f6a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
f6b0: 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
f6c0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
f6d0: 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e   pGroupBy->a[i].
f6e0: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
f6f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
f700: 65 28 30 2c 20 70 45 78 70 72 2c 20 70 2c 20 2d  e(0, pExpr, p, -
f710: 31 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 43 6f  1)<2 ){.      Co
f720: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
f730: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
f740: 53 65 71 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61  Seq(pWalker->pPa
f750: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69  rse, p);.      i
f760: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
f770: 6d 70 28 22 42 49 4e 41 52 59 22 2c 20 70 43 6f  mp("BINARY", pCo
f780: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ll->zName)==0 ){
f790: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f7a0: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
f7b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
f7c0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78 70  /* Check if pExp
f7d0: 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  r is a sub-selec
f7e0: 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64  t. If so, consid
f7f0: 65 72 20 69 74 20 76 61 72 69 61 62 6c 65 2e 20  er it variable. 
f800: 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  */.  if( ExprHas
f810: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f820: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
f830: 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
f840: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ode = 0;.    ret
f850: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
f860: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 65 78 70   }..  return exp
f870: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
f880: 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b  pWalker, pExpr);
f890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74  .}../*.** Walk t
f8a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
f8b0: 65 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ee passed as the
f8c0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
f8d0: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
f8e0: 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65  .** if the expre
f8f0: 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20 65  ssion consists e
f900: 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74  ntirely of const
f910: 61 6e 74 73 20 6f 72 20 63 6f 70 69 65 73 20 6f  ants or copies o
f920: 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20 70  f terms .** in p
f930: 47 72 6f 75 70 42 79 20 74 68 61 74 20 73 6f 72  GroupBy that sor
f940: 74 20 77 69 74 68 20 74 68 65 20 42 49 4e 41 52  t with the BINAR
f950: 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  Y collation sequ
f960: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ence..**.** This
f970: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
f980: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
f990: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48   a term of the H
f9a0: 41 56 49 4e 47 20 63 6c 61 75 73 65 20 63 61 6e  AVING clause can
f9b0: 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64 20  .** be promoted 
f9c0: 69 6e 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  into the WHERE c
f9d0: 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64 65 72  lause.  In order
f9e0: 20 66 6f 72 20 73 75 63 68 20 61 20 70 72 6f 6d   for such a prom
f9f0: 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a 2a  otion to work,.*
fa00: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
fa10: 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
fa20: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 68   term must be th
fa30: 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20 6d  e same for all m
fa40: 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20 22  embers of.** a "
fa50: 67 72 6f 75 70 22 2e 20 20 54 68 65 20 72 65 71  group".  The req
fa60: 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68  uirement that th
fa70: 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20  e GROUP BY term 
fa80: 6d 75 73 74 20 62 65 20 42 49 4e 41 52 59 0a 2a  must be BINARY.*
fa90: 2a 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 6e  * assumes that n
faa0: 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e  o other collatin
fab0: 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  g sequence will 
fac0: 68 61 76 65 20 61 20 66 69 6e 65 72 2d 67 72 61  have a finer-gra
fad0: 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e 67  ined.** grouping
fae0: 20 74 68 61 6e 20 62 69 6e 61 72 79 2e 20 20 49   than binary.  I
faf0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 28 41  n other words (A
fb00: 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72  =B COLLATE binar
fb10: 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41 3d  y) implies.** A=
fb20: 42 20 69 6e 20 65 76 65 72 79 20 6f 74 68 65 72  B in every other
fb30: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
fb40: 6e 63 65 2e 20 20 54 68 65 20 72 65 71 75 69 72  nce.  The requir
fb50: 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 0a 2a  ement that the.*
fb60: 2a 20 47 52 4f 55 50 20 42 59 20 62 65 20 42 49  * GROUP BY be BI
fb70: 4e 41 52 59 20 69 73 20 73 74 72 69 63 74 65 72  NARY is stricter
fb80: 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e   than necessary.
fb90: 20 20 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f 20    It would also 
fba0: 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d 6f  work.** to promo
fbb0: 74 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  te HAVING clause
fbc0: 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 73  s that use the s
fbd0: 61 6d 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ame alternative 
fbe0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
fbf0: 75 65 6e 63 65 20 61 73 20 74 68 65 20 47 52 4f  uence as the GRO
fc00: 55 50 20 42 59 20 74 65 72 6d 2c 20 62 75 74 20  UP BY term, but 
fc10: 74 68 61 74 20 69 73 20 6d 75 63 68 20 68 61 72  that is much har
fc20: 64 65 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a 2a  der to check,.**
fc30: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
fc40: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
fc50: 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61   are uncommon, a
fc60: 6e 64 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20  nd this is only 
fc70: 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69  an.** optimizati
fc80: 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b 65 20 74  on, so we take t
fc90: 68 65 20 65 61 73 79 20 77 61 79 20 6f 75 74 20  he easy way out 
fca0: 61 6e 64 20 73 69 6d 70 6c 79 20 72 65 71 75 69  and simply requi
fcb0: 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20  re the.** GROUP 
fcc0: 42 59 20 74 6f 20 75 73 65 20 74 68 65 20 42 49  BY to use the BI
fcd0: 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20 73  NARY collating s
fce0: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20  equence..*/.int 
fcf0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
fd00: 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 50  stantOrGroupBy(P
fd10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
fd20: 70 72 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20  pr *p, ExprList 
fd30: 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20 20 57 61  *pGroupBy){.  Wa
fd40: 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64  lker w;.  w.eCod
fd50: 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72  e = 1;.  w.xExpr
fd60: 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
fd70: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  odeIsConstantOrG
fd80: 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78 53 65 6c  roupBy;.  w.xSel
fd90: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
fda0: 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70 42 79 20  .  w.u.pGroupBy 
fdb0: 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e  = pGroupBy;.  w.
fdc0: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
fdd0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
fde0: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
fdf0: 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
fe00: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
fe10: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
fe20: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
fe30: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
fe40: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
fe50: 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63   or a function c
fe60: 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e  all with constan
fe70: 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65  t arguments.  Re
fe80: 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68  turn and 0 if th
fe90: 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76  ere.** are any v
fea0: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
feb0: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
fec0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
fed0: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
fee0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
fef0: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
ff00: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
ff10: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
ff20: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
ff30: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
ff40: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
ff50: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
ff60: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
ff70: 6e 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73  n(Expr *p, u8 is
ff80: 49 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28  Init){.  assert(
ff90: 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73   isInit==0 || is
ffa0: 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Init==1 );.  ret
ffb0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
ffc0: 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b  p, 4+isInit, 0);
ffd0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
ffe0: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
fff0: 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  HINTS./*.** Walk
10000 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
10010 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
10020 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10030 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73   contains a.** s
10040 75 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20  ubquery of some 
10050 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20  kind.  Return 0 
10060 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
10070 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69  subqueries..*/.i
10080 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
10090 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79 28 45  ntainsSubquery(E
100a0 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65  xpr *p){.  Walke
100b0 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  r w;.  w.eCode =
100c0 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   1;.  w.xExprCal
100d0 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
100e0 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
100f0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
10100 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
10110 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66  WalkFail;.#ifdef
10120 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
10130 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
10140 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  k2 = sqlite3Sele
10150 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23  ctWalkAssert2;.#
10160 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 57  endif.  sqlite3W
10170 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a  alkExpr(&w, p);.
10180 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65    return w.eCode
10190 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ==0;.}.#endif../
101a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
101b0 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61  ession p codes a
101c0 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65   constant intege
101d0 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20  r that is small 
101e0 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74  enough.** to fit
101f0 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74   in a 32-bit int
10200 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61  eger, return 1 a
10210 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65  nd put the value
10220 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a   of the integer.
10230 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20  ** in *pValue.  
10240 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
10250 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  n is not an inte
10260 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20  ger or if it is 
10270 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69  too big.** to fi
10280 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  t in a signed 32
10290 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
102a0 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65  turn 0 and leave
102b0 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67   *pValue unchang
102c0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
102d0 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
102e0 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56  Expr *p, int *pV
102f0 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  alue){.  int rc 
10300 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  = 0;.  if( p==0 
10310 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
10320 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  Can only happen 
10330 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d  following on OOM
10340 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   */..  /* If an 
10350 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
10360 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c   integer literal
10370 20 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20   that fits in a 
10380 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20  signed 32-bit.  
10390 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  ** integer, then
103a0 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65   the EP_IntValue
103b0 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20   flag will have 
103c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74  already been set
103d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
103e0 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op!=TK_INTEGER 
103f0 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45  || (p->flags & E
10400 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20  P_IntValue)!=0. 
10410 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
10420 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e  ite3GetInt32(p->
10430 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d  u.zToken, &rc)==
10440 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66  0 );..  if( p->f
10450 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
10460 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75  ue ){.    *pValu
10470 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b  e = p->u.iValue;
10480 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
10490 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e   }.  switch( p->
104a0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
104b0 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
104c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70   rc = sqlite3Exp
104d0 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
104e0 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
104f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10500 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
10510 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
10520 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
10530 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
10540 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
10550 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
10560 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33  rt( v!=(-2147483
10570 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  647-1) );.      
10580 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
10590 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
105a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
105b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
105c0 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
105d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
105e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
105f0 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69  FALSE if there i
10600 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
10610 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10620 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  can be NULL..**.
10630 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
10640 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55  sion might be NU
10650 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70  LL or if the exp
10660 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63  ression is too c
10670 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c  omplex.** to tel
10680 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  l return TRUE.  
10690 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
106a0 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61  ine is used as a
106b0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
106c0 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c  to skip OP_IsNul
106d0 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65  l opcodes.** whe
106e0 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  n we know that a
106f0 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
10700 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61   NULL.  Hence, a
10710 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a   false positive.
10720 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52  ** (returning TR
10730 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20  UE when in fact 
10740 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
10750 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c  an never be NULL
10760 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20  ) might.** be a 
10770 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63  small performanc
10780 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68  e hit but is oth
10790 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e  erwise harmless.
107a0 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a    On the other.*
107b0 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20  * hand, a false 
107c0 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e  negative (return
107d0 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74  ing FALSE when t
107e0 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20  he result could 
107f0 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c  be NULL).** will
10800 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
10810 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61  n an incorrect a
10820 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20  nswer.  So when 
10830 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
10840 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74  .** TRUE..*/.int
10850 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
10860 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72  eNull(const Expr
10870 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20   *p){.  u8 op;. 
10880 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
10890 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
108a0 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70  ==TK_UMINUS ){ p
108b0 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20   = p->pLeft; }. 
108c0 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69   op = p->op;.  i
108d0 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
108e0 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
108f0 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
10900 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
10910 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20  TEGER:.    case 
10920 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63  TK_STRING:.    c
10930 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
10940 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a    case TK_BLOB:.
10950 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
10960 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
10970 4d 4e 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  MN:.      return
10980 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
10990 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c  (p, EP_CanBeNull
109a0 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
109b0 20 20 70 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c 20    p->pTab==0 || 
109c0 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f   /* Reference to
109d0 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
109e0 20 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   on expression *
109f0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  /.             (
10a00 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26  p->iColumn>=0 &&
10a10 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   p->pTab->aCol[p
10a20 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75  ->iColumn].notNu
10a30 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61  ll==0);.    defa
10a40 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
10a50 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
10a60 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
10a70 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
10a80 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74  ssion is a const
10a90 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ant which would 
10aa0 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  be.** unchanged 
10ab0 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77  by OP_Affinity w
10ac0 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79  ith the affinity
10ad0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
10ae0 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
10af0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10b00 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
10b10 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
10b20 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65   OP_Affinity ope
10b30 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  ration.** can be
10b40 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20   omitted.  When 
10b50 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20  in doubt return 
10b60 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20  FALSE.  A false 
10b70 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68  negative.** is h
10b80 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73  armless.  A fals
10b90 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65  e positive, howe
10ba0 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20  ver, can result 
10bb0 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20  in the wrong.** 
10bc0 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  answer..*/.int s
10bd0 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
10be0 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
10bf0 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63  const Expr *p, c
10c00 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f  har aff){.  u8 o
10c10 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51  p;.  if( aff==SQ
10c20 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20  LITE_AFF_BLOB ) 
10c30 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c  return 1;.  whil
10c40 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
10c50 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
10c60 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
10c70 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
10c80 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
10c90 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
10ca0 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
10cb0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
10cc0 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
10cd0 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
10ce0 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
10cf0 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
10d00 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
10d10 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
10d20 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
10d30 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
10d40 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
10d50 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  L || aff==SQLITE
10d60 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
10d70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
10d80 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
10d90 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
10da0 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
10db0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
10dc0 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  LOB: {.      ret
10dd0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
10de0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
10df0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
10e00 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b   p->iTable>=0 );
10e10 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65    /* p cannot be
10e20 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b   part of a CHECK
10e30 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
10e40 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69       return p->i
10e50 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20  Column<0.       
10e60 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
10e70 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
10e80 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
10e90 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20  F_NUMERIC);.    
10ea0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
10eb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
10ec0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
10ed0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
10ee0 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
10ef0 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
10f00 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
10f10 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
10f20 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
10f30 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
10f40 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
10f50 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
10f60 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
10f70 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
10f80 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
10f90 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
10fa0 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
10fb0 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
10fc0 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
10fd0 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68  ../*.** pX is th
10fe0 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f  e RHS of an IN o
10ff0 70 65 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20  perator.  If pX 
11000 69 73 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  is a SELECT stat
11010 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63  ement .** that c
11020 61 6e 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64  an be simplified
11030 20 74 6f 20 61 20 64 69 72 65 63 74 20 74 61 62   to a direct tab
11040 6c 65 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20  le access, then 
11050 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
11060 74 65 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43  ter to the SELEC
11070 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66  T statement.  If
11080 20 70 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c   pX is not a SEL
11090 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a  ECT statement,.*
110a0 2a 20 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45  * or if the SELE
110b0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65  CT statement nee
110c0 64 73 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73  ds to be manifes
110d0 74 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ted into a trans
110e0 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74  ient.** table, t
110f0 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  hen return NULL.
11100 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
11110 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
11120 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a  .static Select *
11130 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
11140 4f 70 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20  Opt(Expr *pX){. 
11150 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72   Select *p;.  Sr
11160 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45  cList *pSrc;.  E
11170 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
11180 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
11190 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
111a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
111b0 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
111c0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  ) ) return 0;  /
111d0 2a 20 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79  * Not a subquery
111e0 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61   */.  if( ExprHa
111f0 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
11200 5f 56 61 72 53 65 6c 65 63 74 29 20 20 29 20 72  _VarSelect)  ) r
11210 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72  eturn 0;  /* Cor
11220 72 65 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a  related subq */.
11230 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c    p = pX->x.pSel
11240 65 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  ect;.  if( p->pP
11250 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rior ) return 0;
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11270 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   Not a compound 
11280 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20  SELECT */.  if( 
11290 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
112a0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
112b0 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20  gregate) ){.    
112c0 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65  testcase( (p->se
112d0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
112e0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
112f0 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
11300 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
11310 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
11320 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
11330 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
11340 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
11350 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
11360 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  No DISTINCT keyw
11370 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65  ord and no aggre
11380 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
11390 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  /.  }.  assert( 
113a0 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
113b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
113c0 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  * Has no GROUP B
113d0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  Y clause */.  if
113e0 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  ( p->pLimit ) re
113f0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
11400 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c       /* Has no L
11410 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20  IMIT clause */. 
11420 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29   if( p->pWhere )
11430 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
11440 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
11450 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  o WHERE clause *
11460 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  /.  pSrc = p->pS
11470 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
11480 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  rc!=0 );.  if( p
11490 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
114a0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
114b0 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d    /* Single term
114c0 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   in FROM clause 
114d0 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  */.  if( pSrc->a
114e0 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65  [0].pSelect ) re
114f0 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46  turn 0;     /* F
11500 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62  ROM is not a sub
11510 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f  query or view */
11520 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
11530 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73  a[0].pTab;.  ass
11540 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
11550 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
11560 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20  pSelect==0 );   
11570 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d           /* FROM
11580 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
11590 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49   view */.  if( I
115a0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
115b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
115c0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
115d0 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
115e0 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  able */.  pEList
115f0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
11600 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
11610 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45  0 );.  /* All SE
11620 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73  LECT results mus
11630 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f  t be columns. */
11640 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
11650 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
11660 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65  ){.    Expr *pRe
11670 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s = pEList->a[i]
11680 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
11690 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  pRes->op!=TK_COL
116a0 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
116b0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
116c0 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e  ->iTable==pSrc->
116d0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20  a[0].iCursor ); 
116e0 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c   /* Not a correl
116f0 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f  ated subquery */
11700 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
11710 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
11720 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
11730 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
11740 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
11750 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
11760 65 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63  e code that chec
11770 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ks the left-most
11780 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
11790 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73   table iCur to s
117a0 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74  ee if.** it cont
117b0 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e  ains any NULL en
117c0 74 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68  tries.  Cause th
117d0 65 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65  e register at re
117e0 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73  gHasNull to be s
117f0 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e  et.** to a non-N
11800 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75  ULL value if iCu
11810 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55  r contains no NU
11820 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69  LLs.  Cause regi
11830 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a  ster regHasNull.
11840 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  ** to be set to 
11850 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e  NULL if iCur con
11860 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
11870 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  e NULL values..*
11880 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
11890 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
118a0 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lag(Vdbe *v, int
118b0 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61   iCur, int regHa
118c0 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64  sNull){.  int ad
118d0 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr1;.  sqlite3Vd
118e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
118f0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61  nteger, 0, regHa
11900 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20  sNull);.  addr1 
11910 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11920 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
11930 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76  , iCur); VdbeCov
11940 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
11950 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11960 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72   OP_Column, iCur
11970 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29  , 0, regHasNull)
11980 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
11990 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
119a0 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
119b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
119c0 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28  "first_entry_in(
119d0 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20  %d)", iCur));.  
119e0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
119f0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d  ere(v, addr1);.}
11a00 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
11a10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
11a20 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65  BQUERY./*.** The
11a30 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
11a40 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
11a50 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73   a list (not a s
11a60 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20  ubquery) on the 
11a70 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73  .** right-hand s
11a80 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ide.  Return TRU
11a90 45 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69  E if that list i
11aa0 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73  s constant..*/.s
11ab0 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
11ac0 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74  3InRhsIsConstant
11ad0 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45  (Expr *pIn){.  E
11ae0 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74  xpr *pLHS;.  int
11af0 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20   res;.  assert( 
11b00 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
11b10 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65  (pIn, EP_xIsSele
11b20 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20  ct) );.  pLHS = 
11b30 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49  pIn->pLeft;.  pI
11b40 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  n->pLeft = 0;.  
11b50 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  res = sqlite3Exp
11b60 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29  rIsConstant(pIn)
11b70 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d  ;.  pIn->pLeft =
11b80 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20   pLHS;.  return 
11b90 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  res;.}.#endif../
11ba0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
11bb0 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
11bc0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
11bd0 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29   of the IN (...)
11be0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68   operator..** Th
11bf0 65 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69  e pX parameter i
11c00 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
11c10 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
11c20 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
11c30 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
11c40 65 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20  e either a list 
11c50 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  of expressions o
11c60 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  r a subquery..**
11c70 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
11c80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
11c90 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  o find or create
11ca0 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74   a b-tree object
11cb0 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20   that can.** be 
11cc0 75 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74  used either to t
11cd0 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  est for membersh
11ce0 69 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65  ip in the RHS se
11cf0 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  t or to iterate 
11d00 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d  through.** all m
11d10 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48  embers of the RH
11d20 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20  S set, skipping 
11d30 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a  duplicates..**.*
11d40 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70  * A cursor is op
11d50 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72  ened on the b-tr
11d60 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ee object that i
11d70 73 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  s the RHS of the
11d80 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
11d90 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69  and pX->iTable i
11da0 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
11db0 65 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f  ex of that curso
11dc0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  r..**.** The ret
11dd0 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74  urned value of t
11de0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64  his function ind
11df0 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65  icates the b-tre
11e00 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
11e10 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
11e20 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20  NDEX_ROWID      
11e30 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
11e40 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
11e50 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
11e60 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
11e70 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73  _ASC  - The curs
11e80 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
11e90 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
11ea0 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
11eb0 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20  EX_INDEX_DESC - 
11ec0 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
11ed0 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65  pened on a desce
11ee0 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
11ef0 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20    IN_INDEX_EPH  
11f00 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
11f10 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
11f20 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
11f30 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f50 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70      populated ep
11f60 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a  heremal table..*
11f70 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  *   IN_INDEX_NOO
11f80 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72  P       - No cur
11f90 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  sor was allocate
11fa0 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61  d.  The IN opera
11fb0 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20  tor must be.**  
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fd0 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74         implement
11fe0 65 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65  ed as a sequence
11ff0 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e   of comparisons.
12000 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
12010 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20  ng b-tree might 
12020 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52  be used if the R
12030 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58  HS expression pX
12040 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20   is a simple.** 
12050 73 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73  subquery such as
12060 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
12070 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63  CT <column1>, <c
12080 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20  olumn2>... FROM 
12090 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66  <table>.**.** If
120a0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
120b0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
120c0 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20   list or a more 
120d0 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79  complex subquery
120e0 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68  , then.** an eph
120f0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67  emeral table mig
12100 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65  ht need to be ge
12110 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
12120 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a   RHS and then.**
12130 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65   pX->iTable made
12140 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
12150 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
12160 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a   instead of an.*
12170 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  * existing table
12180 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c  ..**.** The inFl
12190 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75  ags parameter mu
121a0 73 74 20 63 6f 6e 74 61 69 6e 2c 20 61 74 20 61  st contain, at a
121b0 20 6d 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66   minimum, one of
121c0 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f   the bits.** IN_
121d0 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
121e0 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f   or IN_INDEX_LOO
121f0 50 20 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 20  P but not both. 
12200 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74   If inFlags cont
12210 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  ains.** IN_INDEX
12220 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65  _MEMBERSHIP, the
12230 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  n the generated 
12240 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73  table will be us
12250 65 64 20 66 6f 72 20 61 20 66 61 73 74 0a 2a 2a  ed for a fast.**
12260 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
12270 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49  .  When the IN_I
12280 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73  NDEX_LOOP bit is
12290 20 73 65 74 2c 20 74 68 65 20 49 4e 20 69 6e 64   set, the IN ind
122a0 65 78 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 75 73  ex will.** be us
122b0 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20  ed to loop over 
122c0 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68  all values of th
122d0 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
122e0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
122f0 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  When IN_INDEX_LO
12300 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  OP is used (and 
12310 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
12320 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
12330 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68  te.** through th
12340 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74  e set members) t
12350 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hen the b-tree m
12360 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  ust not contain 
12370 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41  duplicates..** A
12380 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
12390 65 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  e will be create
123a0 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c  d unless the sel
123b0 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  ected columns ar
123c0 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  e guaranteed.** 
123d0 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65  to be unique - e
123e0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74  ither because it
123f0 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
12400 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75  RIMARY KEY or du
12410 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45  e to.** a UNIQUE
12420 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69   constraint or i
12430 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ndex..**.** When
12440 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
12450 53 48 49 50 20 69 73 20 75 73 65 64 20 28 61 6e  SHIP is used (an
12460 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  d the b-tree wil
12470 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f  l be used .** fo
12480 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65  r fast set membe
12490 72 73 68 69 70 20 74 65 73 74 73 29 20 74 68 65  rship tests) the
124a0 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  n an epheremal t
124b0 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65  able must .** be
124c0 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f   used unless <co
124d0 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67  lumns> is a sing
124e0 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  le INTEGER PRIMA
124f0 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72  RY KEY column or
12500 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61   an .** index ca
12510 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20  n be found with 
12520 74 68 65 20 73 70 65 63 69 66 69 65 64 20 3c 63  the specified <c
12530 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c  olumns> as its l
12540 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20  eft-most..**.** 
12550 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  If the IN_INDEX_
12560 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49  NOOP_OK and IN_I
12570 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
12580 61 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64  are both set and
12590 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f  .** if the RHS o
125a0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
125b0 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74  r is a list (not
125c0 20 61 20 73 75 62 71 75 65 72 79 29 20 74 68 65   a subquery) the
125d0 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
125e0 65 20 6d 69 67 68 74 20 64 65 63 69 64 65 20 74  e might decide t
125f0 68 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20  hat creating an 
12600 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65  ephemeral b-tree
12610 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a   for membership.
12620 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f  ** testing is to
12630 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20  o expensive and 
12640 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f  return IN_INDEX_
12650 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63  NOOP.  In that c
12660 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ase, the.** call
12670 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  ing routine shou
12680 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  ld implement the
12690 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69   IN operator usi
126a0 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ng a sequence.**
126b0 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d   of Eq or Ne com
126c0 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
126d0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ns..**.** When t
126e0 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69  he b-tree is bei
126f0 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62  ng used for memb
12700 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68  ership tests, th
12710 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
12720 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64  on.** might need
12730 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72   to know whether
12740 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20   or not the RHS 
12750 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
12760 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61  perator.** conta
12770 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20  ins a NULL.  If 
12780 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
12790 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  not a NULL point
127a0 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68  er and .** if th
127b0 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63  ere is any chanc
127c0 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
127d0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
127e0 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a   NULL value at.*
127f0 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20  * runtime, then 
12800 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
12810 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
12820 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
12830 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70  written.** to *p
12840 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20  rRhsHasNull. If 
12850 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
12860 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
12870 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  ) contains a.** 
12880 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e  NULL value, then
12890 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69   *prRhsHasNull i
128a0 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
128b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
128c0 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
128d0 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74  ed and its locat
128e0 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70  ion stored in *p
128f0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65  rRhsHasNull, the
12900 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
12910 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  n that register 
12920 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
12930 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
12940 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  ins one or more.
12950 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ** NULL values, 
12960 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73  and it will be s
12970 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  ome non-NULL val
12980 75 65 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ue if the b-tree
12990 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20   contains no.** 
129a0 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  NULL values..**.
129b0 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61 70 20  ** If the aiMap 
129c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
129d0 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70   NULL, it must p
129e0 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79  oint to an array
129f0 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f   containing.** o
12a00 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65  ne element for e
12a10 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72  ach column retur
12a20 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
12a30 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74  T statement on t
12a40 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65  he RHS.** of the
12a50 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f   IN(...) operato
12a60 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e 74 72  r. The i'th entr
12a70 79 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69  y of the array i
12a80 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
12a90 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f   the.** offset o
12aa0 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75  f the index colu
12ab0 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  mn that matches 
12ac0 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20  the i'th column 
12ad0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a  returned by the.
12ae0 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65  ** SELECT. For e
12af0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65  xample, if the e
12b00 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65  xpression and se
12b10 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61 72 65  lected index are
12b20 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f  :.**.**   (?,?,?
12b30 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20  ) IN (SELECT a, 
12b40 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a  b, c FROM t1).**
12b50 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
12b60 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61  i1 ON t1(b, c, a
12b70 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69  );.**.** then ai
12b80 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74  Map[] is populat
12b90 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31  ed with {2, 0, 1
12ba0 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  }..*/.#ifndef SQ
12bb0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
12bc0 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  RY.int sqlite3Fi
12bd0 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72  ndInIndex(.  Par
12be0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12bf0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
12c00 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
12c10 45 78 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20  Expr *pX,       
12c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12c30 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
12c40 65 20 28 52 48 53 29 20 6f 66 20 74 68 65 20 49  e (RHS) of the I
12c50 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
12c60 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20  u32 inFlags,    
12c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
12c80 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45  _INDEX_LOOP, _ME
12c90 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72  MBERSHIP, and/or
12ca0 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69   _NOOP_OK */.  i
12cb0 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  nt *prRhsHasNull
12cc0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ,         /* Reg
12cd0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55  ister holding NU
12ce0 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65 65 20  LL status.  See 
12cf0 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  notes */.  int *
12d00 61 69 4d 61 70 20 20 20 20 20 20 20 20 20 20 20  aiMap           
12d10 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
12d20 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c   from Index fiel
12d30 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73  ds to RHS fields
12d40 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
12d50 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d70 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20  * SELECT to the 
12d80 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72  right of IN oper
12d90 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54  ator */.  int eT
12da0 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74  /* Type of RHS t
12dd0 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a  able. IN_INDEX_*
12de0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
12df0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
12e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
12e10 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53  ursor of the RHS
12e20 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
12e30 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20  mustBeUnique;   
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53    /* True if RHS
12e60 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20   must be unique 
12e70 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
12e80 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12e90 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69  arse);     /* Vi
12ea0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
12eb0 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20  ing coded */..  
12ec0 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
12ed0 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42  TK_IN );.  mustB
12ee0 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61  eUnique = (inFla
12ef0 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  gs & IN_INDEX_LO
12f00 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66  OP)!=0;..  /* If
12f10 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 69 73   the RHS of this
12f20 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f   IN(...) operato
12f30 72 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 61  r is a SELECT, a
12f40 6e 64 20 69 66 20 69 74 20 6d 61 74 74 65 72 73  nd if it matters
12f50 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
12f60 72 20 6e 6f 74 20 74 68 65 20 53 45 4c 45 43 54  r not the SELECT
12f70 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73   result contains
12f80 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 63 68   NULL values, ch
12f90 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20 2a 2a  eck whether.  **
12fa0 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20 69 73 20   or not NULL is 
12fb0 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c  actually possibl
12fc0 65 20 28 69 74 20 6d 61 79 20 6e 6f 74 20 62 65  e (it may not be
12fd0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 64  , for example, d
12fe0 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e 4f 54 20  ue .  ** to NOT 
12ff0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
13000 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 29 2e   in the schema).
13010 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75   If no NULL valu
13020 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2c  es are possible,
13030 0a 20 20 2a 2a 20 73 65 74 20 70 72 52 68 73 48  .  ** set prRhsH
13040 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62 65 66 6f  asNull to 0 befo
13050 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  re continuing.  
13060 2a 2f 0a 20 20 69 66 28 20 70 72 52 68 73 48 61  */.  if( prRhsHa
13070 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d 3e 66 6c  sNull && (pX->fl
13080 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
13090 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ct) ){.    int i
130a0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
130b0 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78 2e 70  pEList = pX->x.p
130c0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
130d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
130e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
130f0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
13100 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
13110 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ll(pEList->a[i].
13120 70 45 78 70 72 29 20 29 20 62 72 65 61 6b 3b 0a  pExpr) ) break;.
13130 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
13140 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  =pEList->nExpr )
13150 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48 61 73  {.      prRhsHas
13160 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Null = 0;.    }.
13170 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
13180 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69  to see if an exi
13190 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
131a0 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
131b0 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79   to.  ** satisfy
131c0 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
131d0 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20  s is preferable 
131e0 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  to generating a 
131f0 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65  new .  ** epheme
13200 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ral table.  */. 
13210 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
13220 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43  r==0 && (p = isC
13230 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
13240 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  (pX))!=0 ){.    
13250 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13260 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
13270 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
13280 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
13290 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
132a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
132b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
132c0 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f  able <table>. */
132d0 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20 20 20  .    i16 iDb;   
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
13300 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20  atabase idx for 
13310 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78 70 72  pTab */.    Expr
13320 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
13330 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e  ->pEList;.    in
13340 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74  t nExpr = pEList
13350 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20 61 73  ->nExpr;..    as
13360 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
13370 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
13380 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20    /* Because of 
13390 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
133a0 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73  Opt(p) */.    as
133b0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
133c0 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
133d0 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20  ; /* Because of 
133e0 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
133f0 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73  Opt(p) */.    as
13400 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30  sert( p->pSrc!=0
13410 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
13420 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20    /* Because of 
13430 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
13440 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54  Opt(p) */.    pT
13450 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
13460 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a  0].pTab;..    /*
13470 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e   Code an OP_Tran
13480 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54  saction and OP_T
13490 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61  ableLock for <ta
134a0 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62  ble>. */.    iDb
134b0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
134c0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
134d0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
134e0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
134f0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
13500 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
13510 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
13520 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
13530 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
13540 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  me);..    assert
13550 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33  (v);  /* sqlite3
13560 47 65 74 56 64 62 65 28 29 20 68 61 73 20 61 6c  GetVdbe() has al
13570 77 61 79 73 20 62 65 65 6e 20 70 72 65 76 69 6f  ways been previo
13580 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  usly called */. 
13590 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20     if( nExpr==1 
135a0 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  && pEList->a[0].
135b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
135c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
135d0 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 72   "x IN (SELECT r
135e0 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c 65 29  owid FROM table)
135f0 22 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  " case */.      
13600 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
13610 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
13620 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20 20 20   OP_Once);.     
13630 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13640 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
13650 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
13660 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
13670 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
13680 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49  .      eType = I
13690 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a  N_INDEX_ROWID;..
136a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
136b0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
136c0 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
136d0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
136e0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
136f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
13700 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
13710 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  */.      int aff
13720 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20  inity_ok = 1;.  
13730 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
13740 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
13750 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  the affinity tha
13760 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
13770 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20 0a  o perform each .
13780 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69        ** compari
13790 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20  son is the same 
137a0 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  as the affinity 
137b0 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69  of each column i
137c0 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  n table.      **
137d0 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
137e0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20  he IN operator. 
137f0 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20 69   If it not, it i
13800 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
13810 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 61  o.      ** use a
13820 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ny index of the 
13830 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  RHS table.  */. 
13840 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13850 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69 74  nExpr && affinit
13860 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  y_ok; i++){.    
13870 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d      Expr *pLhs =
13880 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
13890 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70  eldSubexpr(pX->p
138a0 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
138b0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c    int iCol = pEL
138c0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d  ist->a[i].pExpr-
138d0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
138e0 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d 20    char idxaff = 
138f0 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75  sqlite3TableColu
13900 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62 2c  mnAffinity(pTab,
13910 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61  iCol); /* RHS ta
13920 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ble */.        c
13930 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71 6c  har cmpaff = sql
13940 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
13950 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66 66  ity(pLhs, idxaff
13960 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
13970 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c  ase( cmpaff==SQL
13980 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a  ITE_AFF_BLOB );.
13990 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
139a0 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45  ( cmpaff==SQLITE
139b0 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
139c0 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d 70       switch( cmp
139d0 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  aff ){.         
139e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
139f0 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20  _BLOB:.         
13a00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13a10 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
13a20 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
13a30 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
13a40 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
13a50 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 54  ) only returns T
13a60 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65 20  EXT if one side 
13a70 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  or the.         
13a80 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73 20     ** other has 
13a90 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20  no affinity and 
13aa0 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20 69  the other side i
13ab0 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a  s TEXT.  Hence,.
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
13ad0 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20  he only way for 
13ae0 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45 58  cmpaff to be TEX
13af0 54 20 69 73 20 66 6f 72 20 69 64 78 61 66 66 20  T is for idxaff 
13b00 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20 20  to be TEXT.     
13b10 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f         ** and fo
13b20 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74 68  r the term on th
13b30 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
13b40 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69 6e  to have no affin
13b50 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ity. */.        
13b60 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 61      assert( idxa
13b70 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
13b80 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20  EXT );.         
13b90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13ba0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
13bb0 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
13bc0 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 73  y_ok = sqlite3Is
13bd0 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
13be0 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20  idxaff);.       
13bf0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
13c00 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f    if( affinity_o
13c10 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
13c20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
13c30 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  isting index tha
13c40 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20  t will work for 
13c50 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72  this IN operator
13c60 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
13c70 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
13c80 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65  x; pIdx && eType
13c90 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  ==0; pIdx=pIdx->
13ca0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
13cb0 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65    Bitmask colUse
13cc0 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  d;      /* Colum
13cd0 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ns of the index 
13ce0 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  used */.        
13cf0 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20    Bitmask mCol; 
13d00 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
13d10 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
13d20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20  column */.      
13d30 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
13d40 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f  olumn<nExpr ) co
13d50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
13d60 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f    /* Maximum nCo
13d70 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e  lumn is BMS-2, n
13d80 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61  ot BMS-1, so tha
13d90 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65  t we can compute
13da0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49  .          ** BI
13db0 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74  TMASK(nExpr) wit
13dc0 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67  hout overflowing
13dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
13de0 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43  stcase( pIdx->nC
13df0 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a  olumn==BMS-2 );.
13e00 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
13e10 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  se( pIdx->nColum
13e20 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  n==BMS-1 );.    
13e30 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
13e40 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29  nColumn>=BMS-1 )
13e50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13e60 20 20 20 20 20 69 66 28 20 6d 75 73 74 42 65 55       if( mustBeU
13e70 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20  nique ){.       
13e80 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
13e90 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20  KeyCol>nExpr.   
13ea0 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64            ||(pId
13eb0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72  x->nColumn>nExpr
13ec0 20 26 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64   && !IsUniqueInd
13ed0 65 78 28 70 49 64 78 29 29 0a 20 20 20 20 20 20  ex(pIdx)).      
13ee0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13ef0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
13f00 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
13f10 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76  is not unique ov
13f20 65 72 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f  er the IN RHS co
13f30 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  lumns */.       
13f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13f50 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20   }.  .          
13f60 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f  colUsed = 0;   /
13f70 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64  * Columns of ind
13f80 65 78 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a  ex used so far *
13f90 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
13fa0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
13fb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
13fc0 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c  Expr *pLhs = sql
13fd0 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
13fe0 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74  ubexpr(pX->pLeft
13ff0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
14000 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70    Expr *pRhs = p
14010 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
14020 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  r;.            C
14030 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73  ollSeq *pReq = s
14040 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
14050 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
14060 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a  e, pLhs, pRhs);.
14070 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
14080 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  j;.  .          
14090 20 20 61 73 73 65 72 74 28 20 70 52 65 71 21 3d    assert( pReq!=
140a0 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75  0 || pRhs->iColu
140b0 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20  mn==XN_ROWID || 
140c0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
140d0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
140e0 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b  j=0; j<nExpr; j+
140f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
14100 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
14110 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69  lumn[j]!=pRhs->i
14120 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
14130 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
14140 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
14150 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20  zColl[j] );.    
14160 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
14170 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  eq!=0 && sqlite3
14180 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e  StrICmp(pReq->zN
14190 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ame, pIdx->azCol
141a0 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20  l[j])!=0 ){.    
141b0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
141c0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
141d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
141e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
141f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14200 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70       if( j==nExp
14210 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
14220 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41         mCol = MA
14230 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20 20 20  SKBIT(j);.      
14240 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c 20 26        if( mCol &
14250 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65 61 6b   colUsed ) break
14260 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e  ; /* Each column
14270 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20   used only once 
14280 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  */.            c
14290 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a  olUsed |= mCol;.
142a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
142b0 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d  aiMap ) aiMap[i]
142c0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
142d0 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 61  }.  .          a
142e0 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70 72 20  ssert( i==nExpr 
142f0 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53  || colUsed!=(MAS
14300 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29  KBIT(nExpr)-1) )
14310 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14320 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49  colUsed==(MASKBI
14330 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b 0a 20  T(nExpr)-1) ){. 
14340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
14350 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
14360 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
14370 20 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 20   the index pIdx 
14380 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20  is usable */.   
14390 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64           int iAd
143a0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
143b0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
143c0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
143d0 28 76 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (v);.#ifndef SQL
143e0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
143f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
14400 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
14410 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 30 2c  , OP_Explain, 0,
14420 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
14430 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
14440 6e 74 66 28 64 62 2c 20 22 55 53 49 4e 47 20 49  ntf(db, "USING I
14450 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d 4f  NDEX %s FOR IN-O
14460 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e 7a  PERATOR",pIdx->z
14470 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
14480 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29       P4_DYNAMIC)
14490 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
144a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
144b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
144c0 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64  nRead, iTab, pId
144d0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
144e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
144f0 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
14500 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
14510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
14520 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
14530 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
14540 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
14550 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f  ssert( IN_INDEX_
14560 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e  INDEX_DESC == IN
14570 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
14580 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
14590 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
145a0 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70  EX_INDEX_ASC + p
145b0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
145c0 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  0];.  .         
145d0 20 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e     if( prRhsHasN
145e0 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ull ){.#ifdef SQ
145f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
14600 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20  MN_USED_MASK.   
14610 20 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d             i64 m
14620 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29  ask = (1<<nExpr)
14630 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
14640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14650 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
14660 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20  lumnsUsed, .    
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54                iT
14680 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26  ab, 0, 0, (u8*)&
14690 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b  mask, P4_INT64);
146a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
146b0 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e        *prRhsHasN
146c0 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
146d0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
146e0 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31      if( nExpr==1
146f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14700 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61      sqlite3SetHa
14710 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61  sNullFlag(v, iTa
14720 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  b, *prRhsHasNull
14730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
14740 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
14750 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
14760 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14770 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
14780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14790 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76  } /* End loop ov
147a0 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  er indexes */.  
147b0 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28      } /* End if(
147c0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a   affinity_ok ) *
147d0 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69  /.    } /* End i
147e0 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69  f not an rowid i
147f0 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45  ndex */.  } /* E
14800 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70  nd attempt to op
14810 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20  timize using an 
14820 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49  index */..  /* I
14830 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67  f no preexisting
14840 20 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61   index is availa
14850 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63  ble for the IN c
14860 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49  lause.  ** and I
14870 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
14880 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79  an allowed reply
14890 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
148a0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
148b0 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20  ator is a list, 
148c0 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20  not a subquery. 
148d0 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
148e0 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
148f0 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65  or has two or fe
14900 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20  wer terms,.  ** 
14910 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77  then it is not w
14920 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e  orth creating an
14930 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
14940 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a   to evaluate.  *
14950 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  * the IN operato
14960 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49  r so return IN_I
14970 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a  NDEX_NOOP..  */.
14980 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20    if( eType==0. 
14990 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20    && (inFlags & 
149a0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
149b0 29 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73  ).   && !ExprHas
149c0 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
149d0 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26  xIsSelect).   &&
149e0 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49   (!sqlite3InRhsI
149f0 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c  sConstant(pX) ||
14a00 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pX->x.pList->nE
14a10 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20  xpr<=2).  ){.   
14a20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
14a30 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69  X_NOOP;.  }..  i
14a40 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( eType==0 ){. 
14a50 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20     /* Could not 
14a60 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67  find an existing
14a70 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
14a80 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48  to use as the RH
14a90 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a  S b-tree..    **
14aa0 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f   We will have to
14ab0 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68   generate an eph
14ac0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
14ad0 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20  do the job..    
14ae0 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64  */.    u32 saved
14af0 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
14b00 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
14b10 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76  .    int rMayHav
14b20 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65  eNull = 0;.    e
14b30 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
14b40 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46  EPH;.    if( inF
14b50 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
14b60 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50  LOOP ){.      pP
14b70 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
14b80 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
14b90 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  pX->pLeft->iColu
14ba0 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73  mn<0 && !ExprHas
14bb0 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
14bc0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
14bd0 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
14be0 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20  _INDEX_ROWID;.  
14bf0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
14c00 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
14c10 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73   ){.      *prRhs
14c20 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61  HasNull = rMayHa
14c30 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  veNull = ++pPars
14c40 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20  e->nMem;.    }. 
14c50 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
14c60 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
14c70 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  pX, rMayHaveNull
14c80 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  , eType==IN_INDE
14c90 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50  X_ROWID);.    pP
14ca0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
14cb0 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f   = savedNQueryLo
14cc0 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  op;.  }else{.   
14cd0 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pX->iTable = iT
14ce0 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61  ab;.  }..  if( a
14cf0 69 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d 49  iMap && eType!=I
14d00 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
14d10 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49  C && eType!=IN_I
14d20 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
14d30 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b  ){.    int i, n;
14d40 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
14d50 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
14d60 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66  X->pLeft);.    f
14d70 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
14d80 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a  ) aiMap[i] = i;.
14d90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79    }.  return eTy
14da0 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  pe;.}.#endif..#i
14db0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14dc0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
14dd0 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20   Argument pExpr 
14de0 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20  is an (?, ?...) 
14df0 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  IN(...) expressi
14e00 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  on. This .** fun
14e10 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
14e20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75  and returns a nu
14e30 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
14e40 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a  ing containing .
14e50 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69 65  ** the affinitie
14e60 73 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  s to be used for
14e70 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   each column of 
14e80 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a  the comparison..
14e90 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  **.** It is the 
14ea0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
14eb0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
14ec0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
14ed0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69  returned.** stri
14ee0 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  ng is eventually
14ef0 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c   freed using sql
14f00 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f  ite3DbFree()..*/
14f10 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78  .static char *ex
14f20 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72  prINAffinity(Par
14f30 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
14f40 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72   *pExpr){.  Expr
14f50 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
14f60 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56  >pLeft;.  int nV
14f70 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
14f80 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
14f90 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  );.  Select *pSe
14fa0 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66  lect = (pExpr->f
14fb0 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
14fc0 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e  ect) ? pExpr->x.
14fd0 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63  pSelect : 0;.  c
14fe0 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73  har *zRet;..  as
14ff0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
15000 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74  =TK_IN );.  zRet
15010 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
15020 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62  ocRaw(pParse->db
15030 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28  , nVal+1);.  if(
15040 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   zRet ){.    int
15050 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
15060 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
15070 20 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20       Expr *pA = 
15080 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
15090 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
150a0 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20   i);.      char 
150b0 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  a = sqlite3ExprA
150c0 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20  ffinity(pA);.   
150d0 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
150e0 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69  {.        zRet[i
150f0 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  ] = sqlite3Compa
15100 72 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65  reAffinity(pSele
15110 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ct->pEList->a[i]
15120 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20  .pExpr, a);.    
15130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15140 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20   zRet[i] = a;.  
15150 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15160 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30  zRet[nVal] = '\0
15170 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ';.  }.  return 
15180 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
15190 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
151a0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
151b0 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73  ** Load the Pars
151c0 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
151d0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
151e0 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72  ument with an er
151f0 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20  ror .** message 
15200 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
15210 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74  **   "sub-select
15220 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d   returns N colum
15230 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22  ns - expected M"
15240 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69  .*/   .void sqli
15250 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
15260 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
15270 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e   int nActual, in
15280 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f  t nExpect){.  co
15290 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d  nst char *zFmt =
152a0 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74   "sub-select ret
152b0 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20  urns %d columns 
152c0 2d 20 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a  - expected %d";.
152d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
152e0 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20  g(pParse, zFmt, 
152f0 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74  nActual, nExpect
15300 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
15310 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45  ** Expression pE
15320 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 20  xpr is a vector 
15330 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 75 73  that has been us
15340 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20  ed in a context 
15350 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e  where.** it is n
15360 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66  ot permitted. If
15370 20 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d   pExpr is a sub-
15380 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74  select vector, t
15390 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20  his routine .** 
153a0 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73 65 20  loads the Parse 
153b0 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65  object with a me
153c0 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72  ssage of the for
153d0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d  m:.**.**   "sub-
153e0 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e  select returns N
153f0 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
15400 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ted 1".**.** Or,
15410 20 69 66 20 69 74 20 69 73 20 61 20 72 65 67 75   if it is a regu
15420 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f  lar scalar vecto
15430 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20  r:.**.**   "row 
15440 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a  value misused".*
15450 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
15460 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
15470 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
15480 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66  xpr *pExpr){.#if
15490 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
154a0 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
154b0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
154c0 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20  P_xIsSelect ){. 
154d0 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
154e0 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
154f0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
15500 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
15510 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  , 1);.  }else.#e
15520 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
15530 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15540 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
15550 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d  misused");.  }.}
15560 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
15570 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72   code for scalar
15580 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64   subqueries used
15590 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65   as a subquery e
155a0 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54  xpression, EXIST
155b0 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72  S,.** or IN oper
155c0 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73  ators.  Examples
155d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
155e0 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
155f0 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
15600 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
15610 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
15620 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
15630 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78  ubquery.**     x
15640 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20   IN (4,5,11)    
15650 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20            -- IN 
15660 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69  operator with li
15670 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64  st on right-hand
15680 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49   side.**     x I
15690 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  N (SELECT a FROM
156a0 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70   b)     -- IN op
156b0 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71  erator with subq
156c0 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68  uery on the righ
156d0 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70  t.**.** The pExp
156e0 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63  r parameter desc
156f0 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73  ribes the expres
15700 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69  sion that contai
15710 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65  ns the IN.** ope
15720 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72  rator or subquer
15730 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
15740 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73  meter isRowid is
15750 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
15760 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
15770 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
15780 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66  * to be of the f
15790 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20  orm "<rowid> IN 
157a0 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72  (?, ?, ?)", wher
157b0 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72  e <rowid> is a r
157c0 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73  eference.** to s
157d0 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  ome integer key 
157e0 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
157f0 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69  e B-Tree. In thi
15800 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a  s case, use an.*
15810 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20  * intkey B-Tree 
15820 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
15830 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75   of IN(...) valu
15840 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  es instead of th
15850 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77  e usual.** (slow
15860 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  er) variable len
15870 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e  gth keys B-Tree.
15880 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61  .**.** If rMayHa
15890 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65  veNull is non-ze
158a0 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ro, that means t
158b0 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f  hat the operatio
158c0 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e  n is an IN.** (n
158d0 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45  ot a SELECT or E
158e0 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20  XISTS) and that 
158f0 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f  the RHS might co
15900 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a  ntains NULLs..**
15910 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
15920 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61  e does is initia
15930 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73 74 65  lize the registe
15940 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48  r given by rMayH
15950 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55  aveNull.** to NU
15960 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75  LL.  Calling rou
15970 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20  tines will take 
15980 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67  care of changing
15990 20 74 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a   this register.*
159a0 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e  * value to non-N
159b0 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69  ULL if the RHS i
159c0 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a  s NULL-free..**.
159d0 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20  ** For a SELECT 
159e0 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
159f0 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72  or, return the r
15a00 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c  egister that hol
15a10 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  ds the.** result
15a20 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63  .  For a multi-c
15a30 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68  olumn SELECT, th
15a40 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
15a50 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f  ed in a contiguo
15a60 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72  us.** array of r
15a70 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
15a80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
15a90 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66   the register of
15aa0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
15ab0 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e  * result column.
15ac0 20 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49    Return 0 for I
15ad0 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69  N operators or i
15ae0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
15af0 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  s..*/.#ifndef SQ
15b00 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15b10 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  RY.int sqlite3Co
15b20 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50  deSubselect(.  P
15b30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15b40 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15b50 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
15b60 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
15b70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
15b80 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49  , SELECT, or EXI
15b90 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  STS operator */.
15ba0 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c    int rHasNullFl
15bb0 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ag,       /* Reg
15bc0 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72  ister that recor
15bd0 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73  ds whether NULLs
15be0 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f   exist in RHS */
15bf0 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20  .  int isRowid  
15c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
15c10 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e   true, LHS of IN
15c20 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72   operator is a r
15c30 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  owid */.){.  int
15c40 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
15c50 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
15c60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d           /* One-
15c70 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73  time test addres
15c80 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20  s */.  int rReg 
15c90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15cb0 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69  * Register stori
15cc0 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a  ng resulting */.
15cd0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
15ce0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
15cf0 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  e);.  if( NEVER(
15d00 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  v==0) ) return 0
15d10 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
15d20 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
15d30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c  ;..  /* The eval
15d40 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  uation of the IN
15d50 2f 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d  /EXISTS/SELECT m
15d60 75 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20  ust be repeated 
15d70 65 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20  every time it.  
15d80 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
15d90 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  d if any of the 
15da0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
15db0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
15dc0 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
15dd0 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72  d side is a corr
15de0 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a  elated subquery.
15df0 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
15e00 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
15e10 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
15e20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
15e30 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20  variables.  **  
15e40 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69    *  We are insi
15e50 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a  de a trigger.  *
15e60 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  *.  ** If all of
15e70 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66   the above are f
15e80 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61  alse, then we ca
15e90 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  n run this code 
15ea0 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73  just once.  ** s
15eb0 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c  ave the results,
15ec0 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73   and reuse the s
15ed0 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75  ame result on su
15ee0 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
15ef0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
15f00 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
15f10 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
15f20 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d  elect) ){.    jm
15f30 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c  pIfDynamic = sql
15f40 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
15f50 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
15f60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
15f70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15f80 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
15f90 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
15fa0 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68  ain==2 ){.    ch
15fb0 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
15fc0 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
15fd0 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20 25  ->db, "EXECUTE %
15fe0 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22  s%s SUBQUERY %d"
15ff0 2c 0a 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44  ,.        jmpIfD
16000 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f  ynamic>=0?"":"CO
16010 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20  RRELATED ",.    
16020 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
16030 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41  K_IN?"LIST":"SCA
16040 4c 41 52 22 2c 0a 20 20 20 20 20 20 20 20 70 50  LAR",.        pP
16050 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
16060 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tId.    );.    s
16070 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16080 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
16090 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
160a0 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
160b0 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
160c0 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68  #endif..  switch
160d0 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
160e0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
160f0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
16120 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
16130 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
16140 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
16150 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
16160 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66  t; /* the LHS of
16170 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
16180 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   */.      KeyInf
16190 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
161a0 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66        /* Key inf
161b0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
161c0 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20    int nVal;     
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
161e0 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20   Size of vector 
161f0 70 4c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 0a  pLeft */.      .
16200 20 20 20 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c        nVal = sql
16210 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
16220 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  ze(pLeft);.     
16230 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69   assert( !isRowi
16240 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a  d || nVal==1 );.
16250 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
16260 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20  r this is an 'x 
16270 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f  IN(SELECT...)' o
16280 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72  r an 'x IN(<expr
16290 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a  list>)'.      **
162a0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69   expression it i
162b0 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61  s handled the sa
162c0 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65  me way.  An ephe
162d0 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a  meral table is .
162e0 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
162f0 77 69 74 68 20 69 6e 64 65 78 20 6b 65 79 73 20  with index keys 
16300 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
16310 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
16320 65 20 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45  e .      ** SELE
16330 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c  CT or the <exprl
16340 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ist>..      **. 
16350 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27       ** If the '
16360 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  x' expression is
16370 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
16380 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e   or the SELECT..
16390 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ..      ** state
163a0 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
163b0 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
163c0 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
163d0 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
163e0 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
163f0 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
16400 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
16410 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20  'x' and the.    
16420 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73    ** SELECT... s
16430 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
16440 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
16450 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
16460 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  sed.      ** if 
16470 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
16480 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
16490 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
164a0 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20  f neither.      
164b0 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53  ** 'x' nor the S
164c0 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
164d0 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
164e0 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
164f0 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69  inity.      ** i
16500 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  s used..      */
16510 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
16520 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
16530 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64  Tab++;.      add
16540 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
16550 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
16560 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20  Ephemeral, .    
16570 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
16580 62 6c 65 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a  ble, (isRowid?0:
16590 6e 56 61 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b  nVal));.      pK
165a0 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64  eyInfo = isRowid
165b0 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65   ? 0 : sqlite3Ke
165c0 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
165d0 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b  e->db, nVal, 1);
165e0 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ..      if( Expr
165f0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
16600 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
16610 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
16620 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
16630 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
16640 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
16650 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
16660 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
16670 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
16680 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
16690 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
166a0 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
166b0 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
166c0 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
166d0 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
166e0 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70   *pSelect = pExp
166f0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
16700 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
16710 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
16720 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20  ->pEList;..     
16730 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f     assert( !isRo
16740 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  wid );.        /
16750 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61 6e 64  * If the LHS and
16760 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
16770 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d  perator do not m
16780 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20 20 20  atch, that.     
16790 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c     ** error will
167a0 20 68 61 76 65 20 62 65 65 6e 20 63 61 75 67 68   have been caugh
167b0 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77 65  t long before we
167c0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
167d0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  t. */.        if
167e0 28 20 41 4c 57 41 59 53 28 70 45 4c 69 73 74 2d  ( ALWAYS(pEList-
167f0 3e 6e 45 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b  >nExpr==nVal) ){
16800 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
16810 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
16820 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
16830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
16840 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
16850 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78  st, SRT_Set, pEx
16860 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
16870 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66         dest.zAff
16880 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66  Sdst = exprINAff
16890 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45  inity(pParse, pE
168a0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
168b0 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
168c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 0;.          t
168d0 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74  estcase( pSelect
168e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
168f0 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
16900 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16910 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f  pKeyInfo==0 ); /
16920 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20  * Caused by OOM 
16930 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  in sqlite3KeyInf
16940 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20  oAlloc() */.    
16950 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
16960 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
16970 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
16980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
16990 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
169a0 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
169b0 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
169c0 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
169d0 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
169e0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
169f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
16a00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16a10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
16a20 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
16a30 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
16a40 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
16a50 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
16a60 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
16a70 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
16a80 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
16a90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
16aa0 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist!=0 );.      
16ab0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
16ac0 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
16ad0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16ae0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
16af0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
16b00 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
16b10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
16b20 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
16b30 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73       Expr *p = s
16b40 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
16b50 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20  dSubexpr(pLeft, 
16b60 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
16b70 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
16b80 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  i] = sqlite3Bina
16b90 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
16ba0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
16bb0 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c    pParse, p, pEL
16bc0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a  ist->a[i].pExpr.
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
16be0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16bf0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16c00 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
16c10 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29  r->x.pList!=0) )
16c20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
16c30 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
16c40 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
16c50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
16c60 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
16c70 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
16c80 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
16c90 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
16ca0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
16cb0 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
16cc0 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
16cd0 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
16ce0 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
16cf0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
16d00 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
16d10 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
16d20 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
16d30 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
16d40 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
16d50 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
16d60 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
16d70 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
16d80 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
16d90 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66    /* Affinity of
16da0 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
16db0 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  IN */.        in
16dc0 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
16dd0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
16de0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
16df0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
16e00 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
16e10 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  em;.        int 
16e20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20  r1, r2, r3;..   
16e30 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
16e40 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
16e50 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ity(pLeft);.    
16e60 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
16e70 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
16e80 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
16e90 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20  _AFF_BLOB;.     
16ea0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
16eb0 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
16ec0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
16ed0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
16ee0 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
16ef0 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o) );.          
16f00 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
16f10 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  0] = sqlite3Expr
16f20 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
16f30 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
16f40 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
16f50 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
16f60 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
16f70 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e  n in <exprlist>.
16f80 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d   */.        r1 =
16f90 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16fa0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
16fb0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
16fc0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
16fd0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
16fe0 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65  isRowid ) sqlite
16ff0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
17000 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 32 2c 20 30  P_Blob, 0, r2, 0
17010 2c 20 22 22 2c 20 50 34 5f 53 54 41 54 49 43 29  , "", P4_STATIC)
17020 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
17030 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
17040 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
17050 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
17060 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
17070 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
17080 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
17090 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a  int iValToIns;..
170a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
170b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
170c0 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74  s not constant t
170d0 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  hen we will need
170e0 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
170f0 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
17100 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
17110 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
17120 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
17130 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
17140 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
17150 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
17160 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
17170 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
17180 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
17190 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
171a0 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
171b0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
171c0 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66         if( jmpIf
171d0 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73  Dynamic>=0 && !s
171e0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
171f0 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
17200 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17210 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
17220 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  (v, jmpIfDynamic
17230 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
17240 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
17250 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
17260 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
17270 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
17280 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
17290 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
172a0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
172b0 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26     if( isRowid &
172c0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
172d0 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61  nteger(pE2, &iVa
172e0 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20  lToIns) ){.     
172f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17300 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
17310 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d  nsertInt, pExpr-
17320 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61  >iTable, r2, iVa
17330 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20  lToIns);.       
17340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17350 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
17360 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
17370 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31  (pParse, pE2, r1
17380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
17390 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20  f( isRowid ){.  
173a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
173b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
173c0 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
173d0 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
17400 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
17410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  .              V
17420 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
17440 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17450 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45  v, OP_Insert, pE
17460 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
17470 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r3);.          
17480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
174a0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
174b0 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
174c0 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
174d0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
174e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
174f0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
17500 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29  e(pParse, r3, 1)
17510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17520 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17530 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
17540 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
17550 62 6c 65 2c 20 72 32 2c 20 72 33 2c 20 31 29 3b  ble, r2, r3, 1);
17560 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
17570 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17580 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
17590 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
175a0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
175b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
175c0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
175d0 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
175e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65   }.      if( pKe
175f0 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
17600 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
17610 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76  geP4(v, addr, (v
17620 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  oid *)pKeyInfo, 
17630 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
17640 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
17650 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
17660 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
17670 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
17680 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
17690 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a        /* Case 3:
176a0 20 20 20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20      (SELECT ... 
176b0 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20  FROM ...).      
176c0 2a 2a 20 20 20 20 20 6f 72 3a 20 20 20 20 45 58  **     or:    EX
176d0 49 53 54 53 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ISTS(SELECT ... 
176e0 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20 20 20 20  FROM ...).      
176f0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
17700 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72 61  a SELECT, genera
17710 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
17720 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c  he values for al
17730 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20  l columns of.   
17740 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20     ** the first 
17750 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  row into an arra
17760 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61  y of registers a
17770 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e  nd return the in
17780 64 65 78 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  dex of.      ** 
17790 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
177a0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
177b0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
177c0 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74   an EXISTS, writ
177d0 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28  e an integer 0 (
177e0 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31  not exists) or 1
177f0 20 28 65 78 69 73 74 73 29 0a 20 20 20 20 20 20   (exists).      
17800 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
17810 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  er and return th
17820 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  at register numb
17830 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
17840 20 20 20 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61     ** In both ca
17850 73 65 73 2c 20 74 68 65 20 71 75 65 72 79 20 69  ses, the query i
17860 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
17870 20 22 4c 49 4d 49 54 20 31 22 2e 20 20 41 6e 79   "LIMIT 1".  Any
17880 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 65 78   .      ** preex
17890 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73 20  isting limit is 
178a0 64 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c 61  discarded in pla
178b0 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c 49  ce of the new LI
178c0 4d 49 54 20 31 2e 0a 20 20 20 20 20 20 2a 2f 0a  MIT 1..      */.
178d0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
178e0 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
178f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17900 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
17910 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20  to encode */.   
17920 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
17930 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
17940 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
17950 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c  to deal with SEL
17960 45 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ECT result */.  
17970 20 20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20      int nReg;   
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
179a0 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
179b0 74 65 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  te */.      Expr
179c0 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20   *pLimit;       
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179e0 20 20 2f 2a 20 4e 65 77 20 6c 69 6d 69 74 20 65    /* New limit e
179f0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20  xpression */..  
17a00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
17a10 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
17a20 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
17a30 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
17a40 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
17a50 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
17a60 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
17a70 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
17a80 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
17a90 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
17aa0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17ab0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
17ac0 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  ;..      pSel = 
17ad0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
17ae0 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70  ;.      nReg = p
17af0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
17b00 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69  ECT ? pSel->pELi
17b10 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20  st->nExpr : 1;. 
17b20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
17b30 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
17b40 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 0, pParse->nMe
17b50 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  m+1);.      pPar
17b60 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
17b70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
17b80 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
17b90 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74   ){.        dest
17ba0 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d  .eDest = SRT_Mem
17bb0 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69  ;.        dest.i
17bc0 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50  Sdst = dest.iSDP
17bd0 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73  arm;.        des
17be0 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a  t.nSdst = nReg;.
17bf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17c00 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
17c10 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53  Null, 0, dest.iS
17c20 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50  DParm, dest.iSDP
17c30 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20  arm+nReg-1);.   
17c40 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
17c50 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
17c60 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
17c70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17c80 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
17c90 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
17ca0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17cb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
17cc0 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53  eger, 0, dest.iS
17cd0 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  DParm);.        
17ce0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
17cf0 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
17d00 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
17d10 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 73        pLimit = s
17d20 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
17d30 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49  pParse->db, TK_I
17d40 4e 54 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49  NTEGER,&sqlite3I
17d50 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b  ntTokens[1], 0);
17d60 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d  .      if( pSel-
17d70 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
17d80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
17d90 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
17da0 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70   pSel->pLimit->p
17db0 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Left);.        p
17dc0 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65  Sel->pLimit->pLe
17dd0 66 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  ft = pLimit;.   
17de0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17df0 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
17e00 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
17e10 61 72 73 65 2c 20 54 4b 5f 4c 49 4d 49 54 2c 20  arse, TK_LIMIT, 
17e20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20  pLimit, 0);.    
17e30 20 20 7d 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e    }.      pSel->
17e40 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
17e50 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73    pSel->selFlags
17e60 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c   &= ~SF_MultiVal
17e70 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ue;.      if( sq
17e80 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
17e90 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
17ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
17eb0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
17ec0 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e      rReg = dest.
17ed0 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45  iSDParm;.      E
17ee0 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
17ef0 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
17f00 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65  duce);.      bre
17f10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
17f20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61   if( rHasNullFla
17f30 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
17f40 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
17f50 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
17f60 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a   rHasNullFlag);.
17f70 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66    }..  if( jmpIf
17f80 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20  Dynamic>=0 ){.  
17f90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
17fa0 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79  pHere(v, jmpIfDy
17fb0 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71  namic);.  }.  sq
17fc0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
17fd0 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65  p(pParse);..  re
17fe0 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
17ff0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
18000 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
18010 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18020 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
18030 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20 61  ** Expr pIn is a
18040 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73  n IN(...) expres
18050 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  sion. This funct
18060 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20  ion checks that 
18070 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65  the .** sub-sele
18080 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  ct on the RHS of
18090 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74   the IN() operat
180a0 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  or has the same 
180b0 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f  number of .** co
180c0 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63  lumns as the vec
180d0 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
180e0 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f  Or, if the RHS o
180f0 66 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f  f the IN() is no
18100 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72  t .** a sub-quer
18110 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53 20  y, that the LHS 
18120 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73  is a vector of s
18130 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ize 1..*/.int sq
18140 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e  lite3ExprCheckIN
18150 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
18160 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e  Expr *pIn){.  in
18170 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69  t nVector = sqli
18180 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
18190 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20  e(pIn->pLeft);. 
181a0 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73   if( (pIn->flags
181b0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29   & EP_xIsSelect)
181c0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63   ){.    if( nVec
181d0 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c  tor!=pIn->x.pSel
181e0 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
181f0 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  pr ){.      sqli
18200 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
18210 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78  r(pParse, pIn->x
18220 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
18230 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72  ->nExpr, nVector
18240 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18250 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
18260 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20   if( nVector!=1 
18270 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65  ){.    sqlite3Ve
18280 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61  ctorErrorMsg(pPa
18290 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29  rse, pIn->pLeft)
182a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
182b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
182c0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
182d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
182e0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
182f0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
18300 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n IN expression.
18310 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
18320 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
18330 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75        x IN (valu
18340 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a  e, value, ...).*
18350 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61  *.** The left-ha
18360 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73  nd side (LHS) is
18370 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63   a scalar or vec
18380 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  tor expression. 
18390 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   The .** right-h
183a0 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20 69  and side (RHS) i
183b0 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65  s an array of ze
183c0 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61  ro or more scala
183d0 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a  r values, or a.*
183e0 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49 66 20  * subquery.  If 
183f0 74 68 65 20 52 48 53 20 69 73 20 61 20 73 75 62  the RHS is a sub
18400 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65  query, the numbe
18410 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
18420 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63  mns must.** matc
18430 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
18440 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76  columns in the v
18450 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ector on the LHS
18460 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73  .  If the RHS is
18470 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61  .** a list of va
18480 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75  lues, the LHS mu
18490 73 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20  st be a scalar. 
184a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70  .**.** The IN op
184b0 65 72 61 74 6f 72 20 69 73 20 74 72 75 65 20 69  erator is true i
184c0 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20  f the LHS value 
184d0 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  is contained wit
184e0 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20  hin the RHS..** 
184f0 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61  The result is fa
18500 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
18510 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74  s definitely not
18520 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68   in the RHS.  Th
18530 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  e .** result is 
18540 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73  NULL if the pres
18550 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20  ence of the LHS 
18560 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f  in the RHS canno
18570 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69  t be .** determi
18580 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  ned due to NULLs
18590 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
185a0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
185b0 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74  ode that jumps t
185c0 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66  o destIfFalse if
185d0 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
185e0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
185f0 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49  thin the RHS.  I
18600 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77  f due to NULLs w
18610 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
18620 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a  ne if the LHS.**
18630 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
18640 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75   the RHS then ju
18650 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c  mp to destIfNull
18660 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  .  If the LHS is
18670 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69   contained.** wi
18680 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  thin the RHS the
18690 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a  n fall through..
186a0 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65  **.** See the se
186b0 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74  parate in-operat
186c0 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74  or.md documentat
186d0 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ion file in the 
186e0 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c  canonical.** SQL
186f0 69 74 65 20 73 6f 75 72 63 65 20 74 72 65 65 20  ite source tree 
18700 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
18710 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
18720 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
18730 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
18740 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
18750 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
18760 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
18770 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
18780 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
18790 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
187a0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
187b0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
187c0 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
187d0 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
187e0 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
187f0 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
18800 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
18810 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
18820 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
18830 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
18840 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
18850 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
18860 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
18870 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
18880 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
18890 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
188a0 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
188b0 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
188c0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
188d0 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20  t rLhs;         
188e0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28      /* Register(
188f0 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c  s) holding the L
18900 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  HS values */.  i
18910 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20  nt rLhsOrig;    
18920 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75       /* LHS valu
18930 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72  es prior to reor
18940 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b  dering by aiMap[
18950 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ] */.  Vdbe *v; 
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18970 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
18980 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
18990 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30    int *aiMap = 0
189a0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66  ;       /* Map f
189b0 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64  rom vector field
189c0 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   to index column
189d0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66   */.  char *zAff
189e0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41   = 0;       /* A
189f0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66  ffinity string f
18a00 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a  or comparisons *
18a10 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b  /.  int nVector;
18a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
18a30 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72  e of vectors for
18a40 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
18a50 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d  r */.  int iDumm
18a60 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
18a70 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20  Dummy parameter 
18a80 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  to exprCodeVecto
18a90 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  r() */.  Expr *p
18aa0 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Left;          /
18ab0 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * The LHS of the
18ac0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
18ad0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
18ae0 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20          /* loop 
18af0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
18b00 20 64 65 73 74 53 74 65 70 32 3b 20 20 20 20 20   destStep2;     
18b10 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
18b20 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73  ump when NULLs s
18b30 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f  een in step 2 */
18b40 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 36  .  int destStep6
18b50 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72   = 0;    /* Star
18b60 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74  t of code for St
18b70 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ep 6 */.  int ad
18b80 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20  drTruthOp;      
18b90 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70  /* Address of op
18ba0 63 6f 64 65 20 74 68 61 74 20 64 65 74 65 72 6d  code that determ
18bb0 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20 74  ines the IN is t
18bc0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  rue */.  int des
18bd0 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f  tNotNull;      /
18be0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61  * Jump here if a
18bf0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
18c00 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65 70 20  ot true in step 
18c10 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  6 */.  int addrT
18c20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
18c30 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d  Top of the step-
18c40 36 20 6c 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c  6 loop */ ..  pL
18c50 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
18c60 66 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ft;.  if( sqlite
18c70 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61  3ExprCheckIN(pPa
18c80 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65  rse, pExpr) ) re
18c90 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65  turn;.  zAff = e
18ca0 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50  xprINAffinity(pP
18cb0 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
18cc0 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
18cd0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
18ce0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
18cf0 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73   aiMap = (int*)s
18d00 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
18d10 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  ro(.      pParse
18d20 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73  ->db, nVector*(s
18d30 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a  izeof(int) + siz
18d40 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20  eof(char)) + 1. 
18d50 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
18d60 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
18d70 65 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65  ed ) goto sqlite
18d80 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f  3ExprCodeIN_oom_
18d90 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74  error;..  /* Att
18da0 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20  empt to compute 
18db0 74 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74  the RHS. After t
18dc0 68 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79  his step, if any
18dd0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
18de0 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e  .  ** IN_INDEX_N
18df0 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c  OOP is returned,
18e00 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65   the table opene
18e10 64 20 69 74 68 20 63 75 72 73 6f 72 20 70 45 78  d ith cursor pEx
18e20 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a  pr->iTable .  **
18e30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
18e40 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
18e50 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e  p the RHS. If IN
18e60 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
18e70 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68  eturned,.  ** th
18e80 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65  e RHS has not ye
18e90 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a  t been coded.  *
18ea0 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
18eb0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
18ec0 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
18ed0 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
18ee0 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
18ef0 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
18f00 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
18f10 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
18f20 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
18f30 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
18f40 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20  arse, pExpr,.   
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f60 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44            IN_IND
18f70 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20  EX_MEMBERSHIP | 
18f80 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
18f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
18fb0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
18fc0 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52  IfNull ? 0 : &rR
18fd0 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70  hsHasNull, aiMap
18fe0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
18ff0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56  arse->nErr || nV
19000 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70  ector==1 || eTyp
19010 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a  e==IN_INDEX_EPH.
19020 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
19030 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
19040 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e  ASC || eType==IN
19050 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
19060 43 20 0a 20 20 29 3b 0a 23 69 66 64 65 66 20 53  C .  );.#ifdef S
19070 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
19080 20 43 6f 6e 66 69 72 6d 20 74 68 61 74 20 61 69   Confirm that ai
19090 4d 61 70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  Map[] contains n
190a0 56 65 63 74 6f 72 20 69 6e 74 65 67 65 72 20 76  Vector integer v
190b0 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 30 20  alues between 0 
190c0 61 6e 64 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72  and.  ** nVector
190d0 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  -1. */.  for(i=0
190e0 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
190f0 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e  ){.    int j, cn
19100 74 3b 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a  t;.    for(cnt=j
19110 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a  =0; j<nVector; j
19120 2b 2b 29 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d  ++) if( aiMap[j]
19130 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20  ==i ) cnt++;.   
19140 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 31 20   assert( cnt==1 
19150 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
19160 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53   /* Code the LHS
19170 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  , the <expr> fro
19180 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
19190 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20  .)". If the LHS 
191a0 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f  is a .  ** vecto
191b0 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73 74  r, then it is st
191c0 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79  ored in an array
191d0 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69   of nVector regi
191e0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a  sters starting .
191f0 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a    ** at r1..  **
19200 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  .  ** sqlite3Fin
19210 64 49 6e 49 6e 64 65 78 28 29 20 6d 69 67 68 74  dInIndex() might
19220 20 68 61 76 65 20 72 65 6f 72 64 65 72 65 64 20   have reordered 
19230 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  the fields of th
19240 65 20 4c 48 53 20 76 65 63 74 6f 72 0a 20 20 2a  e LHS vector.  *
19250 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 69  * so that the fi
19260 65 6c 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  elds are in the 
19270 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20 61 6e  same order as an
19280 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 2e   existing index.
19290 20 20 20 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61     The.  ** aiMa
192a0 70 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  p[] array contai
192b0 6e 73 20 61 20 6d 61 70 70 69 6e 67 20 66 72 6f  ns a mapping fro
192c0 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c  m the original L
192d0 48 53 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74  HS field order t
192e0 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 65 6c 64  o.  ** the field
192f0 20 6f 72 64 65 72 20 74 68 61 74 20 6d 61 74 63   order that matc
19300 68 65 73 20 74 68 65 20 52 48 53 20 69 6e 64 65  hes the RHS inde
19310 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
19320 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
19330 50 61 72 73 65 29 3b 0a 20 20 72 4c 68 73 4f 72  Parse);.  rLhsOr
19340 69 67 20 3d 20 65 78 70 72 43 6f 64 65 56 65 63  ig = exprCodeVec
19350 74 6f 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  tor(pParse, pLef
19360 74 2c 20 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66  t, &iDummy);.  f
19370 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
19380 72 20 26 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69  r && aiMap[i]==i
19390 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20  ; i++){} /* Are 
193a0 4c 48 53 20 66 69 65 6c 64 73 20 72 65 6f 72 64  LHS fields reord
193b0 65 72 65 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69  ered? */.  if( i
193c0 3d 3d 6e 56 65 63 74 6f 72 20 29 7b 0a 20 20 20  ==nVector ){.   
193d0 20 2f 2a 20 4c 48 53 20 66 69 65 6c 64 73 20 61   /* LHS fields a
193e0 72 65 20 6e 6f 74 20 72 65 6f 72 64 65 72 65 64  re not reordered
193f0 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 72   */.    rLhs = r
19400 4c 68 73 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65  LhsOrig;.  }else
19410 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
19420 20 72 65 6f 72 64 65 72 20 74 68 65 20 4c 48 53   reorder the LHS
19430 20 66 69 65 6c 64 73 20 61 63 63 6f 72 64 69 6e   fields accordin
19440 67 20 74 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20  g to aiMap */.  
19450 20 20 72 4c 68 73 20 3d 20 73 71 6c 69 74 65 33    rLhs = sqlite3
19460 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
19470 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  rse, nVector);. 
19480 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
19490 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
194a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
194b0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
194c0 20 72 4c 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68   rLhsOrig+i, rLh
194d0 73 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a  s+aiMap[i], 0);.
194e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
194f0 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  If sqlite3FindIn
19500 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20  Index() did not 
19510 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
19520 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  n index that is.
19530 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f    ** suitable fo
19540 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65  r evaluating the
19550 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68   IN operator, th
19560 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e  en evaluate usin
19570 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  g a.  ** sequenc
19580 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73  e of comparisons
19590 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
195a0 20 69 73 20 73 74 65 70 20 28 31 29 20 69 6e 20   is step (1) in 
195b0 74 68 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e  the in-operator.
195c0 6d 64 20 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67  md optimized alg
195d0 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69  orithm..  */.  i
195e0 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
195f0 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45  EX_NOOP ){.    E
19600 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
19610 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
19620 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
19630 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
19640 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
19650 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
19660 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20      int labelOk 
19670 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19680 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
19690 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65  nt r2, regToFree
196a0 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e  ;.    int regCkN
196b0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ull = 0;.    int
196c0 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28   ii;.    assert(
196d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
196e0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
196f0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
19700 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  ( destIfNull!=de
19710 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
19720 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73     regCkNull = s
19730 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19740 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19750 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19760 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
19770 72 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43  rLhs, rLhs, regC
19780 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  kNull);.    }.  
19790 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
197a0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  List->nExpr; ii+
197b0 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  +){.      r2 = s
197c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
197d0 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  mp(pParse, pList
197e0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26  ->a[ii].pExpr, &
197f0 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  regToFree);.    
19800 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
19810 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
19820 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61  nBeNull(pList->a
19830 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
19840 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19850 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
19860 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c  itAnd, regCkNull
19870 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  , r2, regCkNull)
19880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19890 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  if( ii<pList->nE
198a0 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e  xpr-1 || destIfN
198b0 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
198c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
198d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
198e0 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61   OP_Eq, rLhs, la
198f0 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20  belOk, r2,.     
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19910 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
19920 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
19930 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
19940 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69  rageIf(v, ii<pLi
19950 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
19960 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
19970 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73  geIf(v, ii==pLis
19980 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
19990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
199a0 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
199b0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
199c0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
199d0 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  t( destIfNull==d
199e0 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20  estIfFalse );.  
199f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19a00 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
19a10 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61  , rLhs, destIfFa
19a20 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lse, r2,.       
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a40 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
19a50 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64   P4_COLLSEQ); Vd
19a60 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19a70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19a80 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
19a90 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a  ff[0] | SQLITE_J
19aa0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
19ab0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
19ac0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19ad0 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65  pParse, regToFre
19ae0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
19af0 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20  ( regCkNull ){. 
19b00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19b10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
19b20 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  ull, regCkNull, 
19b30 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
19b40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19b50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
19b60 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
19b70 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se);.    }.    s
19b80 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19b90 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f  eLabel(v, labelO
19ba0 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  k);.    sqlite3R
19bb0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
19bc0 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  arse, regCkNull)
19bd0 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74  ;.    goto sqlit
19be0 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
19bf0 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ished;.  }..  /*
19c00 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74   Step 2: Check t
19c10 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53  o see if the LHS
19c20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
19c30 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20  LL columns.  If 
19c40 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65  the.  ** LHS doe
19c50 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20  s contain NULLs 
19c60 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
19c70 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46  must be either F
19c80 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20  ALSE or NULL..  
19c90 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20  ** We will then 
19ca0 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20  skip the binary 
19cb0 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48  search of the RH
19cc0 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
19cd0 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
19ce0 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73  False ){.    des
19cf0 74 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46  tStep2 = destIfF
19d00 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  alse;.  }else{. 
19d10 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
19d20 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74  estStep6 = sqlit
19d30 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19d40 76 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  v);.  }.  for(i=
19d50 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
19d60 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
19d70 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
19d80 69 65 6c 64 53 75 62 65 78 70 72 28 70 45 78 70  ieldSubexpr(pExp
19d90 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  r->pLeft, i);.  
19da0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
19db0 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b  rCanBeNull(p) ){
19dc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19dd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19de0 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20 64  sNull, rLhs+i, d
19df0 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20 20  estStep2);.     
19e00 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19e10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
19e20 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65 20 4c  * Step 3.  The L
19e30 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e 20  HS is now known 
19e40 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  to be non-NULL. 
19e50 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73   Do the binary s
19e60 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74 68  earch.  ** of th
19e70 65 20 52 48 53 20 75 73 69 6e 67 20 74 68 65 20  e RHS using the 
19e80 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e 20  LHS as a probe. 
19e90 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 72   If found, the r
19ea0 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74 72  esult is.  ** tr
19eb0 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ue..  */.  if( e
19ec0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
19ed0 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OWID ){.    /* I
19ee0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
19ef0 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49   RHS is the ROWI
19f00 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65  D of table b-tre
19f10 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73 6f  e and so we also
19f20 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68 61  .    ** know tha
19f30 74 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 6e  t the RHS is non
19f40 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 77  -NULL.  Hence, w
19f50 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20  e combine steps 
19f60 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20 69  3 and 4.    ** i
19f70 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  nto a single opc
19f80 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ode. */.    sqli
19f90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19fa0 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70   OP_SeekRowid, p
19fb0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
19fc0 73 74 49 66 46 61 6c 73 65 2c 20 72 4c 68 73 29  stIfFalse, rLhs)
19fd0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
19fe0 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 54  ge(v);.    addrT
19ff0 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33  ruthOp = sqlite3
1a000 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
1a010 5f 47 6f 74 6f 29 3b 20 20 2f 2a 20 52 65 74 75  _Goto);  /* Retu
1a020 72 6e 20 54 72 75 65 20 2a 2f 0a 20 20 7d 65 6c  rn True */.  }el
1a030 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
1a040 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1a050 41 66 66 69 6e 69 74 79 2c 20 72 4c 68 73 2c 20  Affinity, rLhs, 
1a060 6e 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66  nVector, 0, zAff
1a070 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
1a080 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65 3d  if( destIfFalse=
1a090 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20  =destIfNull ){. 
1a0a0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20       /* Combine 
1a0b0 53 74 65 70 20 33 20 61 6e 64 20 53 74 65 70 20  Step 3 and Step 
1a0c0 35 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  5 into a single 
1a0d0 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  opcode */.      
1a0e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a0f0 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
1a100 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
1a110 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
1a120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a130 20 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73              rLhs
1a140 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65  , nVector); Vdbe
1a150 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a160 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45     goto sqlite3E
1a170 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1a180 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
1a190 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20 33   Ordinary Step 3
1a1a0 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  , for the case w
1a1b0 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e  here FALSE and N
1a1c0 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74  ULL are distinct
1a1d0 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74   */.    addrTrut
1a1e0 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  hOp = sqlite3Vdb
1a1f0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
1a200 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
1a210 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20  Table, 0,.      
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a240 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20  rLhs, nVector); 
1a250 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a260 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
1a270 34 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69  4.  If the RHS i
1a280 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f  s known to be no
1a290 6e 2d 4e 55 4c 4c 20 61 6e 64 20 77 65 20 64 69  n-NULL and we di
1a2a0 64 20 6e 6f 74 20 66 69 6e 64 0a 20 20 2a 2a 20  d not find.  ** 
1a2b0 61 6e 20 6d 61 74 63 68 20 6f 6e 20 74 68 65 20  an match on the 
1a2c0 73 65 61 72 63 68 20 61 62 6f 76 65 2c 20 74 68  search above, th
1a2d0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
1a2e0 73 74 20 62 65 20 46 41 4c 53 45 2e 0a 20 20 2a  st be FALSE..  *
1a2f0 2f 0a 20 20 69 66 28 20 72 52 68 73 48 61 73 4e  /.  if( rRhsHasN
1a300 75 6c 6c 20 26 26 20 6e 56 65 63 74 6f 72 3d 3d  ull && nVector==
1a310 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1a320 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a330 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61  _NotNull, rRhsHa
1a340 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c  sNull, destIfFal
1a350 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  se);.    VdbeCov
1a360 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
1a370 20 2f 2a 20 53 74 65 70 20 35 2e 20 20 49 66 20   /* Step 5.  If 
1a380 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
1a390 62 6f 75 74 20 74 68 65 20 64 69 66 66 65 72 65  bout the differe
1a3a0 6e 63 65 20 62 65 74 77 65 65 6e 20 4e 55 4c 4c  nce between NULL
1a3b0 20 61 6e 64 0a 20 20 2a 2a 20 46 41 4c 53 45 2c   and.  ** FALSE,
1a3c0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
1a3d0 6e 20 66 61 6c 73 65 2e 20 0a 20 20 2a 2f 0a 20  n false. .  */. 
1a3e0 20 69 66 28 20 64 65 73 74 49 66 46 61 6c 73 65   if( destIfFalse
1a3f0 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 20 73  ==destIfNull ) s
1a400 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1a410 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
1a420 0a 20 20 2f 2a 20 53 74 65 70 20 36 3a 20 4c 6f  .  /* Step 6: Lo
1a430 6f 70 20 74 68 72 6f 75 67 68 20 72 6f 77 73 20  op through rows 
1a440 6f 66 20 74 68 65 20 52 48 53 2e 20 20 43 6f 6d  of the RHS.  Com
1a450 70 61 72 65 20 65 61 63 68 20 72 6f 77 20 74 6f  pare each row to
1a460 20 74 68 65 20 4c 48 53 2e 0a 20 20 2a 2a 20 49   the LHS..  ** I
1a470 66 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e  f any comparison
1a480 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
1a490 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
1a4a0 4c 2e 20 20 49 66 20 61 6c 6c 0a 20 20 2a 2a 20  L.  If all.  ** 
1a4b0 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20  comparisons are 
1a4c0 46 41 4c 53 45 20 74 68 65 6e 20 74 68 65 20 66  FALSE then the f
1a4d0 69 6e 61 6c 20 72 65 73 75 6c 74 20 69 73 20 46  inal result is F
1a4e0 41 4c 53 45 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ALSE..  **.  ** 
1a4f0 46 6f 72 20 61 20 73 63 61 6c 61 72 20 4c 48 53  For a scalar LHS
1a500 2c 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  , it is sufficie
1a510 6e 74 20 74 6f 20 63 68 65 63 6b 20 6a 75 73 74  nt to check just
1a520 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a 20   the first row. 
1a530 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 2e 0a   ** of the RHS..
1a540 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 53    */.  if( destS
1a550 74 65 70 36 20 29 20 73 71 6c 69 74 65 33 56 64  tep6 ) sqlite3Vd
1a560 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a570 2c 20 64 65 73 74 53 74 65 70 36 29 3b 0a 20 20  , destStep6);.  
1a580 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
1a590 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a5a0 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d  P_Rewind, pExpr-
1a5b0 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
1a5c0 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76  alse);.  VdbeCov
1a5d0 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
1a5e0 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
1a5f0 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73   destNotNull = s
1a600 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1a610 62 65 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  bel(v);.  }else{
1a620 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56 65 63  .    /* For nVec
1a630 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e 65 20  tor==1, combine 
1a640 73 74 65 70 73 20 36 20 61 6e 64 20 37 20 62 79  steps 6 and 7 by
1a650 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
1a660 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 46 41  urning.    ** FA
1a670 4c 53 45 20 69 66 20 74 68 65 20 66 69 72 73 74  LSE if the first
1a680 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e   comparison is n
1a690 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 64  ot NULL */.    d
1a6a0 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64 65 73  estNotNull = des
1a6b0 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a 20 20  tIfFalse;.  }.  
1a6c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
1a6d0 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  or; i++){.    Ex
1a6e0 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c 6c 53  pr *p;.    CollS
1a6f0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69  eq *pColl;.    i
1a700 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47  nt r3 = sqlite3G
1a710 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1a720 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
1a730 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62  e3VectorFieldSub
1a740 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a  expr(pLeft, i);.
1a750 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1a760 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1a770 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 73  Parse, p);.    s
1a780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a790 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
1a7a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 2c  Expr->iTable, i,
1a7b0 20 72 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   r3);.    sqlite
1a7c0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1a7d0 50 5f 4e 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65  P_Ne, rLhs+i, de
1a7e0 73 74 4e 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20  stNotNull, r3,. 
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a800 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
1a810 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1a820 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a830 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1a840 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1a850 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a  Parse, r3);.  }.
1a860 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a870 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1a880 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  0, destIfNull);.
1a890 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
1a8a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1a8b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a8c0 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a  , destNotNull);.
1a8d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a8e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
1a8f0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1a900 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20   addrTop+1);.   
1a910 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a920 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37  ;..    /* Step 7
1a930 3a 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74  :  If we reach t
1a940 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
1a950 6f 77 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ow that the resu
1a960 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  lt must.    ** b
1a970 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20  e false. */.    
1a980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a990 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1a9a0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1a9b0 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68   }..  /* Jumps h
1a9c0 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ere in order to 
1a9d0 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a  return true. */.
1a9e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1a9f0 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 72 75  pHere(v, addrTru
1aa00 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45  thOp);..sqlite3E
1aa10 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1aa20 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d  ed:.  if( rLhs!=
1aa30 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74  rLhsOrig ) sqlit
1aa40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1aa50 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a  (pParse, rLhs);.
1aa60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1aa70 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1aa80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1aa90 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29   "end IN expr"))
1aaa0 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ;.sqlite3ExprCod
1aab0 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a 20  eIN_oom_error:. 
1aac0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1aad0 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70  Parse->db, aiMap
1aae0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1aaf0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
1ab00 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Aff);.}.#endif /
1ab10 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
1ab20 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
1ab30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1ab40 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
1ab50 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
1ab60 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1ab70 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
1ab80 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
1ab90 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
1aba0 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
1abb0 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
1abc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
1abd0 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
1abe0 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
1abf0 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
1ac00 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
1ac10 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
1ac20 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
1ac30 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
1ac40 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
1ac50 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
1ac60 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
1ac70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ac80 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
1ac90 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
1aca0 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
1acb0 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
1acc0 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
1acd0 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
1ace0 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  ue;.    sqlite3A
1acf0 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
1ad00 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1ad10 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
1ad20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
1ad30 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
1ad40 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
1ad50 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
1ad60 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
1ad70 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
1ad80 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
1ad90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ada0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52  dOp4Dup8(v, OP_R
1adb0 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
1adc0 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
1add0 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _REAL);.  }.}.#e
1ade0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ndif.../*.** Gen
1adf0 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
1ae00 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
1ae10 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
1ae20 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
1ae30 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  xt z[0..n-1] int
1ae40 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
1ae50 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54  .**.** Expr.u.zT
1ae60 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55  oken is always U
1ae70 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72  TF8 and zero-ter
1ae80 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  minated..*/.stat
1ae90 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
1aea0 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
1aeb0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1aec0 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
1aed0 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a   iMem){.  Vdbe *
1aee0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1aef0 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  e;.  if( pExpr->
1af00 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
1af10 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
1af20 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
1af30 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
1af40 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
1af50 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
1af60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1af70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1af80 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
1af90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1afa0 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c  t c;.    i64 val
1afb0 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ue;.    const ch
1afc0 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ar *z = pExpr->u
1afd0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73  .zToken;.    ass
1afe0 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20  ert( z!=0 );.   
1aff0 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f   c = sqlite3DecO
1b000 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61  rHexToI64(z, &va
1b010 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 28 63  lue);.    if( (c
1b020 3d 3d 33 20 26 26 20 21 6e 65 67 46 6c 61 67 29  ==3 && !negFlag)
1b030 20 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28 6e   || (c==2) || (n
1b040 65 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65 3d  egFlag && value=
1b050 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29  =SMALLEST_INT64)
1b060 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1b070 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1b080 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74  OINT.      sqlit
1b090 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b0a0 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e  e, "oversized in
1b0b0 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65  teger: %s%s", ne
1b0c0 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22  gFlag ? "-" : ""
1b0d0 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e  , z);.#else.#ifn
1b0e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b0f0 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20  HEX_INTEGER.    
1b100 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1b110 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29  rnicmp(z,"0x",2)
1b120 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1b130 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b140 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65  Parse, "hex lite
1b150 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 25  ral too big: %s%
1b160 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22 3a  s", negFlag?"-":
1b170 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  "",z);.      }el
1b180 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
1b190 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  {.        codeRe
1b1a0 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67  al(v, z, negFlag
1b1b0 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d  , iMem);.      }
1b1c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
1b1d0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  e{.      if( neg
1b1e0 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
1b1f0 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==3 ? SMALLEST_
1b200 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
1b210 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1b220 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
1b230 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
1b240 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c  em, 0, (u8*)&val
1b250 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  ue, P4_INT64);. 
1b260 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1b270 2a 20 45 72 61 73 65 20 63 6f 6c 75 6d 6e 2d 63  * Erase column-c
1b280 61 63 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65  ache entry numbe
1b290 72 20 69 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  r i.*/.static vo
1b2a0 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65  id cacheEntryCle
1b2b0 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
1b2c0 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20  , int i){.  if( 
1b2d0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1b2e0 65 5b 69 5d 2e 74 65 6d 70 52 65 67 20 29 7b 0a  e[i].tempReg ){.
1b2f0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1b300 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
1b310 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
1b320 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50  Reg) ){.      pP
1b330 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
1b340 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
1b350 2b 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  +] = pParse->aCo
1b360 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a  lCache[i].iReg;.
1b370 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
1b380 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b  se->nColCache--;
1b390 0a 20 20 69 66 28 20 69 3c 70 50 61 72 73 65 2d  .  if( i<pParse-
1b3a0 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20  >nColCache ){.  
1b3b0 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61    pParse->aColCa
1b3c0 63 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d  che[i] = pParse-
1b3d0 3e 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73  >aColCache[pPars
1b3e0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20  e->nColCache];. 
1b3f0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   }.}.../*.** Rec
1b400 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ord in the colum
1b410 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70  n cache that a p
1b420 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e  articular column
1b430 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69   from a.** parti
1b440 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73  cular table is s
1b450 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69  tored in a parti
1b460 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a  cular register..
1b470 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1b480 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61  xprCacheStore(Pa
1b490 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1b4a0 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c   iTab, int iCol,
1b4b0 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
1b4c0 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72  t i;.  int minLr
1b4d0 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b  u;.  int idxLru;
1b4e0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1b4f0 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e  che *p;..  /* Un
1b500 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61  less an error ha
1b510 73 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69  s occurred, regi
1b520 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65  ster numbers are
1b530 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65   always positive
1b540 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  . */.  assert( i
1b550 52 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d  Reg>0 || pParse-
1b560 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
1b570 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1b580 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  d );.  assert( i
1b590 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c  Col>=-1 && iCol<
1b5a0 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e  32768 );  /* Fin
1b5b0 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ite column numbe
1b5c0 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  rs */..  /* The 
1b5d0 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
1b5e0 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73  he flag disables
1b5f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1b600 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
1b610 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  .  ** for testin
1b620 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69  g only - to veri
1b630 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61  fy that SQLite a
1b640 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73  lways gets the s
1b650 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20  ame answer.  ** 
1b660 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74  with and without
1b670 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1b680 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70  e..  */.  if( Op
1b690 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1b6a0 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
1b6b0 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
1b6c0 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  e) ) return;..  
1b6d0 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65  /* First replace
1b6e0 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e   any existing en
1b6f0 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  try..  **.  ** A
1b700 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79  ctually, the way
1b710 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1b720 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
1b730 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72  sed, we are guar
1b740 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74  anteed.  ** that
1b750 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c   the object will
1b760 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62   never already b
1b770 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72  e in cache.  Ver
1b780 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74  ify this guarant
1b790 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ee..  */.#ifndef
1b7a0 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d   NDEBUG.  for(i=
1b7b0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
1b7c0 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
1b7d0 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
1b7e0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  , p++){.    asse
1b7f0 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69  rt( p->iTable!=i
1b800 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d  Tab || p->iColum
1b810 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23  n!=iCol );.  }.#
1b820 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
1b830 68 65 20 63 61 63 68 65 20 69 73 20 61 6c 72 65  he cache is alre
1b840 61 64 79 20 66 75 6c 6c 2c 20 64 65 6c 65 74 65  ady full, delete
1b850 20 74 68 65 20 6c 65 61 73 74 20 72 65 63 65 6e   the least recen
1b860 74 6c 79 20 75 73 65 64 20 65 6e 74 72 79 20 2a  tly used entry *
1b870 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
1b880 6e 43 6f 6c 43 61 63 68 65 3e 3d 53 51 4c 49 54  nColCache>=SQLIT
1b890 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 20 29 7b 0a  E_N_COLCACHE ){.
1b8a0 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37      minLru = 0x7
1b8b0 66 66 66 66 66 66 66 3b 0a 20 20 20 20 69 64 78  fffffff;.    idx
1b8c0 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f  Lru = -1;.    fo
1b8d0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
1b8e0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
1b8f0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
1b900 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
1b910 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e    if( p->lru<min
1b920 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Lru ){.        i
1b930 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
1b940 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c     minLru = p->l
1b950 72 75 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ru;.      }.    
1b960 7d 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  }.    p = &pPars
1b970 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78  e->aColCache[idx
1b980 4c 72 75 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Lru];.  }else{. 
1b990 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
1b9a0 61 43 6f 6c 43 61 63 68 65 5b 70 50 61 72 73 65  aColCache[pParse
1b9b0 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 5d 3b 0a  ->nColCache++];.
1b9c0 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
1b9d0 65 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74  e new entry to t
1b9e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 61  he end of the ca
1b9f0 63 68 65 20 2a 2f 0a 20 20 70 2d 3e 69 4c 65 76  che */.  p->iLev
1ba00 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
1ba10 63 68 65 4c 65 76 65 6c 3b 0a 20 20 70 2d 3e 69  cheLevel;.  p->i
1ba20 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
1ba30 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
1ba40 6c 3b 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20 69  l;.  p->iReg = i
1ba50 52 65 67 3b 0a 20 20 70 2d 3e 74 65 6d 70 52 65  Reg;.  p->tempRe
1ba60 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 6c 72 75 20  g = 0;.  p->lru 
1ba70 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1ba80 43 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cnt++;.}../*.** 
1ba90 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65  Indicate that re
1baa0 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20  gisters between 
1bab0 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d  iReg..iReg+nReg-
1bac0 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72  1 are being over
1bad0 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67  written..** Purg
1bae0 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72  e the range of r
1baf0 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68  egisters from th
1bb00 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
1bb10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1bb20 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50  xprCacheRemove(P
1bb30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1bb40 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
1bb50 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  ){.  int i = 0;.
1bb60 20 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73    while( i<pPars
1bb70 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b 0a  e->nColCache ){.
1bb80 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
1bb90 61 63 68 65 20 2a 70 20 3d 20 26 70 50 61 72 73  ache *p = &pPars
1bba0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b  e->aColCache[i];
1bbb0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
1bbc0 20 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69   >= iReg && p->i
1bbd0 52 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20  Reg < iReg+nReg 
1bbe0 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
1bbf0 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
1bc00 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   i);.    }else{.
1bc10 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
1bc20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
1bc30 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65  member the curre
1bc40 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  nt column cache 
1bc50 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65  context.  Any ne
1bc60 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a  w entries added.
1bc70 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
1bc80 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74  column cache aft
1bc90 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65  er this call are
1bca0 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68   removed when th
1bcb0 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
1bcc0 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a  ng pop occurs..*
1bcd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1bce0 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73  prCachePush(Pars
1bcf0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
1bd00 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1bd10 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  l++;.#ifdef SQLI
1bd20 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1bd30 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
1bd40 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
1bd50 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
1bd60 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20  printf("PUSH to 
1bd70 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69  %d\n", pParse->i
1bd80 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d  CacheLevel);.  }
1bd90 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
1bda0 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65   Remove from the
1bdb0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e   column cache an
1bdc0 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77  y entries that w
1bdd0 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20  ere added since 
1bde0 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69  the.** the previ
1bdf0 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43  ous sqlite3ExprC
1be00 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69  achePush operati
1be10 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
1be20 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20  rds, restore.** 
1be30 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65  the cache to the
1be40 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
1be50 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20   prior the most 
1be60 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a  recent Push..*/.
1be70 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1be80 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a  CachePop(Parse *
1be90 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
1bea0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1beb0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1bec0 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72  vel>=1 );.  pPar
1bed0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d  se->iCacheLevel-
1bee0 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  -;.#ifdef SQLITE
1bef0 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1bf00 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
1bf10 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
1bf20 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
1bf30 69 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64  intf("POP  to %d
1bf40 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61  \n", pParse->iCa
1bf50 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23  cheLevel);.  }.#
1bf60 65 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 20 69  endif.  while( i
1bf70 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1bf80 68 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  he ){.    if( pP
1bf90 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1bfa0 69 5d 2e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  i].iLevel>pParse
1bfb0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
1bfc0 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
1bfd0 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 69  yClear(pParse, i
1bfe0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1bff0 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20      i++;.    }. 
1c000 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
1c010 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
1c020 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
1c030 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
1c040 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
1c050 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
1c060 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
1c070 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
1c080 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
1c090 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
1c0a0 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
1c0b0 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
1c0c0 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
1c0d0 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
1c0e0 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
1c0f0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1c100 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
1c110 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1c120 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
1c130 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1c140 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
1c150 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1c160 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
1c170 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1c180 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
1c190 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
1c1a0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
1c1b0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
1c1c0 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74   }.}../* Generat
1c1d0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1c1e0 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73   load into regis
1c1f0 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c  ter regOut a val
1c200 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70  ue that is.** ap
1c210 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
1c220 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c  e iIdxCol-th col
1c230 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
1c240 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
1c250 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e  e3ExprCodeLoadIn
1c260 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  dexColumn(.  Par
1c270 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20  se *pParse,  /* 
1c280 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1c290 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
1c2a0 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20  pIdx,    /* The 
1c2b0 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75  index whose colu
1c2c0 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64  mn is to be load
1c2d0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
1c2e0 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f  Cur,    /* Curso
1c2f0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  r pointing to a 
1c300 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69  table row */.  i
1c310 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f  nt iIdxCol,    /
1c320 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  * The column of 
1c330 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  the index to be 
1c340 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
1c350 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53  regOut      /* S
1c360 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63  tore the index c
1c370 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74  olumn value in t
1c380 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1c390 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c  ){.  i16 iTabCol
1c3a0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
1c3b0 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66  n[iIdxCol];.  if
1c3c0 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58  ( iTabCol==XN_EX
1c3d0 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  PR ){.    assert
1c3e0 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
1c3f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1c400 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1c410 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b  nExpr>iIdxCol );
1c420 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65  .    pParse->iSe
1c430 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 20  lfTab = iTabCur 
1c440 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  + 1;.    sqlite3
1c450 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61  ExprCodeCopy(pPa
1c460 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45  rse, pIdx->aColE
1c470 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e  xpr->a[iIdxCol].
1c480 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a  pExpr, regOut);.
1c490 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
1c4a0 66 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  fTab = 0;.  }els
1c4b0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1c4c0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
1c4d0 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70  fTable(pParse->p
1c4e0 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62  Vdbe, pIdx->pTab
1c4f0 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20  le, iTabCur,.   
1c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c520 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74   iTabCol, regOut
1c530 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1c540 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1c550 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   extract the val
1c560 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74  ue of the iCol-t
1c570 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  h column of a ta
1c580 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
1c590 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1c5a0 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20  olumnOfTable(.  
1c5b0 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
1c5c0 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65  /* The VDBE unde
1c5d0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1c5e0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
1c5f0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1c600 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1c610 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
1c620 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68  TabCur,    /* Th
1c630 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20  e table cursor. 
1c640 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f   Or the PK curso
1c650 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  r for WITHOUT RO
1c660 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  WID */.  int iCo
1c670 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  l,       /* Inde
1c680 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
1c690 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20  to extract */.  
1c6a0 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
1c6b0 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
1c6c0 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72  alue into this r
1c6d0 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1c6e0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
1c6f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c700 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1c710 6e 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c  n, iTabCur, iCol
1c720 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 72  , regOut);.    r
1c730 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
1c740 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d   iCol<0 || iCol=
1c750 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
1c760 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c770 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
1c780 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f  d, iTabCur, regO
1c790 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
1c7a0 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
1c7b0 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
1c7c0 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
1c7d0 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  umn;.    int x =
1c7e0 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21   iCol;.    if( !
1c7f0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
1c800 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
1c810 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20  b) ){.      x = 
1c820 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
1c830 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d  ndex(sqlite3Prim
1c840 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
1c850 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  ), iCol);.    }.
1c860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c870 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61  ddOp3(v, op, iTa
1c880 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29  bCur, x, regOut)
1c890 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
1c8a0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
1c8b0 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28  e3ColumnDefault(
1c8c0 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72  v, pTab, iCol, r
1c8d0 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  egOut);.  }.}../
1c8e0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1c8f0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  de that will ext
1c900 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e  ract the iColumn
1c910 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a  -th column from.
1c920 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  ** table pTab an
1c930 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  d store the colu
1c940 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65  mn value in a re
1c950 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41  gister. .**.** A
1c960 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
1c970 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
1c980 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
1c990 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68  gister iReg.  Th
1c9a0 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72  is.** is not gar
1c9b0 61 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74 43  anteeed for GetC
1c9c0 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65  olumn() - the re
1c9d0 73 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72  sult can be stor
1c9e0 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67  ed in.** any reg
1c9f0 69 73 74 65 72 2e 20 20 42 75 74 20 74 68 65 20  ister.  But the 
1ca00 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e  result is guaran
1ca10 74 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20  teed to land in 
1ca20 72 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a  register iReg.**
1ca30 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f   for GetColumnTo
1ca40 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Reg()..**.** The
1ca50 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
1ca60 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61  en cursor to pTa
1ca70 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e  b in iTable when
1ca80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1ca90 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20   is called.  If 
1caa0 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63  iColumn<0 then c
1cab0 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
1cac0 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
1cad0 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  he rowid..*/.int
1cae0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1caf0 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  GetColumn(.  Par
1cb00 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
1cb10 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1cb20 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1cb30 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1cb40 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
1cb50 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1cb60 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
1cb70 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
1cb80 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
1cb90 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1cba0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
1cbb0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1cbc0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1cbd0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
1cbe0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1cbf0 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a   iReg,        /*
1cc00 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
1cc10 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  ere */.  u8 p5  
1cc20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20            /* P5 
1cc30 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c  value for OP_Col
1cc40 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29  umn + FLAGS */.)
1cc50 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1cc60 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1cc70 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1cc80 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
1cc90 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
1cca0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
1ccb0 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
1ccc0 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  e; i++, p++){.  
1ccd0 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d    if( p->iTable=
1cce0 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43  =iTable && p->iC
1ccf0 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
1cd00 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d  {.      p->lru =
1cd10 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
1cd20 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
1cd30 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52  te3ExprCachePinR
1cd40 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
1cd50 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20  p->iReg);.      
1cd60 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a  return p->iReg;.
1cd70 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73      }.  }  .  as
1cd80 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
1cd90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1cda0 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
1cdb0 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c  v, pTab, iTable,
1cdc0 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
1cdd0 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20  .  if( p5 ){.   
1cde0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1cdf0 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d  geP5(v, p5);.  }
1ce00 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c  else{   .    sql
1ce10 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1ce20 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c  re(pParse, iTabl
1ce30 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
1ce40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ce50 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  iReg;.}.void sql
1ce60 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1ce70 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61  olumnToReg(.  Pa
1ce80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
1ce90 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1cea0 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1ceb0 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
1cec0 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
1ced0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1cee0 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
1cef0 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
1cf00 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
1cf10 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1cf20 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
1cf30 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1cf40 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1cf50 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
1cf60 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
1cf70 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20 2f  t iReg         /
1cf80 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
1cf90 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1cfa0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1cfb0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
1cfc0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f  Parse, pTab, iCo
1cfd0 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52  lumn, iTable, iR
1cfe0 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31  eg, 0);.  if( r1
1cff0 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65 33  !=iReg ) sqlite3
1d000 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
1d010 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
1d020 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d  py, r1, iReg);.}
1d030 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  .../*.** Clear a
1d040 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  ll column cache 
1d050 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64  entries..*/.void
1d060 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1d070 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  eClear(Parse *pP
1d080 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
1d090 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1d0a0 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
1d0b0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1d0c0 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
1d0d0 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
1d0e0 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20  tf("CLEAR\n");. 
1d0f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
1d100 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
1d110 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a  ColCache; i++){.
1d120 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1d130 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 74 65 6d  aColCache[i].tem
1d140 70 52 65 67 0a 20 20 20 20 20 26 26 20 70 50 61  pReg.     && pPa
1d150 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
1d160 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
1d170 61 54 65 6d 70 52 65 67 29 0a 20 20 20 20 29 7b  aTempReg).    ){
1d180 0a 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  .       pParse->
1d190 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
1d1a0 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
1d1b0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1d1c0 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 7d 0a  [i].iReg;.    }.
1d1d0 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43    }.  pParse->nC
1d1e0 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a  olCache = 0;.}..
1d1f0 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
1d200 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66   fact that an af
1d210 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61  finity change ha
1d220 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43  s occurred on iC
1d230 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  ount.** register
1d240 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
1d250 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20  iStart..*/.void 
1d260 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1d270 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50  AffinityChange(P
1d280 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1d290 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43  t iStart, int iC
1d2a0 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  ount){.  sqlite3
1d2b0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1d2c0 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20  pParse, iStart, 
1d2d0 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCount);.}../*.*
1d2e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d2f0 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
1d300 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
1d310 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
1d320 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
1d330 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20  To..iTo+nReg-1. 
1d340 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Keep the column 
1d350 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65  cache up-to-date
1d360 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d370 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
1d380 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1d390 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
1d3a0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73   int nReg){.  as
1d3b0 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f  sert( iFrom>=iTo
1d3c0 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e  +nReg || iFrom+n
1d3d0 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71  Reg<=iTo );.  sq
1d3e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d3f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1d400 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
1d410 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c  To, nReg);.  sql
1d420 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
1d430 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f  ove(pParse, iFro
1d440 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66  m, nReg);.}..#if
1d450 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1d460 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1d470 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  d(SQLITE_COVERAG
1d480 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1d490 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79  turn true if any
1d4a0 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
1d4b0 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54   range iFrom..iT
1d4c0 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a  o (inclusive).**
1d4d0 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
1d4e0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   of the column c
1d4f0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
1d500 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1d510 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
1d520 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20   and testcase() 
1d530 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61  macros only.** a
1d540 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  nd does not appe
1d550 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62  ar in a normal b
1d560 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
1d570 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  int usedAsColumn
1d580 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
1d590 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
1d5a0 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20  int iTo){.  int 
1d5b0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
1d5c0 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
1d5d0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
1d5e0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72  ColCache; i<pPar
1d5f0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1d600 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
1d610 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t r = p->iReg;. 
1d620 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20     if( r>=iFrom 
1d630 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75  && r<=iTo ) retu
1d640 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45  rn 1;    /*NO_TE
1d650 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ST*/.  }.  retur
1d660 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
1d670 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c   SQLITE_DEBUG ||
1d680 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45   SQLITE_COVERAGE
1d690 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  _TEST */.../*.**
1d6a0 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61   Convert a scala
1d6b0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  r expression nod
1d6c0 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  e to a TK_REGIST
1d6d0 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a  ER referencing.*
1d6e0 2a 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  * register iReg.
1d6f0 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73    The caller mus
1d700 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 52  t ensure that iR
1d710 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  eg already conta
1d720 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ins.** the corre
1d730 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  ct value for the
1d740 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
1d750 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
1d760 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72 20  ToRegister(Expr 
1d770 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  *p, int iReg){. 
1d780 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b   p->op2 = p->op;
1d790 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  .  p->op = TK_RE
1d7a0 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61  GISTER;.  p->iTa
1d7b0 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78  ble = iReg;.  Ex
1d7c0 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
1d7d0 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a  p, EP_Skip);.}..
1d7e0 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61  /*.** Evaluate a
1d7f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69  n expression (ei
1d800 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72  ther a vector or
1d810 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
1d820 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a  sion) and store.
1d830 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  ** the result in
1d840 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d   continguous tem
1d850 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
1d860 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1d870 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  dex of.** the fi
1d880 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73 65  rst register use
1d890 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  d to store the r
1d8a0 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  esult..**.** If 
1d8b0 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73  the returned res
1d8c0 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
1d8d0 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c  a temporary scal
1d8e0 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  ar, then also wr
1d8f0 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69  ite.** that regi
1d900 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f  ster number into
1d910 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49   *piFreeable.  I
1d920 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1d930 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a  esult register.*
1d940 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  * is not a tempo
1d950 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20 65  rary or if the e
1d960 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
1d970 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65  ector set *piFre
1d980 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a  eable.** to 0..*
1d990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
1d9a0 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
1d9b0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1d9c0 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61  *p, int *piFreea
1d9d0 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73  ble){.  int iRes
1d9e0 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75  ult;.  int nResu
1d9f0 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
1da00 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20  VectorSize(p);. 
1da10 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20   if( nResult==1 
1da20 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d  ){.    iResult =
1da30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1da40 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Temp(pParse, p, 
1da50 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d  piFreeable);.  }
1da60 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65  else{.    *piFre
1da70 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69  eable = 0;.    i
1da80 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  f( p->op==TK_SEL
1da90 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ECT ){.#if SQLIT
1daa0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1dab0 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20        iResult = 
1dac0 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  0;.#else.      i
1dad0 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
1dae0 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
1daf0 61 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  arse, p, 0, 0);.
1db00 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1db10 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1db20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70       iResult = p
1db30 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1db40 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
1db50 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20  m += nResult;.  
1db60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1db70 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20  Result; i++){.  
1db80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1db90 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
1dba0 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69  pParse, p->x.pLi
1dbb0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1dbc0 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  i+iResult);.    
1dbd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1dbe0 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a  return iResult;.
1dbf0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1dc00 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
1dc10 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
1dc20 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
1dc30 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1dc40 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
1dc50 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1dc60 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
1dc70 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1dc80 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1dc90 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1dca0 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1dcb0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1dcc0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1dcd0 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1dce0 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1dcf0 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1dd00 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1dd10 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1dd20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1dd30 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1dd40 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1dd50 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1dd60 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1dd70 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1dd80 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1dd90 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1dda0 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1ddb0 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1ddc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ddd0 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1dde0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1ddf0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1de00 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1de10 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1de20 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1de30 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1de40 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1de50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1de60 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1de70 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1de80 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1de90 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1dea0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1deb0 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1dec0 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1ded0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1dee0 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1def0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1df00 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1df10 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1df20 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1df30 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1df40 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1df50 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1df60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1df70 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1df80 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20  mbers */.  Expr 
1df90 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20  tempX;          
1dfa0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
1dfb0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  y expression nod
1dfc0 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20  e */.  int p5 = 
1dfd0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  0;..  assert( ta
1dfe0 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
1dff0 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
1e000 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
1e010 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1e020 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1e030 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
1e040 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
1e050 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
1e060 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
1e070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
1e080 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
1e090 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1e0a0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1e0b0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1e0c0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1e0d0 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
1e0e0 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
1e0f0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1e100 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
1e110 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
1e120 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
1e130 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
1e140 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
1e150 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
1e160 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  m>0 );.        r
1e170 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d 65 6d  eturn pCol->iMem
1e180 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1e190 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
1e1a0 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
1e1b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e1c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1e1d0 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
1e1e0 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20  ortingIdxPTab,. 
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1e210 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
1e220 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e230 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e250 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  /* Otherwise, fa
1e260 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
1e270 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20   TK_COLUMN case 
1e280 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
1e290 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
1e2a0 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20       int iTab = 
1e2b0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
1e2c0 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20       if( iTab<0 
1e2d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1e2e0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3c  Parse->iSelfTab<
1e2f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1e300 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1e310 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1e320 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1e330 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1e340 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1e350 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  rn pExpr->iColum
1e360 6e 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  n - pParse->iSel
1e370 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 65  fTab;.        }e
1e380 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1e390 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1e3a0 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1e3b0 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1e3c0 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1e3d0 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1e3e0 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1e3f0 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1e400 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1e410 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1e420 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1e430 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1e440 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 1;.        }. 
1e450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1e460 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
1e470 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1e480 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  rse, pExpr->pTab
1e490 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4b0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1e4c0 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20   iTab, target,. 
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1e4f0 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d  xpr->op2);.    }
1e500 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
1e510 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
1e520 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
1e530 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
1e540 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1e550 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1e560 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e570 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1e580 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  NT.    case TK_F
1e590 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  LOAT: {.      as
1e5a0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1e5b0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e5c0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1e5d0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
1e5e0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1e5f0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1e600 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e610 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1e620 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
1e630 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
1e640 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1e650 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1e660 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1e670 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
1e680 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74  String(v, target
1e690 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1e6a0 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
1e6b0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20   target;.    }. 
1e6c0 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
1e6d0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1e6e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e6f0 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
1e700 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e710 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
1e720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e730 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
1e740 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
1e750 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
1e760 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1e770 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20   *z;.      char 
1e780 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73  *zBlob;.      as
1e790 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1e7a0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e7b0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1e7c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e7d0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1e7e0 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e  'x' || pExpr->u.
1e7f0 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29  zToken[0]=='X' )
1e800 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e810 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e820 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
1e830 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e    z = &pExpr->u.
1e840 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20  zToken[2];.     
1e850 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
1e860 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20  en30(z) - 1;.   
1e870 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d     assert( z[n]=
1e880 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
1e890 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65  Blob = sqlite3He
1e8a0 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56  xToBlob(sqlite3V
1e8b0 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b  dbeDb(v), z, n);
1e8c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e8d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
1e8e0 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74  lob, n/2, target
1e8f0 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44  , 0, zBlob, P4_D
1e900 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72  YNAMIC);.      r
1e910 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e920 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1e930 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
1e940 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1e950 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e960 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1e970 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
1e980 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1e990 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20  zToken!=0 );.   
1e9a0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e9b0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30  ->u.zToken[0]!=0
1e9c0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1e9d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e9e0 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
1e9f0 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  r->iColumn, targ
1ea00 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
1ea10 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
1ea20 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
1ea30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1ea40 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54  sqlite3VListNumT
1ea50 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56  oName(pParse->pV
1ea60 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f  List, pExpr->iCo
1ea70 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  lumn);.        a
1ea80 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1ea90 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c  zToken[0]=='?' |
1eaa0 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e  | strcmp(pExpr->
1eab0 75 2e 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20  u.zToken, z)==0 
1eac0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
1ead0 65 2d 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30  e->pVList[0] = 0
1eae0 3b 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c  ; /* Indicate VL
1eaf0 69 73 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65  ist may no longe
1eb00 72 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  r be enlarged */
1eb10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1eb20 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
1eb30 28 63 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41  (char*)z, P4_STA
1eb40 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
1eb50 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1eb60 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  t;.    }.    cas
1eb70 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
1eb80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45  .      return pE
1eb90 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
1eba0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1ebb0 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20  E_OMIT_CAST.    
1ebc0 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a  case TK_CAST: {.
1ebd0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
1ebe0 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
1ebf0 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41  :   CAST(pLeft A
1ec00 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20  S token) */.    
1ec10 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1ec20 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1ec30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ec40 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
1ec50 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
1ec60 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
1ec70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ec80 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
1ec90 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
1eca0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1ecb0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
1ecc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ecd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1ece0 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20  ast, target,.   
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69       sqlite3Affi
1ed10 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e  nityType(pExpr->
1ed20 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20  u.zToken, 0));. 
1ed30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75       testcase( u
1ed40 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1ed50 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1ed60 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20  inReg) );.      
1ed70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ed80 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1ed90 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29  Parse, inReg, 1)
1eda0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  ;.      return i
1edb0 6e 52 65 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  nReg;.    }.#end
1edc0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1edd0 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
1ede0 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1edf0 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
1ee00 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
1ee10 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
1ee20 5f 4e 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20  _NE;.      p5 = 
1ee30 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
1ee40 20 20 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72       /* fall-thr
1ee50 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
1ee60 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1ee70 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1ee80 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1ee90 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1eea0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1eeb0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1eec0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
1eed0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
1eee0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1eef0 72 49 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29  rIsVector(pLeft)
1ef00 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1ef10 56 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50  VectorCompare(pP
1ef20 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1ef30 67 65 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20  get, op, p5);.  
1ef40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ef50 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1ef60 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ef70 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46  se, pLeft, &regF
1ef80 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ree1);.        r
1ef90 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1efa0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1efb0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1efc0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1efd0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1efe0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45  Parse, pLeft, pE
1eff0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1f000 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c  .            r1,
1f010 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
1f020 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29  TE_STOREP2 | p5)
1f030 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f040 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
1f050 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f060 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
1f070 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
1f080 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f090 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
1f0a0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f0b0 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
1f0c0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
1f0d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f0e0 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
1f0f0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f100 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
1f110 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
1f120 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f130 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
1f140 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f150 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
1f160 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
1f170 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f180 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
1f190 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f1a0 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
1f1b0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
1f1c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f1d0 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
1f1e0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f1f0 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ne); VdbeCoverag
1f200 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29  eIf(v,op==OP_Ne)
1f210 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1f220 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f230 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f240 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1f250 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1f260 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f270 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
1f280 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
1f290 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
1f2a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
1f2b0 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
1f2c0 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
1f2d0 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
1f2e0 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
1f2f0 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
1f300 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
1f310 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
1f320 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
1f330 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
1f340 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
1f350 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f360 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
1f370 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1f380 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44  case( op==TK_AND
1f390 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f3a0 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29  ( TK_OR==OP_Or )
1f3b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ;              t
1f3c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f3d0 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
1f3e0 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
1f3f0 41 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  Add );          
1f400 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f410 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20  K_PLUS );.      
1f420 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
1f430 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
1f440 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f450 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20  p==TK_MINUS );. 
1f460 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f470 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65  REM==OP_Remainde
1f480 72 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  r );      testca
1f490 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29  se( op==TK_REM )
1f4a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f4b0 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69  TK_BITAND==OP_Bi
1f4c0 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73  tAnd );      tes
1f4d0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1f4e0 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73  TAND );.      as
1f4f0 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d  sert( TK_BITOR==
1f500 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20  OP_BitOr );     
1f510 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f520 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20  =TK_BITOR );.   
1f530 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c     assert( TK_SL
1f540 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29  ASH==OP_Divide )
1f550 3b 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;       testcase
1f560 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29  ( op==TK_SLASH )
1f570 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f580 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_LSHIFT==OP_Sh
1f590 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73  iftLeft );   tes
1f5a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53  tcase( op==TK_LS
1f5b0 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
1f5c0 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d  sert( TK_RSHIFT=
1f5d0 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29  =OP_ShiftRight )
1f5e0 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ;  testcase( op=
1f5f0 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20  =TK_RSHIFT );.  
1f600 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
1f610 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
1f620 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
1f630 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54  e( op==TK_CONCAT
1f640 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1f650 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f660 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f670 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1f680 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1f690 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f6a0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f6b0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1f6c0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree2);.      sql
1f6d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1f6e0 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61  , op, r2, r1, ta
1f6f0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73  rget);.      tes
1f700 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f710 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1f720 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1f730 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1f740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f750 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
1f760 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
1f770 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1f780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
1f790 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eft );.      if(
1f7a0 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
1f7b0 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
1f7c0 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
1f7d0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20  arse, pLeft, 1, 
1f7e0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1f7f0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1f800 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f810 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1f820 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  NT.      }else i
1f830 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
1f840 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
1f850 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1f860 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1f870 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1f880 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  ;.        codeRe
1f890 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a  al(v, pLeft->u.z
1f8a0 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74  Token, 1, target
1f8b0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1f8c0 6e 20 74 61 72 67 65 74 3b 0a 23 65 6e 64 69 66  n target;.#endif
1f8d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f8e0 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d        tempX.op =
1f8f0 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20   TK_INTEGER;.   
1f900 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73       tempX.flags
1f910 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45   = EP_IntValue|E
1f920 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20  P_TokenOnly;.   
1f930 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61       tempX.u.iVa
1f940 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lue = 0;.       
1f950 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f960 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f970 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72  , &tempX, &regFr
1f980 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
1f990 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f9a0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f9b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1f9c0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20  gFree2);.       
1f9d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f9e0 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63  p3(v, OP_Subtrac
1f9f0 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  t, r2, r1, targe
1fa00 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
1fa10 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1fa20 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1fa30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fa40 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
1fa50 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
1fa60 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
1fa70 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
1fa80 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74  OP_BitNot );   t
1fa90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1faa0 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  BITNOT );.      
1fab0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d  assert( TK_NOT==
1fac0 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20  OP_Not );       
1fad0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fae0 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_NOT );.      
1faf0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1fb00 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1fb10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1fb20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1fb30 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1fb40 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1fb50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fb60 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
1fb70 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
1fb80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fb90 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1fba0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1fbb0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
1fbc0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1fbd0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1fbe0 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
1fbf0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1fc00 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
1fc10 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
1fc20 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
1fc30 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1fc40 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1fc50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fc60 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1fc70 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1fc80 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1fc90 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1fca0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1fcb0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1fcc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1fcd0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1fce0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
1fcf0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
1fd00 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  p, r1);.      Vd
1fd10 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1fd20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
1fd30 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1fd40 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1fd50 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  OTNULL);.      s
1fd60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1fd70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1fd80 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1fd90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1fda0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
1fdb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fdc0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1fdd0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
1fde0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
1fdf0 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1fe00 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
1fe10 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
1fe20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1fe30 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1fe40 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1fe50 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
1fe60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1fe70 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
1fe80 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
1fe90 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1fea0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1feb0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fec0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
1fed0 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
1fee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1fef0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ff00 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
1ff10 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
1ff20 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
1ff30 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
1ff40 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1ff50 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67  .      int nFarg
1ff60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ff70 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74   Number of funct
1ff80 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1ff90 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
1ffa0 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  pDef;         /*
1ffb0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65   The function de
1ffc0 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20  finition object 
1ffd0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
1ffe0 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
1fff0 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
20000 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33  name */.      u3
20010 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  2 constMask = 0;
20020 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
20030 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
20040 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
20050 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
20060 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
20070 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
20080 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71  nter */.      sq
20090 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
200a0 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
200b0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
200c0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ion */.      u8 
200d0 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  enc = ENC(db);  
200e0 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
200f0 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
20100 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
20110 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
20120 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f  *pColl = 0;    /
20130 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  * A collating se
20140 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20  quence */..     
20150 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
20160 4f 6b 28 70 50 61 72 73 65 29 20 26 26 20 73 71  Ok(pParse) && sq
20170 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
20180 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
20190 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
201a0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  SQL functions ca
201b0 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65 2e 20  n be expensive. 
201c0 53 6f 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 63  So try to move c
201d0 6f 6e 73 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e  onstant function
201e0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  s.        ** out
201f0 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
20200 6f 70 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  op, even if that
20210 20 6d 65 61 6e 73 20 61 6e 20 65 78 74 72 61 20   means an extra 
20220 4f 50 5f 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20  OP_Copy. */.    
20230 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
20240 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
20250 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
20260 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
20270 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
20280 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
20290 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
202a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
202b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
202c0 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
202d0 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
202e0 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
202f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
20300 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
20310 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
20320 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72      nFarg = pFar
20330 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72  g ? pFarg->nExpr
20340 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   : 0;.      asse
20350 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
20360 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
20370 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
20380 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75    zId = pExpr->u
20390 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70  .zToken;.      p
203a0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
203b0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
203c0 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  d, nFarg, enc, 0
203d0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
203e0 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f  _ENABLE_UNKNOWN_
203f0 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20  SQL_FUNCTION.   
20400 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26     if( pDef==0 &
20410 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  & pParse->explai
20420 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  n ){.        pDe
20430 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
20440 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b  unction(db, "unk
20450 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e  nown", nFarg, en
20460 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  c, 0);.      }.#
20470 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
20480 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d  pDef==0 || pDef-
20490 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
204a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
204b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
204c0 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69   "unknown functi
204d0 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b  on: %s()", zId);
204e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
204f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
20500 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65  * Attempt a dire
20510 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ct implementatio
20520 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  n of the built-i
20530 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64  n COALESCE() and
20540 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c  .      ** IFNULL
20550 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  () functions.  T
20560 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63  his avoids unnec
20570 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f  essary evaluatio
20580 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72  n of.      ** ar
20590 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65  guments past the
205a0 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20   first non-NULL 
205b0 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
205c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
205d0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
205e0 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45  QLITE_FUNC_COALE
205f0 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  SCE ){.        i
20600 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d  nt endCoalesce =
20610 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
20620 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
20630 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
20640 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =2 );.        sq
20650 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
20660 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
20670 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
20680 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
20690 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  1; i<nFarg; i++)
206a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
206b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
206c0 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72   OP_NotNull, tar
206d0 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  get, endCoalesce
206e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
206f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
20700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20710 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
20720 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31  Parse, target, 1
20730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
20740 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
20750 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
20760 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20770 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
20780 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  rg->a[i].pExpr, 
20790 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
207a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
207b0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
207c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
207d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
207e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
207f0 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
20800 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20810 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  }..      /* The 
20820 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74  UNLIKELY() funct
20830 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
20840 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
20850 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
20860 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61  * of the first a
20870 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
20880 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
20890 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
208a0 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45  LITE_FUNC_UNLIKE
208b0 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  LY ){.        as
208c0 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29  sert( nFarg>=1 )
208d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
208e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
208f0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
20900 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
20910 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
20920 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
20930 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 2f 2a  E_DEBUG.      /*
20940 20 54 68 65 20 41 46 46 49 4e 49 54 59 28 29 20   The AFFINITY() 
20950 66 75 6e 63 74 69 6f 6e 20 65 76 61 6c 75 61 74  function evaluat
20960 65 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  es to a string t
20970 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 20 20  hat describes.  
20980 20 20 20 20 2a 2a 20 74 68 65 20 74 79 70 65 20      ** the type 
20990 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
209a0 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20  argument.  This 
209b0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
209c0 69 6e 67 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ing of.      ** 
209d0 74 68 65 20 53 51 4c 69 74 65 20 74 79 70 65 20  the SQLite type 
209e0 6c 6f 67 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  logic..      */.
209f0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
20a00 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
20a10 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54 59  TE_FUNC_AFFINITY
20a20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
20a30 74 20 63 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20  t char *azAff[] 
20a40 3d 20 7b 20 22 62 6c 6f 62 22 2c 20 22 74 65 78  = { "blob", "tex
20a50 74 22 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20 22  t", "numeric", "
20a60 69 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22  integer", "real"
20a70 20 7d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   };.        char
20a80 20 61 66 66 3b 0a 20 20 20 20 20 20 20 20 61 73   aff;.        as
20a90 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
20aa0 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20  ;.        aff = 
20ab0 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
20ac0 69 74 79 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  ity(pFarg->a[0].
20ad0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
20ae0 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53  sqlite3VdbeLoadS
20af0 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c  tring(v, target,
20b00 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b20 61 66 66 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d  aff ? azAff[aff-
20b30 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d  SQLITE_AFF_BLOB]
20b40 20 3a 20 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20   : "none");.    
20b50 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
20b60 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  t;.      }.#endi
20b70 66 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  f..      for(i=0
20b80 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
20b90 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33  .        if( i<3
20ba0 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  2 && sqlite3Expr
20bb0 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67  IsConstant(pFarg
20bc0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
20bd0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
20be0 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20  ase( i==31 );.  
20bf0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
20c00 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69  k |= MASKBIT32(i
20c10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20c20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
20c30 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
20c40 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
20c50 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29  )!=0 && !pColl )
20c60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
20c70 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
20c80 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
20c90 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
20ca0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20cb0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
20cc0 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
20cd0 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b  if( constMask ){
20ce0 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
20cf0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
20d00 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
20d10 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b  ->nMem += nFarg;
20d20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
20d30 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73            r1 = s
20d40 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
20d50 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67  ge(pParse, nFarg
20d60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
20d70 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e        /* For len
20d80 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66  gth() and typeof
20d90 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74  () functions wit
20da0 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d  h a column argum
20db0 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ent,.        ** 
20dc0 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d  set the P5 param
20dd0 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43  eter to the OP_C
20de0 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20  olumn opcode to 
20df0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
20e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f  .        ** or O
20e10 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
20e20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f  respectively, to
20e30 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
20e40 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20  ry data.        
20e50 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20  ** loading..    
20e60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
20e70 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
20e80 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55  ags & (SQLITE_FU
20e90 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45  NC_LENGTH|SQLITE
20ea0 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d  _FUNC_TYPEOF))!=
20eb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
20ec0 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20  8 exprOp;.      
20ed0 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
20ee0 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
20ef0 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d    assert( pFarg-
20f00 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
20f10 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72  ;.          expr
20f20 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  Op = pFarg->a[0]
20f30 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20  .pExpr->op;.    
20f40 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70        if( exprOp
20f50 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65  ==TK_COLUMN || e
20f60 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  xprOp==TK_AGG_CO
20f70 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
20f80 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
20f90 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d  TE_FUNC_LENGTH==
20fa0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
20fb0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
20fc0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
20fd0 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c  UNC_TYPEOF==OPFL
20fe0 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a  AG_TYPEOFARG );.
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
21000 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63  case( pDef->func
21010 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c  Flags & OPFLAG_L
21020 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
21030 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61          pFarg->a
21040 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d  [0].pExpr->op2 =
21050 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
21060 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c      pDef->funcFl
21070 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45  ags & (OPFLAG_LE
21080 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54  NGTHARG|OPFLAG_T
21090 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20  YPEOFARG);.     
210a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
210b0 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
210c0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
210d0 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54  Parse);     /* T
210e0 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
210f0 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  be */.        sq
21100 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
21110 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
21120 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20  arg, r1, 0,.    
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21140 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
21150 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
21160 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b  TE_ECEL_FACTOR);
21170 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21180 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
21190 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69  rse);      /* Ti
211a0 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
211b0 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  e */.      }else
211c0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30  {.        r1 = 0
211d0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
211e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
211f0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
21200 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
21210 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
21220 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
21230 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
21240 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
21250 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
21260 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
21270 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
21280 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
21290 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
212a0 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
212b0 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
212c0 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
212d0 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
212e0 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
212f0 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
21300 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
21310 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
21320 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
21330 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
21340 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
21350 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
21360 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
21370 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
21380 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
21390 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
213a0 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
213b0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
213c0 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
213d0 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
213e0 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
213f0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
21400 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
21410 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
21420 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
21430 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
21440 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
21450 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
21460 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
21470 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
21480 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
21490 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
214a0 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70  Farg>=2 && (pExp
214b0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
214c0 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
214d0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
214e0 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
214f0 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
21500 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
21510 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
21520 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72    }else if( nFar
21530 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
21540 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
21550 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
21560 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
21570 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  g, pFarg->a[0].p
21580 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
21590 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
215a0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
215b0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
215c0 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
215d0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
215e0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
215f0 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
21600 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
21610 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
21620 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
21630 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
21640 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
21650 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
21660 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
21670 46 55 4e 43 5f 4c 4f 43 41 54 49 4f 4e 20 29 7b  FUNC_LOCATION ){
21680 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
21690 41 72 67 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30  Arg = pFarg->a[0
216a0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
216b0 20 69 66 28 20 70 41 72 67 2d 3e 6f 70 3d 3d 54   if( pArg->op==T
216c0 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
216d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
216e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4c 6f  eAddOp2(v, OP_Lo
216f0 63 61 74 69 6f 6e 2c 20 70 41 72 67 2d 3e 69 54  cation, pArg->iT
21700 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
21710 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21730 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21740 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
21750 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21770 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21780 70 34 28 76 2c 20 70 50 61 72 73 65 2d 3e 69 53  p4(v, pParse->iS
21790 65 6c 66 54 61 62 20 3f 20 4f 50 5f 50 75 72 65  elfTab ? OP_Pure
217a0 46 75 6e 63 30 20 3a 20 4f 50 5f 46 75 6e 63 74  Func0 : OP_Funct
217b0 69 6f 6e 30 2c 0a 20 20 20 20 20 20 20 20 20 20  ion0,.          
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217d0 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
217e0 61 72 67 65 74 2c 20 28 63 68 61 72 2a 29 70 44  arget, (char*)pD
217f0 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
21800 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21810 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
21820 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20  (u8)nFarg);.    
21830 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 46    }.      if( nF
21840 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b  arg && constMask
21850 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
21860 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
21870 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
21880 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  1, nFarg);.     
21890 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
218a0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
218b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
218c0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
218d0 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
218e0 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
218f0 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  T: {.      int n
21900 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Col;.      testc
21910 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53  ase( op==TK_EXIS
21920 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
21930 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c  case( op==TK_SEL
21940 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ECT );.      if(
21950 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26   op==TK_SELECT &
21960 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d  & (nCol = pExpr-
21970 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
21980 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b  st->nExpr)!=1 ){
21990 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
219a0 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
219b0 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b  Parse, nCol, 1);
219c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
219d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
219e0 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
219f0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
21a00 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
21a10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21a20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
21a30 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  ELECT_COLUMN: {.
21a40 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
21a50 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
21a60 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  eft->iTable==0 )
21a70 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
21a80 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d  >pLeft->iTable =
21a90 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
21aa0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
21ab0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30  xpr->pLeft, 0, 0
21ac0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21ad0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
21ae0 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78  iTable==0 || pEx
21af0 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
21b00 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
21b10 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
21b20 62 6c 65 0a 20 20 20 20 20 20 20 26 26 20 70 45  ble.       && pE
21b30 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20  xpr->iTable!=(n 
21b40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
21b50 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70  torSize(pExpr->p
21b60 4c 65 66 74 29 29 20 0a 20 20 20 20 20 20 29 7b  Left)) .      ){
21b70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21b80 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
21b90 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73   "%d columns ass
21ba0 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73 22  igned %d values"
21bb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bd0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c    pExpr->iTable,
21be0 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   n);.      }.   
21bf0 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
21c00 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b  >pLeft->iTable +
21c10 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
21c20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21c30 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
21c40 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
21c50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
21c60 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
21c70 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
21c80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
21c90 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
21ca0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21cb0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
21cc0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21cd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
21ce0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
21cf0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
21d00 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
21d10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21d20 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
21d30 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
21d40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21d50 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
21d60 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
21d70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21d80 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
21d90 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20  m, target, 0);. 
21da0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21db0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
21dc0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
21dd0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
21de0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
21df0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
21e00 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20  BQUERY */...    
21e10 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42  /*.    **    x B
21e20 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
21e30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
21e40 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
21e50 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  to.    **.    **
21e60 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
21e70 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
21e80 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  X is stored in p
21e90 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
21ea0 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20   ** Y is stored 
21eb0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
21ec0 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[0].pExpr..   
21ed0 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20   ** Z is stored 
21ee0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
21ef0 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[1].pExpr..   
21f00 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
21f10 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
21f20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
21f30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
21f40 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20  target, 0, 0);. 
21f50 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
21f60 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  et;.    }.    ca
21f70 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20  se TK_SPAN:.    
21f80 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a  case TK_COLLATE:
21f90 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50   .    case TK_UP
21fa0 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  LUS: {.      ret
21fb0 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
21fc0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
21fd0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
21fe0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 0a  target);.    }..
21ff0 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
22000 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
22010 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
22020 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
22030 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
22040 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
22050 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
22060 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
22070 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
22080 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
22090 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
220a0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
220b0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
220c0 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
220d0 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
220e0 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
220f0 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
22100 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
22110 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
22120 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
22130 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
22140 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
22150 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
22160 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
22170 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
22180 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
22190 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
221a0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
221b0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
221c0 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
221d0 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
221e0 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
221f0 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
22200 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
22210 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
22220 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
22230 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
22240 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
22250 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
22260 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
22270 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
22280 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
22290 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
222a0 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
222b0 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
222c0 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
222d0 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
222e0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
222f0 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
22300 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
22310 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
22320 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
22330 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
22340 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
22350 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
22360 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
22370 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
22380 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
22390 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
223a0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
223b0 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
223c0 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
223d0 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
223e0 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
223f0 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
22400 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
22410 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
22420 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
22430 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
22440 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
22450 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
22460 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
22470 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
22480 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
22490 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
224a0 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
224b0 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
224c0 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
224d0 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
224e0 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
224f0 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
22500 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
22510 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
22520 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
22530 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
22540 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20  .      int p1 = 
22550 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20  pExpr->iTable * 
22560 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b  (pTab->nCol+1) +
22570 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c   1 + pExpr->iCol
22580 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  umn;..      asse
22590 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt( pExpr->iTabl
225a0 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  e==0 || pExpr->i
225b0 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
225c0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
225d0 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20  >iColumn>=-1 && 
225e0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
225f0 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
22600 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
22610 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70  >iPKey<0 || pExp
22620 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62  r->iColumn!=pTab
22630 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20  ->iPKey );.     
22640 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26   assert( p1>=0 &
22650 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c  & p1<(pTab->nCol
22660 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20  *2+2) );..      
22670 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22680 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70  2(v, OP_Param, p
22690 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
226a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
226b0 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22  , "%s.%s -> $%d"
226c0 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
226d0 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22  ->iTable ? "new"
226e0 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20   : "old"),.     
226f0 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75     (pExpr->iColu
22700 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn<0 ? "rowid" :
22710 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43   pExpr->pTab->aC
22720 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
22730 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  n].zName),.     
22740 20 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20     target.      
22750 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
22760 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
22770 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a  G_POINT.      /*
22780 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68   If the column h
22790 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
227a0 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74  , it may current
227b0 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ly be stored as 
227c0 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  an.      ** inte
227d0 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c  ger. Use OP_Real
227e0 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65  Affinity to make
227f0 20 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c   sure it is real
22800 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a  ly real..      *
22810 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  *.      ** EVIDE
22820 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d  NCE-OF: R-60985-
22830 35 37 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c  57662 SQLite wil
22840 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61  l convert the va
22850 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20  lue back to.    
22860 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f    ** floating po
22870 69 6e 74 20 77 68 65 6e 20 65 78 74 72 61 63 74  int when extract
22880 69 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ing it from the 
22890 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20  record.  */.    
228a0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
228b0 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20  lumn>=0 .       
228c0 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  && pTab->aCol[pE
228d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66  xpr->iColumn].af
228e0 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
228f0 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b  FF_REAL.      ){
22900 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22910 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
22920 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74  _RealAffinity, t
22930 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
22940 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
22950 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
22960 61 73 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b  ase TK_VECTOR: {
22970 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
22980 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
22990 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65  row value misuse
229a0 64 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d");.      break
229b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
229c0 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  e TK_IF_NULL_ROW
229d0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
229e0 64 72 49 4e 52 3b 0a 20 20 20 20 20 20 61 64 64  drINR;.      add
229f0 72 49 4e 52 20 3d 20 73 71 6c 69 74 65 33 56 64  rINR = sqlite3Vd
22a00 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
22a10 66 4e 75 6c 6c 52 6f 77 2c 20 70 45 78 70 72 2d  fNullRow, pExpr-
22a20 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
22a30 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
22a40 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
22a50 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
22a60 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
22a70 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
22a80 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
22a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
22aa0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
22ab0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
22ac0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
22ad0 20 61 64 64 72 49 4e 52 29 3b 0a 20 20 20 20 20   addrINR);.     
22ae0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
22af0 67 65 50 33 28 76 2c 20 61 64 64 72 49 4e 52 2c  geP3(v, addrINR,
22b00 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62   inReg);.      b
22b10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
22b20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
22b30 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
22b40 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
22b50 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
22b60 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
22b70 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
22b80 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
22b90 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
22ba0 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
22bb0 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
22bc0 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
22bd0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
22be0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
22bf0 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
22c00 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
22c10 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
22c20 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
22c30 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
22c40 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
22c50 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
22c60 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
22c70 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
22c80 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
22c90 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
22ca0 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
22cb0 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
22cc0 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
22cd0 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61  * Y is in the la
22ce0 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45  st element of pE
22cf0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20  xpr->x.pList if 
22d00 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
22d10 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20  nExpr is.    ** 
22d20 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61  odd.  The Y is a
22d30 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49  lso optional.  I
22d40 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
22d50 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c  elements in x.pL
22d60 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76  ist.    ** is ev
22d70 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d  en, then Y is om
22d80 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f  itted and the "o
22d90 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74  therwise" result
22da0 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
22db0 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
22dc0 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
22dd0 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
22de0 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
22df0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
22e00 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
22e10 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
22e20 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
22e30 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
22e40 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
22e50 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
22e60 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
22e70 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
22e80 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
22e90 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
22ea0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
22eb0 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70  ault: assert( op
22ec0 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20  ==TK_CASE ); {. 
22ed0 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
22ee0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
22ef0 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
22f00 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
22f10 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
22f20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
22f50 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
22f60 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
22f70 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
22fa0 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
22fb0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
22fe0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
22ff0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
23000 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
23010 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
23020 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
23030 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
23040 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
23050 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
23060 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
23070 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
23080 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
23090 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
230a0 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
230b0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
230c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
230d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
230e0 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
230f0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
23100 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
23110 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
23120 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
23130 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
23140 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
23150 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
23160 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
23170 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
23180 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
23190 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
231a0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
231b0 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
231c0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
231d0 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
231e0 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
231f0 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
23200 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
23210 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
23220 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
23230 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
23240 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
23250 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
23260 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
23270 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
23280 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
23290 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d  0 ){.        tem
232a0 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  pX = *pX;.      
232b0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
232c0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
232d0 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52  .        exprToR
232e0 65 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20  egister(&tempX, 
232f0 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70  exprCodeVector(p
23300 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
23310 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20  regFree1));.    
23320 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
23330 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
23340 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43       memset(&opC
23350 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f  ompare, 0, sizeo
23360 66 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20  f(opCompare));. 
23370 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
23380 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20  .op = TK_EQ;.   
23390 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
233a0 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20  Left = &tempX;. 
233b0 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26         pTest = &
233c0 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  opCompare;.     
233d0 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35     /* Ticket b35
233e0 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64  1d95f9cd5ef17e9d
233f0 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31  9dbae18f5ca86111
23400 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a  90001:.        *
23410 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72  * The value in r
23420 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65  egFree1 might ge
23430 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20  t SCopy-ed into 
23440 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e  the file result.
23450 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d  .        ** So m
23460 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
23470 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73  e regFree1 regis
23480 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65  ter is not reuse
23490 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20  d for other.    
234a0 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20      ** purposes 
234b0 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65  and possibly ove
234c0 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20  rwritten.  */.  
234d0 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
234e0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
234f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
23500 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  pr-1; i=i+2){.  
23510 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23520 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
23530 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
23540 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
23550 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
23560 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
23570 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
23580 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
23590 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
235a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
235b0 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
235c0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
235d0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
235e0 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
235f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
23600 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
23610 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
23620 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
23630 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
23640 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
23650 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
23660 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
23670 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
23680 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
23690 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
236a0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
236b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
236c0 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
236d0 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
236e0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
236f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
23700 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  o(v, endLabel);.
23710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
23720 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
23730 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
23740 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
23750 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
23760 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23770 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d   if( (nExpr&1)!=
23780 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
23790 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
237a0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
237b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
237c0 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  de(pParse, pELis
237d0 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45  t->a[nExpr-1].pE
237e0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
237f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23800 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
23810 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
23820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23830 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23840 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
23850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23860 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
23870 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
23880 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
23890 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  >0 .           |
238a0 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  | pParse->iCache
238b0 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76  Level==iCacheLev
238c0 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  el );.      sqli
238d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
238e0 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  bel(v, endLabel)
238f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23900 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
23910 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
23920 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
23930 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  SE: {.      asse
23940 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  rt( pExpr->affin
23950 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  ity==OE_Rollback
23960 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
23970 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
23980 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20  =OE_Abort.      
23990 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
239a0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c  ffinity==OE_Fail
239b0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
239c0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
239d0 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20  OE_Ignore.      
239e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
239f0 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
23a00 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
23a10 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23a20 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
23a30 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49              "RAI
23a40 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  SE() may only be
23a50 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74   used within a t
23a60 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29  rigger-program")
23a70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
23a80 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
23a90 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
23aa0 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20  inity==OE_Abort 
23ab0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23ac0 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
23ad0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
23ae0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
23af0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
23b00 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
23b10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
23b20 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
23b30 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
23b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23b50 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20  Op4(.           
23b60 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c   v, OP_Halt, SQL
23b70 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72  ITE_OK, OE_Ignor
23b80 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  e, 0, pExpr->u.z
23b90 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20  Token,0);.      
23ba0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
23bb0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
23bc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
23bd0 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
23be0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  arse, SQLITE_CON
23bf0 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c  STRAINT_TRIGGER,
23c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23c20 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20  Expr->affinity, 
23c30 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
23c40 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
23c50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
23c60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
23c70 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
23c80 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
23c90 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
23ca0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
23cb0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
23cc0 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  e2);.  return in
23cd0 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61  Reg;.}../*.** Fa
23ce0 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64  ctor out the cod
23cf0 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  e of the given e
23d00 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69  xpression to ini
23d10 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
23d20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65  ..**.** If regDe
23d30 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 72  st>=0 then the r
23d40 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73 20  esult is always 
23d50 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20 72  stored in that r
23d60 65 67 69 73 74 65 72 20 61 6e 64 20 74 68 65 0a  egister and the.
23d70 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74  ** result is not
23d80 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20 72   reusable.  If r
23d90 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74 68  egDest<0 then th
23da0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66 72  is routine is fr
23db0 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20  ee to .** store 
23dc0 74 68 65 20 76 61 6c 75 65 20 77 68 65 72 65 65  the value wheree
23dd0 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20 54  ver it wants.  T
23de0 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72  he register wher
23df0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
23e00 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69   .** is stored i
23e10 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68 65  s returned.  Whe
23e20 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77 6f  n regDest<0, two
23e30 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72 65   identical expre
23e40 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63  ssions will.** c
23e50 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ode to the same 
23e60 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
23e70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23e80 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20  AtInit(.  Parse 
23e90 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
23ea0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
23eb0 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
23ec0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
23ed0 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20  ression to code 
23ee0 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e  when the VDBE in
23ef0 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69  itializes */.  i
23f00 6e 74 20 72 65 67 44 65 73 74 20 20 20 20 20 20  nt regDest      
23f10 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61   /* Store the va
23f20 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
23f30 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
23f40 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65  rList *p;.  asse
23f50 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  rt( ConstFactorO
23f60 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70  k(pParse) );.  p
23f70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73   = pParse->pCons
23f80 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65 67  tExpr;.  if( reg
23f90 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a 20  Dest<0 && p ){. 
23fa0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
23fb0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
23fc0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
23fd0 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69  or(pItem=p->a, i
23fe0 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20  =p->nExpr; i>0; 
23ff0 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20  pItem++, i--){. 
24000 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
24010 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69  reusable && sqli
24020 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
24030 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45  ,pItem->pExpr,pE
24040 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  xpr,-1)==0 ){.  
24050 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74        return pIt
24060 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72  em->u.iConstExpr
24070 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Reg;.      }.   
24080 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d   }.  }.  pExpr =
24090 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
240a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
240b0 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c  r, 0);.  p = sql
240c0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
240d0 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  nd(pParse, p, pE
240e0 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  xpr);.  if( p ){
240f0 0a 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70  .     struct Exp
24100 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
24110 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78  m = &p->a[p->nEx
24120 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65  pr-1];.     pIte
24130 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65  m->reusable = re
24140 67 44 65 73 74 3c 30 3b 0a 20 20 20 20 20 69 66  gDest<0;.     if
24150 28 20 72 65 67 44 65 73 74 3c 30 20 29 20 72 65  ( regDest<0 ) re
24160 67 44 65 73 74 20 3d 20 2b 2b 70 50 61 72 73 65  gDest = ++pParse
24170 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74  ->nMem;.     pIt
24180 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72  em->u.iConstExpr
24190 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20  Reg = regDest;. 
241a0 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f   }.  pParse->pCo
241b0 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 20 20 72  nstExpr = p;.  r
241c0 65 74 75 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d  eturn regDest;.}
241d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
241e0 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
241f0 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
24200 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
24210 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20  sults.** into a 
24220 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72  register.  Retur
24230 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  n the register n
24240 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20  umber where the 
24250 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73  results.** are s
24260 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tored..**.** If 
24270 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20  the register is 
24280 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  a temporary regi
24290 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65  ster that can be
242a0 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a   deallocated,.**
242b0 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20   then write its 
242c0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65  number into *pRe
242d0 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c  g.  If the resul
242e0 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  t register is no
242f0 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  t.** a temporary
24300 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67  , then set *pReg
24310 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   to zero..**.** 
24320 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
24330 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69  nstant, then thi
24340 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
24350 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a  generate this.**
24360 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68   code to fill th
24370 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  e register in th
24380 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
24390 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a   section of the.
243a0 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c  ** VDBE program,
243b0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63   in order to fac
243c0 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68  tor it out of th
243d0 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f  e evaluation loo
243e0 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
243f0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61  3ExprCodeTemp(Pa
24400 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
24410 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70  r *pExpr, int *p
24420 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a  Reg){.  int r2;.
24430 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
24440 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
24450 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43  (pExpr);.  if( C
24460 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
24470 72 73 65 29 0a 20 20 20 26 26 20 70 45 78 70 72  rse).   && pExpr
24480 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
24490 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45  R.   && sqlite3E
244a0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
244b0 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b  Join(pExpr).  ){
244c0 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b  .    *pReg  = 0;
244d0 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65  .    r2 = sqlite
244e0 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
244f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d  pParse, pExpr, -
24500 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
24510 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
24520 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
24530 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71  se);.    r2 = sq
24540 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
24550 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
24560 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20  r, r1);.    if( 
24570 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20  r2==r1 ){.      
24580 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20  *pReg = r1;.    
24590 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
245a0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
245b0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
245c0 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b        *pReg = 0;
245d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
245e0 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn r2;.}../*.**
245f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
24600 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
24610 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
24620 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
24630 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
24640 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
24650 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
24660 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
24670 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
24680 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a  ster target..*/.
24690 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
246a0 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72  Code(Parse *pPar
246b0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
246c0 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
246d0 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73  int inReg;..  as
246e0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
246f0 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
24700 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
24710 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e  pExpr && pExpr->
24720 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
24730 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
24740 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
24750 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c  >pVdbe, OP_Copy,
24760 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
24770 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  target);.  }else
24780 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71  {.    inReg = sq
24790 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
247a0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
247b0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
247c0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
247d0 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72  pVdbe!=0 || pPar
247e0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
247f0 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
24800 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26  inReg!=target &&
24810 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
24820 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
24830 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
24840 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
24850 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
24860 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
24870 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61  /*.** Make a tra
24880 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65  nsient copy of e
24890 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
248a0 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74  and then code it
248b0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
248c0 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68  3ExprCode().  Th
248d0 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
248e0 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74   just like sqlit
248f0 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20  e3ExprCode().** 
24900 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
24910 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e  input expression
24920 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
24930 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  o be unchanged..
24940 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
24950 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73  xprCodeCopy(Pars
24960 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
24970 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
24980 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  et){.  sqlite3 *
24990 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
249a0 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
249b0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
249c0 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21  xpr, 0);.  if( !
249d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
249e0 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   ) sqlite3ExprCo
249f0 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
24a00 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c  , target);.  sql
24a10 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
24a20 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  b, pExpr);.}../*
24a30 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
24a40 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
24a50 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
24a60 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
24a70 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
24a80 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
24a90 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
24aa0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
24ab0 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
24ac0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
24ad0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
24ae0 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20  on is constant, 
24af0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
24b00 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73  e.** might choos
24b10 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78  e to code the ex
24b20 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74  pression at init
24b30 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
24b40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24b50 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62  ExprCodeFactorab
24b60 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
24b70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
24b80 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66  nt target){.  if
24b90 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73  ( pParse->okCons
24ba0 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74  tFactor && sqlit
24bb0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
24bc0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
24bd0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
24be0 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
24bf0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  pr, target);.  }
24c00 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
24c10 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
24c20 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
24c30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
24c40 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
24c50 74 20 65 76 61 6c 75 61 74 65 73 20 74 68 65 20  t evaluates the 
24c60 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
24c70 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65   and puts the re
24c80 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73  sult.** in regis
24c90 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a  ter target..**.*
24ca0 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f  * Also make a co
24cb0 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
24cc0 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74  sion results int
24cd0 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65  o another "cache
24ce0 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e  " register.** an
24cf0 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70  d modify the exp
24d00 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20  ression so that 
24d10 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74  the next time it
24d20 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a   is evaluated,.*
24d30 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  * the result is 
24d40 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
24d50 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  che register..**
24d60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24d70 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70   is used for exp
24d80 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
24d90 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20  e used multiple 
24da0 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79  .** times.  They
24db0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f   are evaluated o
24dc0 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  nce and the resu
24dd0 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  lts of the expre
24de0 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75  ssion.** are reu
24df0 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
24e00 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
24e10 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
24e20 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
24e30 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
24e40 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
24e50 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
24e60 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Mem;..  assert( 
24e70 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
24e80 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
24e90 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
24ea0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24eb0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
24ec0 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d   target);.  iMem
24ed0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
24ee0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
24ef0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
24f00 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29  y, target, iMem)
24f10 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
24f20 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b  er(pExpr, iMem);
24f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
24f40 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73  te code that pus
24f50 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hes the value of
24f60 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
24f70 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  f the given.** e
24f80 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69  xpression list i
24f90 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f  nto a sequence o
24fa0 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  f registers begi
24fb0 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e  nning at target.
24fc0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
24fd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
24fe0 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 20  ents evaluated. 
24ff0 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
25000 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a 20 75 73 75  rned will.** usu
25010 61 6c 6c 79 20 62 65 20 70 4c 69 73 74 2d 3e 6e  ally be pList->n
25020 45 78 70 72 20 62 75 74 20 6d 69 67 68 74 20 62  Expr but might b
25030 65 20 72 65 64 75 63 65 64 20 69 66 20 53 51 4c  e reduced if SQL
25040 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
25050 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  .** is defined..
25060 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
25070 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70  _ECEL_DUP flag p
25080 72 65 76 65 6e 74 73 20 74 68 65 20 61 72 67 75  revents the argu
25090 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  ments from being
250a0 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67  .** filled using
250b0 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43   OP_SCopy.  OP_C
250c0 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73 65 64  opy must be used
250d0 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
250e0 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
250f0 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20  FACTOR argument 
25100 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20  allows constant 
25110 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a  arguments to be.
25120 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20  ** factored out 
25130 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  into initializat
25140 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion code..**.** 
25150 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
25160 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74  REF flag means t
25170 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
25180 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74 68  in the list with
25190 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  .** ExprList.a[]
251a0 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
251b0 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  >0 have already 
251c0 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61  been evaluated a
251d0 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  nd stored.** in 
251e0 72 65 67 69 73 74 65 72 73 20 61 74 20 73 72 63  registers at src
251f0 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20  Reg, and so the 
25200 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70  value can be cop
25210 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a  ied from there..
25220 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 43 45  ** If SQLITE_ECE
25230 4c 5f 4f 4d 49 54 52 45 46 20 69 73 20 61 6c 73  L_OMITREF is als
25240 6f 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  o set, then the 
25250 76 61 6c 75 65 73 20 77 69 74 68 20 75 2e 78 2e  values with u.x.
25260 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 2a 2a  iOrderByCol>0.**
25270 20 61 72 65 20 73 69 6d 70 6c 79 20 6f 6d 69 74   are simply omit
25280 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
25290 62 65 69 6e 67 20 63 6f 70 69 65 64 20 66 72 6f  being copied fro
252a0 6d 20 73 72 63 52 65 67 2e 0a 2a 2f 0a 69 6e 74  m srcReg..*/.int
252b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
252c0 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
252d0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
252e0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
252f0 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
25300 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  *pList,   /* The
25310 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
25320 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
25330 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20    int target,   
25340 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
25350 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a   write results *
25360 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20  /.  int srcReg, 
25370 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
25380 20 72 65 67 69 73 74 65 72 73 20 69 66 20 53 51   registers if SQ
25390 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f  LITE_ECEL_REF */
253a0 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20  .  u8 flags     
253b0 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
253c0 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  ECEL_* flags */.
253d0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
253e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
253f0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
25400 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28  .  u8 copyOp = (
25410 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25420 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f  CEL_DUP) ? OP_Co
25430 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20  py : OP_SCopy;. 
25440 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
25450 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
25460 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
25470 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
25480 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
25490 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
254a0 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65   );  /* Never ge
254b0 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65  ts this far othe
254c0 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70  rwise */.  n = p
254d0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
254e0 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f  f( !ConstFactorO
254f0 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67  k(pParse) ) flag
25500 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45  s &= ~SQLITE_ECE
25510 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28  L_FACTOR;.  for(
25520 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
25530 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
25540 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
25550 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d  r *pExpr = pItem
25560 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->pExpr;.    if(
25570 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25580 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30 20 26 26  _ECEL_REF)!=0 &&
25590 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78   (j = pItem->u.x
255a0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20  .iOrderByCol)>0 
255b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ){.      if( fla
255c0 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
255d0 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20 20 20 20  _OMITREF ){.    
255e0 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20      i--;.       
255f0 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73   n--;.      }els
25600 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
25610 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25620 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67  copyOp, j+srcReg
25630 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  -1, target+i);. 
25640 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
25650 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
25660 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
25670 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45  )!=0 && sqlite3E
25680 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
25690 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  xpr) ){.      sq
256a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
256b0 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
256c0 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
256d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
256e0 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  nt inReg = sqlit
256f0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
25700 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
25710 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
25720 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
25730 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20  et+i ){.        
25740 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
25750 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d       if( copyOp=
25760 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
25770 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65    && (pOp=sqlite
25780 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31  3VdbeGetOp(v, -1
25790 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  ))->opcode==OP_C
257a0 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
257b0 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b  pOp->p1+pOp->p3+
257c0 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20  1==inReg.       
257d0 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70    && pOp->p2+pOp
257e0 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69  ->p3+1==target+i
257f0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
25800 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b        pOp->p3++;
25810 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
25820 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25830 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
25840 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61  opyOp, inReg, ta
25850 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20  rget+i);.       
25860 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
25870 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
25880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
25890 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  te code for a BE
258a0 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  TWEEN operator..
258b0 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45  **.**    x BETWE
258c0 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a  EN y AND z.**.**
258d0 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65 71   The above is eq
258e0 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a  uivalent to .**.
258f0 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
25900 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69  <=z.**.** Code i
25910 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e  t as such, takin
25920 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65  g care to do the
25930 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65   common subexpre
25940 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61  ssion.** elimina
25950 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2a 0a 2a 2a  tion of x..**.**
25960 20 54 68 65 20 78 4a 75 6d 70 49 66 20 70 61 72   The xJumpIf par
25970 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
25980 73 20 64 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a  s details:.**.**
25990 20 20 20 20 4e 55 4c 4c 3a 20 20 20 20 20 20 20      NULL:       
259a0 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 72              Stor
259b0 65 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  e the boolean re
259c0 73 75 6c 74 20 69 6e 20 72 65 67 5b 64 65 73 74  sult in reg[dest
259d0 5d 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 45  ].**    sqlite3E
259e0 78 70 72 49 66 54 72 75 65 3a 20 20 20 20 20 20  xprIfTrue:      
259f0 4a 75 6d 70 20 74 6f 20 64 65 73 74 20 69 66 20  Jump to dest if 
25a00 74 72 75 65 0a 2a 2a 20 20 20 20 73 71 6c 69 74  true.**    sqlit
25a10 65 33 45 78 70 72 49 66 46 61 6c 73 65 3a 20 20  e3ExprIfFalse:  
25a20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73 74 20     Jump to dest 
25a30 69 66 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 54  if false.**.** T
25a40 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 70 61  he jumpIfNull pa
25a50 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72  rameter is ignor
25a60 65 64 20 69 66 20 78 4a 75 6d 70 49 66 20 69 73  ed if xJumpIf is
25a70 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
25a80 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65   void exprCodeBe
25a90 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  tween(.  Parse *
25aa0 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
25ab0 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
25ac0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
25ad0 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
25ae0 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  pr,      /* The 
25af0 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69  BETWEEN expressi
25b00 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
25b10 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ,         /* Jum
25b20 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 72  p destination or
25b30 20 73 74 6f 72 61 67 65 20 6c 6f 63 61 74 69 6f   storage locatio
25b40 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4a  n */.  void (*xJ
25b50 75 6d 70 29 28 50 61 72 73 65 2a 2c 45 78 70 72  ump)(Parse*,Expr
25b60 2a 2c 69 6e 74 2c 69 6e 74 29 2c 20 2f 2a 20 41  *,int,int), /* A
25b70 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 2a 2f  ction to take */
25b80 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
25b90 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65  l    /* Take the
25ba0 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54   jump if the BET
25bb0 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a  WEEN is NULL */.
25bc0 29 7b 0a 20 45 78 70 72 20 65 78 70 72 41 6e 64  ){. Expr exprAnd
25bd0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44  ;     /* The AND
25be0 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e   operator in  x>
25bf0 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a  =y AND x<=z  */.
25c00 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b    Expr compLeft;
25c10 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79      /* The  x>=y
25c20 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
25c30 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a   compRight;   /*
25c40 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d   The  x<=z  term
25c50 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58   */.  Expr exprX
25c60 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20  ;       /* The  
25c70 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  x  subexpression
25c80 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
25c90 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f  e1 = 0; /* Tempo
25ca0 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65  rary use registe
25cb0 72 20 2a 2f 0a 0a 0a 20 20 6d 65 6d 73 65 74 28  r */...  memset(
25cc0 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20 73 69  &compLeft, 0, si
25cd0 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d  zeof(Expr));.  m
25ce0 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67 68 74  emset(&compRight
25cf0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
25d00 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 78  ));.  memset(&ex
25d10 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65 6f 66  prAnd, 0, sizeof
25d20 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73 73 65  (Expr));..  asse
25d30 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
25d40 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
25d50 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65  IsSelect) );.  e
25d60 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70  xprX = *pExpr->p
25d70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e  Left;.  exprAnd.
25d80 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65  op = TK_AND;.  e
25d90 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26  xprAnd.pLeft = &
25da0 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  compLeft;.  expr
25db0 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f  And.pRight = &co
25dc0 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c  mpRight;.  compL
25dd0 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a  eft.op = TK_GE;.
25de0 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74    compLeft.pLeft
25df0 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d   = &exprX;.  com
25e00 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70  pLeft.pRight = p
25e10 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
25e20 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d  [0].pExpr;.  com
25e30 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c  pRight.op = TK_L
25e40 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  E;.  compRight.p
25e50 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
25e60 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68   compRight.pRigh
25e70 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
25e80 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
25e90 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
25ea0 28 26 65 78 70 72 58 2c 20 65 78 70 72 43 6f 64  (&exprX, exprCod
25eb0 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  eVector(pParse, 
25ec0 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65  &exprX, &regFree
25ed0 31 29 29 3b 0a 20 20 69 66 28 20 78 4a 75 6d 70  1));.  if( xJump
25ee0 20 29 7b 0a 20 20 20 20 78 4a 75 6d 70 28 70 50   ){.    xJump(pP
25ef0 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
25f00 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
25f10 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25f20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 65 78 70 72  /* Mark the expr
25f30 65 73 73 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  ession is being 
25f40 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55  from the ON or U
25f50 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
25f60 20 6a 6f 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 20   join.    ** so 
25f70 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
25f80 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 29  ExprCodeTarget()
25f90 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f   routine will no
25fa0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76  t attempt to mov
25fb0 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  e.    ** it into
25fc0 20 74 68 65 20 50 61 72 73 65 2e 70 43 6f 6e 73   the Parse.pCons
25fd0 74 45 78 70 72 20 6c 69 73 74 2e 20 20 57 65 20  tExpr list.  We 
25fe0 73 68 6f 75 6c 64 20 75 73 65 20 61 20 6e 65 77  should use a new
25ff0 20 62 69 74 20 66 6f 72 20 74 68 69 73 2c 0a 20   bit for this,. 
26000 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61 72 69 74     ** for clarit
26010 79 2c 20 62 75 74 20 77 65 20 61 72 65 20 6f 75  y, but we are ou
26020 74 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  t of bits in the
26030 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c   Expr.flags fiel
26040 64 20 73 6f 20 77 65 0a 20 20 20 20 2a 2a 20 68  d so we.    ** h
26050 61 76 65 20 74 6f 20 72 65 75 73 65 20 74 68 65  ave to reuse the
26060 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 62 69 74   EP_FromJoin bit
26070 2e 20 20 42 75 6d 6d 65 72 2e 20 2a 2f 0a 20 20  .  Bummer. */.  
26080 20 20 65 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d    exprX.flags |=
26090 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20   EP_FromJoin;.  
260a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
260b0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
260c0 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b  &exprAnd, dest);
260d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
260e0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
260f0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
26100 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
26110 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
26120 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
26130 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
26140 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
26150 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
26160 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26170 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26180 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26190 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
261a0 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
261b0 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
261c0 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
261d0 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
261e0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
261f0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
26200 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
26210 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
26220 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
26230 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
26240 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
26250 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
26260 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26270 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
26280 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
26290 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
262a0 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
262b0 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
262c0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
262d0 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
262e0 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
262f0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26300 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
26310 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
26320 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
26330 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
26340 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
26350 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
26360 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
26370 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
26380 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
26390 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
263a0 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
263b0 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
263c0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
263d0 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
263e0 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
263f0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
26400 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
26410 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
26420 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
26430 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
26440 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
26450 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
26460 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
26470 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
26480 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
26490 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
264a0 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
264b0 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45  l flag is SQLITE
264c0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a  _JUMPIFNULL..**.
264d0 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
264e0 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
264f0 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
26500 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
26510 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
26520 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
26530 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
26540 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
26550 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
26560 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
26570 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
26580 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
26590 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
265a0 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
265b0 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
265c0 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
265d0 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
265e0 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
265f0 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
26600 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
26610 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
26620 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
26630 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
26640 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
26650 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
26660 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
26670 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
26680 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
26690 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
266a0 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
266b0 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
266c0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
266d0 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
266e0 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
266f0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
26700 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
26710 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
26720 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
26730 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
26740 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
26750 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
26760 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ler */.  if( NEV
26770 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72  ER(pExpr==0) ) r
26780 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61  eturn;  /* No wa
26790 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
267a0 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70  n */.  op = pExp
267b0 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
267c0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
267d0 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
267e0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
267f0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
26800 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
26810 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26820 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26830 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
26840 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
26850 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e  , d2,jumpIfNull^
26860 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
26870 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
26880 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
26890 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
268a0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
268b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
268c0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
268d0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
268e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
268f0 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
26900 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26910 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
26920 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
26930 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
26940 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_OR: {.      te
26950 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26960 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
26970 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
26980 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26990 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
269a0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
269b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
269c0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
269d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
269e0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
269f0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
26a00 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
26a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26a20 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
26a30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
26a40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
26a50 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
26a60 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
26a70 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
26a80 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26a90 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
26aa0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
26ab0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
26ac0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26ad0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
26ae0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
26af0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
26b00 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
26b10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
26b20 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
26b30 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
26b40 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
26b50 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_NE;.      jum
26b60 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
26b70 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
26b80 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
26b90 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
26ba0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
26bb0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
26bc0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
26bd0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
26be0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
26bf0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
26c00 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
26c10 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
26c20 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
26c30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
26c40 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
26c50 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
26c60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
26c70 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
26c80 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
26c90 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
26ca0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
26cb0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
26cc0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
26cd0 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
26ce0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
26cf0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
26d00 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
26d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26d20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
26d30 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
26d40 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
26d50 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
26d60 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
26d70 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
26d80 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
26d90 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
26da0 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
26db0 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
26dc0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
26dd0 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
26de0 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
26df0 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
26e00 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
26e10 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
26e20 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
26e30 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
26e40 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
26e50 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
26e60 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
26e70 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
26e80 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
26e90 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
26ea0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
26eb0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26ec0 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
26ed0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
26ee0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
26ef0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
26f00 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
26f10 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
26f20 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
26f30 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
26f40 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
26f50 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
26f60 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
26f70 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
26f80 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
26f90 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
26fa0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
26fb0 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
26fc0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
26fd0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
26fe0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
26ff0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
27000 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
27010 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
27020 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27030 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
27040 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
27050 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
27060 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
27070 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
27080 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
27090 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
270a0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
270b0 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
270c0 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
270d0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
270e0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
270f0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
27100 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27110 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
27120 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27130 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
27140 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
27150 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27160 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
27170 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
27180 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
27190 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
271a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
271b0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
271c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
271d0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
271e0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
271f0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
27200 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
27210 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
27220 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
27230 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
27240 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
27250 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27260 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
27270 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
27280 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
27290 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
272a0 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
272b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
272c0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
272d0 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
272e0 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
272f0 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
27300 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27310 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
27320 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
27330 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
27340 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
27350 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
27360 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
27370 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
27380 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
27390 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
273a0 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
273b0 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f  : {.    default_
273c0 65 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20  expr:.      if( 
273d0 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
273e0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
273f0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
27400 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
27410 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
27420 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
27430 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
27440 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  No-op */.      }
27450 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
27460 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
27470 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
27480 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
27490 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
274a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
274b0 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
274c0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
274d0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
274e0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
274f0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
27500 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
27510 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27520 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27530 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
27540 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
27550 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
27560 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
27570 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
27580 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
27590 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
275a0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
275b0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
275c0 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
275d0 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
275e0 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
275f0 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
27600 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
27610 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
27620 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
27630 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
27640 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
27650 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
27660 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
27670 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
27680 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
27690 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
276a0 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
276b0 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
276c0 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
276d0 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
276e0 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
276f0 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
27700 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
27710 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
27720 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
27730 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
27740 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
27750 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
27760 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
27770 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
27780 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
27790 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
277a0 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
277b0 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
277c0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
277d0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
277e0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
277f0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
27800 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65  eturn; /* Existe
27810 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
27820 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
27830 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
27840 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
27850 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
27860 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
27870 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
27880 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
27890 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
278a0 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
278b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
278c0 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
278d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
278e0 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
278f0 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
27900 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
27910 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
27920 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
27930 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
27940 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
27950 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
27970 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
27980 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
27990 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
279a0 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
279b0 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
279c0 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
279d0 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
279e0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
279f0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
27a00 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
27a10 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
27a20 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
27a30 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
27a40 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
27a50 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
27a60 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
27a70 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
27a80 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
27a90 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
27aa0 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
27ab0 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
27ac0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
27ad0 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
27ae0 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
27af0 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
27b00 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
27b10 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
27b20 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
27b30 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
27b40 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
27b50 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
27b60 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
27b70 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
27b80 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
27b90 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
27ba0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
27bb0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27bc0 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
27bd0 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
27be0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
27bf0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
27c00 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
27c10 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
27c20 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
27c30 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
27c40 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27c50 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
27c60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27c70 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
27c80 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
27c90 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27ca0 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
27cb0 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
27cc0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
27cd0 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
27ce0 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
27cf0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
27d00 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
27d10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
27d20 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
27d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27d40 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
27d50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
27d60 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
27d70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27d80 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
27d90 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
27da0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
27db0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
27dc0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
27dd0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
27de0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
27df0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
27e00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
27e10 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
27e20 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
27e30 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
27e40 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
27e50 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
27e60 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
27e70 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
27e80 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
27e90 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70  >pLeft, d2, jump
27ea0 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
27eb0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
27ec0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
27ed0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
27ee0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27ef0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
27f00 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
27f10 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
27f20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27f30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
27f40 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
27f50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
27f60 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
27f70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27f80 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
27f90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
27fa0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
27fb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
27fc0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
27fd0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
27fe0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
27ff0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
28000 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
28010 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
28020 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
28030 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
28040 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
28050 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
28060 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
28070 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
28080 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
28090 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
280a0 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  Q;.      jumpIfN
280b0 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
280c0 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
280d0 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
280e0 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
280f0 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
28100 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
28110 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
28120 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
28130 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
28140 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
28150 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
28160 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20  ->pLeft) ) goto 
28170 64 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20  default_expr;.  
28180 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
28190 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
281a0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
281b0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
281c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
281d0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
281e0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
281f0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
28200 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
28210 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
28220 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
28230 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
28240 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
28250 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
28260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
28270 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
28280 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
28290 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
282a0 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
282b0 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
282c0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
282d0 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
282e0 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
282f0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
28300 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
28310 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
28320 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
28330 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
28340 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
28350 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
28360 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
28370 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
28380 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
28390 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
283a0 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
283b0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
283c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
283d0 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
283e0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
283f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
28400 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
28410 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
28420 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
28430 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
28440 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
28450 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
28460 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
28470 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
28480 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
28490 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
284a0 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
284b0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
284c0 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
284d0 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
284e0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
284f0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
28500 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
28510 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
28520 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
28530 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
28540 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
28550 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
28560 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
28570 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
28580 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
28590 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
285a0 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
285b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
285c0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
285d0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
285e0 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
285f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28600 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
28610 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
28620 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20  p==TK_ISNULL ); 
28630 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
28640 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
28650 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
28660 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
28670 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LL );  VdbeCover
28680 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
28690 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
286a0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
286b0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
286c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
286d0 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
286e0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
286f0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
28700 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
28710 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
28720 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
28730 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
28740 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  e, jumpIfNull);.
28750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28760 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
28770 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
28780 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
28790 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70  {.      if( jump
287a0 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
287b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
287c0 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
287d0 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a  r, dest, dest);.
287e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
287f0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
28800 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
28810 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
28820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
28830 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
28840 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
28850 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
28860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
28870 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
28880 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
28890 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
288a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
288b0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
288c0 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20  default_expr: . 
288d0 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
288e0 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
288f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28900 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
28910 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
28920 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
28930 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
28940 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
28950 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
28960 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
28970 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
28980 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
28990 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
289a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
289b0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
289c0 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
289d0 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
289e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
289f0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
28a00 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
28a10 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
28a20 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
28a30 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
28a40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
28a50 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
28a60 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
28a70 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
28a80 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
28a90 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
28aa0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
28ab0 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
28ac0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29  te3ExprIfFalse()
28ad0 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63   except that a c
28ae0 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70  opy is made of p
28af0 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63  Expr before.** c
28b00 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20  ode generation, 
28b10 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73  and that copy is
28b20 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63   deleted after c
28b30 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ode generation. 
28b40 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20  This.** ensures 
28b50 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
28b60 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61  l pExpr is uncha
28b70 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
28b80 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
28b90 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Dup(Parse *pPars
28ba0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
28bb0 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d  int dest,int jum
28bc0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69  pIfNull){.  sqli
28bd0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
28be0 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43  ->db;.  Expr *pC
28bf0 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
28c00 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
28c10 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
28c20 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
28c30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
28c40 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
28c50 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d  pCopy, dest, jum
28c60 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
28c70 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
28c80 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a  e(db, pCopy);.}.
28c90 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f  ./*.** Expressio
28ca0 6e 20 70 56 61 72 20 69 73 20 67 75 61 72 61 6e  n pVar is guaran
28cb0 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 53 51  teed to be an SQ
28cc0 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45 78 70  L variable. pExp
28cd0 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a 2a 20  r may be any.** 
28ce0 74 79 70 65 20 6f 66 20 65 78 70 72 65 73 73 69  type of expressi
28cf0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  on..**.** If pEx
28d00 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53  pr is a simple S
28d10 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20 69 6e  QL value - an in
28d20 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74 72  teger, real, str
28d30 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20  ing, blob.** or 
28d40 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74 68 65  NULL value - the
28d50 6e 20 74 68 65 20 56 44 42 45 20 63 75 72 72 65  n the VDBE curre
28d60 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65 70 61  ntly being prepa
28d70 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75 72 65  red is configure
28d80 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65 70 61  d.** to re-prepa
28d90 72 65 20 65 61 63 68 20 74 69 6d 65 20 61 20 6e  re each time a n
28da0 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f 75 6e  ew value is boun
28db0 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56  d to variable pV
28dc0 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69  ar..**.** Additi
28dd0 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78 70 72  onally, if pExpr
28de0 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c   is a simple SQL
28df0 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 76   value and the v
28e00 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a 20 73  alue is the.** s
28e10 61 6d 65 20 61 73 20 74 68 61 74 20 63 75 72 72  ame as that curr
28e20 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f 20 76  ently bound to v
28e30 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20 6e 6f  ariable pVar, no
28e40 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
28e50 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ed..** Otherwise
28e60 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 73 20  , if the values 
28e70 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d 65  are not the same
28e80 20 6f 72 20 69 66 20 70 45 78 70 72 20 69 73 20   or if pExpr is 
28e90 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  not a simple.** 
28ea0 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72 6f 20  SQL value, zero 
28eb0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
28ec0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
28ed0 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 50  ompareVariable(P
28ee0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
28ef0 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72 20 2a  pr *pVar, Expr *
28f00 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65  pExpr){.  int re
28f10 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  s = 0;.  int iVa
28f20 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  r;.  sqlite3_val
28f30 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20 30 3b  ue *pL, *pR = 0;
28f40 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  .  .  sqlite3Val
28f50 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
28f60 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51  e->db, pExpr, SQ
28f70 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
28f80 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70 52 29  E_AFF_BLOB, &pR)
28f90 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a 20 20  ;.  if( pR ){.  
28fa0 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d 3e 69    iVar = pVar->i
28fb0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
28fc0 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
28fd0 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  k(pParse->pVdbe,
28fe0 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c 20 3d   iVar);.    pL =
28ff0 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42   sqlite3VdbeGetB
29000 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72 73 65  oundValue(pParse
29010 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69 56  ->pReprepare, iV
29020 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  ar, SQLITE_AFF_B
29030 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  LOB);.    if( pL
29040 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
29050 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
29060 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58  (pL)==SQLITE_TEX
29070 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
29080 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
29090 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  pL); /* Make sur
290a0 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69  e the encoding i
290b0 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20  s UTF-8 */.     
290c0 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20 20   }.      res =  
290d0 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  0==sqlite3MemCom
290e0 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30 29 3b  pare(pL, pR, 0);
290f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
29100 65 33 56 61 6c 75 65 46 72 65 65 28 70 52 29 3b  e3ValueFree(pR);
29110 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
29120 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a  eFree(pL);.  }..
29130 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
29140 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
29150 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
29160 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
29170 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ees.  Return 0 i
29180 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
29190 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d  ressions are com
291a0 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61  pletely identica
291b0 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  l.  Return 1 if 
291c0 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79  they differ only
291d0 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  .** by a COLLATE
291e0 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65   operator at the
291f0 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74   top level.  Ret
29200 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61  urn 2 if there a
29210 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a  re differences.*
29220 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  * other than the
29230 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41   top-level COLLA
29240 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  TE operator..**.
29250 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
29260 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
29270 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
29280 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
29290 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
292a0 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
292b0 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
292c0 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
292d0 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
292e0 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65  *.** The pA side
292f0 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20   might be using 
29300 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66  TK_REGISTER.  If
29310 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
29320 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e  e and pB is.** n
29330 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  ot using TK_REGI
29340 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68 65  STER but is othe
29350 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74  rwise equivalent
29360 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74  , then still ret
29370 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  urn 0..**.** Som
29380 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
29390 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
293a0 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  2 even if the tw
293b0 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
293c0 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
293d0 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
293e0 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
293f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
29400 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
29410 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a  l, we return 2 j
29420 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
29430 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
29440 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32  ine.** returns 2
29450 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
29460 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
29470 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
29480 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
29490 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
294a0 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
294b0 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72  t a 0 or 1 retur
294c0 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
294d0 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
294e0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
294f0 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
29500 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
29510 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
29520 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
29530 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
29540 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74  n extra 2 - that
29550 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
29560 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
29570 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
29580 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
29590 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
295a0 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20  ct 0 or 1 could 
295b0 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
295c0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
295d0 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55  pParse is not NU
295e0 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52 49 41  LL then TK_VARIA
295f0 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70 41 20  BLE terms in pA 
29600 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20 69 6e  with bindings in
29610 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52 65 70  .** pParse->pRep
29620 72 65 70 61 72 65 20 63 61 6e 20 62 65 20 6d 61  repare can be ma
29630 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 6c 69  tched against li
29640 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20 20 54  terals in pB.  T
29650 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70  he .** pParse->p
29660 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 62 69  Vdbe->expmask bi
29670 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74 65 64  tmask is updated
29680 20 66 6f 72 20 65 61 63 68 20 76 61 72 69 61 62   for each variab
29690 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a  le referenced..*
296a0 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 4e  * If pParse is N
296b0 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61 6c 20  ULL (the normal 
296c0 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79 20 54  case) then any T
296d0 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d 20  K_VARIABLE term 
296e0 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  in .** Argument 
296f0 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20 6e 6f  pParse should no
29700 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e 20  rmally be NULL. 
29710 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
29720 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a 20 70  L and pA or.** p
29730 42 20 63 61 75 73 65 73 20 61 20 72 65 74 75 72  B causes a retur
29740 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f  n value of 2..*/
29750 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
29760 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70  Compare(Parse *p
29770 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 41 2c  Parse, Expr *pA,
29780 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69   Expr *pB, int i
29790 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62  Tab){.  u32 comb
297a0 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28  inedFlags;.  if(
297b0 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
297c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
297d0 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20  ==pA ? 0 : 2;.  
297e0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 20 26  }.  if( pParse &
297f0 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  & pA->op==TK_VAR
29800 49 41 42 4c 45 20 26 26 20 65 78 70 72 43 6f 6d  IABLE && exprCom
29810 70 61 72 65 56 61 72 69 61 62 6c 65 28 70 50 61  pareVariable(pPa
29820 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29 7b 0a  rse, pA, pB) ){.
29830 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
29840 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  }.  combinedFlag
29850 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20  s = pA->flags | 
29860 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28  pB->flags;.  if(
29870 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
29880 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
29890 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61      if( (pA->fla
298a0 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f  gs&pB->flags&EP_
298b0 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20  IntValue)!=0 && 
298c0 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42  pA->u.iValue==pB
298d0 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20  ->u.iValue ){.  
298e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
298f0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
29900 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
29910 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20  op!=pB->op ){.  
29920 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
29930 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
29940 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
29950 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
29960 2c 70 42 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20  ,pB,iTab)<2 ){. 
29970 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
29980 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d     }.    if( pB-
29990 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
299a0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
299b0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41  mpare(pParse, pA
299c0 2c 70 42 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29  ,pB->pLeft,iTab)
299d0 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
299e0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
299f0 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
29a00 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
29a10 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21  OLUMN && pA->op!
29a20 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26  =TK_AGG_COLUMN &
29a30 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  & pA->u.zToken )
29a40 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
29a50 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  ==TK_FUNCTION ){
29a60 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
29a70 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e  e3StrICmp(pA->u.
29a80 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
29a90 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ken)!=0 ) return
29aa0 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
29ab0 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a  ( strcmp(pA->u.z
29ac0 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
29ad0 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  en)!=0 ){.      
29ae0 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54  return pA->op==T
29af0 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20  K_COLLATE ? 1 : 
29b00 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
29b10 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
29b20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
29b30 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
29b40 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
29b50 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   2;.  if( ALWAYS
29b60 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ((combinedFlags 
29b70 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d  & EP_TokenOnly)=
29b80 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63  =0) ){.    if( c
29b90 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
29ba0 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65  P_xIsSelect ) re
29bb0 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
29bc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
29bd0 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d 3e 70  re(pParse, pA->p
29be0 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  Left, pB->pLeft,
29bf0 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
29c00 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
29c10 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
29c20 61 72 73 65 2c 20 70 41 2d 3e 70 52 69 67 68 74  arse, pA->pRight
29c30 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pB->pRight, iT
29c40 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
29c50 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
29c60 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
29c70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e  A->x.pList, pB->
29c80 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29  x.pList, iTab) )
29c90 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
29ca0 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69  f( ALWAYS((combi
29cb0 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65  nedFlags & EP_Re
29cc0 64 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70 41  duced)==0) && pA
29cd0 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op!=TK_STRING 
29ce0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  ){.      if( pA-
29cf0 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
29d00 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32  olumn ) return 2
29d10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  ;.      if( pA->
29d20 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
29d30 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70  le .       && (p
29d40 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  A->iTable!=iTab 
29d50 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61  || NEVER(pB->iTa
29d60 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72  ble>=0)) ) retur
29d70 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 2;.    }.  }. 
29d80 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
29d90 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
29da0 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
29db0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
29dc0 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
29dd0 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65  l and .** non-ze
29de0 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65  ro if they diffe
29df0 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  r in any way..**
29e00 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
29e10 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
29e20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
29e30 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
29e40 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
29e50 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
29e60 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
29e70 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
29e80 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
29e90 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
29ea0 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ne might return 
29eb0 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75  non-zero for equ
29ec0 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74  ivalent ExprList
29ed0 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20  s.  The.** only 
29ee0 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  consequence will
29ef0 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74   be disabled opt
29f00 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74  imizations.  But
29f10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
29f20 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75   must never retu
29f30 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20  rn 0 if the two 
29f40 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
29f50 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20   are different, 
29f60 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74  or.** a malfunct
29f70 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e  ion will result.
29f80 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
29f90 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e  pointers are con
29fa0 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68  sidered to be th
29fb0 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e  e same.  But a N
29fc0 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61  ULL pointer.** a
29fd0 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72  lways differs fr
29fe0 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f  om a non-NULL po
29ff0 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
2a000 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
2a010 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70  pare(ExprList *p
2a020 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c  A, ExprList *pB,
2a030 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e   int iTab){.  in
2a040 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
2a050 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75   && pB==0 ) retu
2a060 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d  rn 0;.  if( pA==
2a070 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74  0 || pB==0 ) ret
2a080 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d  urn 1;.  if( pA-
2a090 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70  >nExpr!=pB->nExp
2a0a0 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
2a0b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e  for(i=0; i<pA->n
2a0c0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2a0d0 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70  Expr *pExprA = p
2a0e0 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  A->a[i].pExpr;. 
2a0f0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20     Expr *pExprB 
2a100 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pB->a[i].pExpr
2a110 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b  ;.    if( pA->a[
2a120 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42  i].sortOrder!=pB
2a130 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2a140 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2a150 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2a160 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72  Compare(0, pExpr
2a170 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29  A, pExprB, iTab)
2a180 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
2a190 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2a1a0 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74  /*.** Like sqlit
2a1b0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29 20  e3ExprCompare() 
2a1c0 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20 6f  except COLLATE o
2a1d0 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20  perators at the 
2a1e0 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72 65  top-level.** are
2a1f0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74   ignored..*/.int
2a200 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2a210 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70 41  areSkip(Expr *pA
2a220 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
2a230 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20  iTab){.  return 
2a240 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2a250 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20 20 20  re(0,.          
2a260 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b     sqlite3ExprSk
2a270 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a 20  ipCollate(pA),. 
2a280 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2a290 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2a2a0 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20 20 20  te(pB),.        
2a2b0 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f       iTab);.}../
2a2c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
2a2d0 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65   if we can prove
2a2e0 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c   the pE2 will al
2a2f0 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20  ways be true if 
2a300 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20  pE1 is.** true. 
2a310 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
2a320 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c   we cannot compl
2a330 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72  ete the proof or
2a340 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a   if pE2 might.**
2a350 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d   be false.  Exam
2a360 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
2a370 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE1: x==5       
2a380 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
2a390 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72        Result: tr
2a3a0 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
2a3b0 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78  >0        pE2: x
2a3c0 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
2a3d0 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Result: false.**
2a3e0 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20       pE1: x=21  
2a3f0 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f       pE2: x=21 O
2a400 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c  R y=43     Resul
2a410 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
2a420 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70  E1: x!=123     p
2a430 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
2a440 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
2a450 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
2a460 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20  =?1      pE2: x 
2a470 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2a480 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
2a490 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c     pE1: x IS NUL
2a4a0 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54  L  pE2: x IS NOT
2a4b0 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
2a4c0 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
2a4d0 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45  1: x IS ?2    pE
2a4e0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2a4f0 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73      Reuslt: fals
2a500 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d  e.**.** When com
2a510 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e  paring TK_COLUMN
2a520 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70   nodes between p
2a530 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70  E1 and pE2, if p
2a540 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69  E2 has.** Expr.i
2a550 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73  Table<0 then ass
2a560 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62  ume a table numb
2a570 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62  er given by iTab
2a580 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73  ..**.** If pPars
2a590 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
2a5a0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f  hen the values o
2a5b0 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65  f bound variable
2a5c0 73 20 69 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a  s in pE1 are .**
2a5d0 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73   compared agains
2a5e0 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73  t literal values
2a5f0 20 69 6e 20 70 45 32 20 61 6e 64 20 70 50 61 72   in pE2 and pPar
2a600 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61  se->pVdbe->expma
2a610 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65  sk is.** modifie
2a620 64 20 74 6f 20 72 65 63 6f 72 64 20 77 68 69 63  d to record whic
2a630 68 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65  h bound variable
2a640 73 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64  s are referenced
2a650 2e 20 20 49 66 20 70 50 61 72 73 65 20 0a 2a 2a  .  If pParse .**
2a660 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66   is NULL, then f
2a670 61 6c 73 65 20 77 69 6c 6c 20 62 65 20 72 65 74  alse will be ret
2a680 75 72 6e 65 64 20 69 66 20 70 45 31 20 63 6f 6e  urned if pE1 con
2a690 74 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20  tains any bound 
2a6a0 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
2a6b0 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   When in doubt, 
2a6c0 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52  return false.  R
2a6d0 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69  eturning true mi
2a6e0 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
2a6f0 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76  rmance.** improv
2a700 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e  ement.  Returnin
2a710 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61  g false might ca
2a720 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  use a performanc
2a730 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74  e reduction, but
2a740 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61  .** it will alwa
2a750 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72  ys give the corr
2a760 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69  ect answer and i
2a770 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73  s hence always s
2a780 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  afe..*/.int sqli
2a790 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
2a7a0 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pr(Parse *pParse
2a7b0 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70  , Expr *pE1, Exp
2a7c0 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62  r *pE2, int iTab
2a7d0 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
2a7e0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2a7f0 73 65 2c 20 70 45 31 2c 20 70 45 32 2c 20 69 54  se, pE1, pE2, iT
2a800 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ab)==0 ){.    re
2a810 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
2a820 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  ( pE2->op==TK_OR
2a830 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45  .   && (sqlite3E
2a840 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
2a850 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2a860 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20  >pLeft, iTab).  
2a870 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2a880 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2a890 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 31  Expr(pParse, pE1
2a8a0 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69  , pE2->pRight, i
2a8b0 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20  Tab) ).  ){.    
2a8c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2a8d0 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
2a8e0 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  NOTNULL && pE1->
2a8f0 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26  op!=TK_ISNULL &&
2a900 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 20   pE1->op!=TK_IS 
2a910 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20  ){.    Expr *pX 
2a920 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
2a930 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e 70 4c  pCollate(pE1->pL
2a940 65 66 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  eft);.    testca
2a950 73 65 28 20 70 58 21 3d 70 45 31 2d 3e 70 4c 65  se( pX!=pE1->pLe
2a960 66 74 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ft );.    if( sq
2a970 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2a980 28 70 50 61 72 73 65 2c 20 70 58 2c 20 70 45 32  (pParse, pX, pE2
2a990 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d  ->pLeft, iTab)==
2a9a0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
2a9b0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2a9c0 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2a9d0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2a9e0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2a9f0 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
2aa00 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64  e walker.** to d
2aa10 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65  etermine if an e
2aa20 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
2aa30 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65   evaluated by re
2aa40 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a  ference to the.*
2aa50 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69  * index only, wi
2aa60 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
2aa70 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20  do a search for 
2aa80 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2aa90 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79  g.** table entry
2aaa0 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e  .  The IdxCover.
2aab0 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68  pIdx field is th
2aac0 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76  e index.  IdxCov
2aad0 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68  er.iCur.** is th
2aae0 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  e cursor for the
2aaf0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63   table..*/.struc
2ab00 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49  t IdxCover {.  I
2ab10 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
2ab20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
2ab30 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f  be tested for co
2ab40 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  verage */.  int 
2ab50 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  iCur;        /* 
2ab60 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
2ab70 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72  r the table corr
2ab80 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
2ab90 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   index */.};../*
2aba0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
2abb0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65   if there are re
2abc0 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2abd0 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a  mns in table .**
2abe0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
2abf0 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20  Cover->iCur can 
2ac00 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69  be satisfied usi
2ac10 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  ng the index.** 
2ac20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
2ac30 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73  over->pIdx..*/.s
2ac40 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64  tatic int exprId
2ac50 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70  xCover(Walker *p
2ac60 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2ac70 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
2ac80 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2ac90 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54  .   && pExpr->iT
2aca0 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
2acb0 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
2acc0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f  .   && sqlite3Co
2acd0 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c  lumnOfIndex(pWal
2ace0 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2acf0 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69  ->pIdx, pExpr->i
2ad00 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20  Column)<0.  ){. 
2ad10 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
2ad20 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  e = 1;.    retur
2ad30 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
2ad40 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2ad50 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
2ad60 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
2ad70 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74   index pIdx on t
2ad80 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
2ad90 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77   iCur contains w
2ada0 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65  ill.** the expre
2adb0 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
2adc0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
2add0 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65   index does cove
2ade0 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  r the.** express
2adf0 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ion and false if
2ae00 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
2ae10 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73  ssion references
2ae20 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a   table columns.*
2ae30 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66  * that are not f
2ae40 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65  ound in the inde
2ae50 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e  x pIdx..**.** An
2ae60 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20   index covering 
2ae70 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65  an expression me
2ae80 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70  ans that the exp
2ae90 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a  ression can be.*
2aea0 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e  * evaluated usin
2aeb0 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78  g only the index
2aec0 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76   and without hav
2aed0 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  ing to lookup th
2aee0 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
2aef0 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a  ng table entry..
2af00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2af10 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78  prCoveredByIndex
2af20 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  (.  Expr *pExpr,
2af30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
2af40 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65  ndex to be teste
2af50 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
2af60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2af70 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
2af80 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
2af90 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20  nding table */. 
2afa0 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
2afb0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2afc0 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  x that might be 
2afd0 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67  used for coverag
2afe0 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72  e */.){.  Walker
2aff0 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78   w;.  struct Idx
2b000 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65  Cover xcov;.  me
2b010 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
2b020 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69  of(w));.  xcov.i
2b030 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63  Cur = iCur;.  xc
2b040 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  ov.pIdx = pIdx;.
2b050 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2b060 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72  k = exprIdxCover
2b070 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65  ;.  w.u.pIdxCove
2b080 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c  r = &xcov;.  sql
2b090 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
2b0a0 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72   pExpr);.  retur
2b0b0 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a  n !w.eCode;.}...
2b0c0 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
2b0d0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2b0e0 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
2b0f0 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
2b100 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f   walker.** to co
2b110 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  unt references t
2b120 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  o table columns 
2b130 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  in the arguments
2b140 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65   of an .** aggre
2b150 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69  gate function, i
2b160 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65  n order to imple
2b170 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ment the.** sqli
2b180 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53  te3FunctionThisS
2b190 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  rc() routine..*/
2b1a0 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74  .struct SrcCount
2b1b0 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53   {.  SrcList *pS
2b1c0 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72  rc;   /* One par
2b1d0 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61  ticular FROM cla
2b1e0 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20  use in a nested 
2b1f0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  query */.  int n
2b200 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  This;       /* N
2b210 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2b220 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
2b230 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  n pSrcList */.  
2b240 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20  int nOther;     
2b250 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2b260 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
2b270 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f  mns in other FRO
2b280 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a  M clauses */.};.
2b290 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
2b2a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
2b2b0 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2b2c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b2d0 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c  exprSrcCount(Wal
2b2e0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2b2f0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a  pr *pExpr){.  /*
2b300 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20   The NEVER() on 
2b310 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20  the second term 
2b320 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74  is because sqlit
2b330 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
2b340 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20  isSrc().  ** is 
2b350 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65  always called be
2b360 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72  fore sqlite3Expr
2b370 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2b380 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20  s() and so the. 
2b390 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68   ** TK_COLUMNs h
2b3a0 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
2b3b0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
2b3c0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20  TK_AGG_COLUMN.  
2b3d0 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  If.  ** sqlite3F
2b3e0 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2b3f0 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66  rc() is used dif
2b400 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  ferently in the 
2b410 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a  future, the.  **
2b420 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65   NEVER() will ne
2b430 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64  ed to be removed
2b440 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  . */.  if( pExpr
2b450 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
2b460 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e  || NEVER(pExpr->
2b470 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2b480 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  N) ){.    int i;
2b490 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43  .    struct SrcC
2b4a0 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65  ount *p = pWalke
2b4b0 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a  r->u.pSrcCount;.
2b4c0 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
2b4d0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
2b4e0 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63   int nSrc = pSrc
2b4f0 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20   ? pSrc->nSrc : 
2b500 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
2b510 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSrc; i++){.  
2b520 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2b530 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69  Table==pSrc->a[i
2b540 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ].iCursor ) brea
2b550 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
2b560 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20   i<nSrc ){.     
2b570 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20   p->nThis++;.   
2b580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
2b590 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d  >nOther++;.    }
2b5a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2b5b0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2b5c0 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
2b5d0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67  f any of the arg
2b5e0 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45  uments to the pE
2b5f0 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66  xpr Function ref
2b600 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69  erence.** pSrcLi
2b610 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  st.  Return true
2b620 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c   if they do.  Al
2b630 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  so return true i
2b640 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  f the function.*
2b650 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e  * has no argumen
2b660 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63  ts or has only c
2b670 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
2b680 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  s.  Return false
2b690 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66   if pExpr.** ref
2b6a0 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20  erences columns 
2b6b0 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20  but not columns 
2b6c0 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20  of tables found 
2b6d0 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  in pSrcList..*/.
2b6e0 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74  int sqlite3Funct
2b6f0 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45  ionUsesThisSrc(E
2b700 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c  xpr *pExpr, SrcL
2b710 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a  ist *pSrcList){.
2b720 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
2b730 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e  ruct SrcCount cn
2b740 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  t;.  assert( pEx
2b750 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
2b760 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78  UNCTION );.  w.x
2b770 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
2b780 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77  xprSrcCount;.  w
2b790 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2b7a0 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63   = 0;.  w.u.pSrc
2b7b0 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20  Count = &cnt;.  
2b7c0 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c  cnt.pSrc = pSrcL
2b7d0 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73  ist;.  cnt.nThis
2b7e0 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68   = 0;.  cnt.nOth
2b7f0 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
2b800 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77  3WalkExprList(&w
2b810 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
2b820 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e  );.  return cnt.
2b830 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e  nThis>0 || cnt.n
2b840 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Other==0;.}../*.
2b850 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
2b860 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
2b870 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72  Info->aCol[] arr
2b880 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
2b890 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
2b8a0 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
2b8b0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2b8c0 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
2b8d0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b8e0 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
2b8f0 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a  Column(sqlite3 *
2b900 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
2b910 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
2b920 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
2b930 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
2b940 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20  te(.       db,. 
2b950 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
2b960 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  l,.       sizeof
2b970 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29  (pInfo->aCol[0])
2b980 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
2b990 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
2b9a0 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
2b9b0 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
2b9c0 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
2b9d0 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
2b9e0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72  nfo->aFunc[] arr
2b9f0 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
2ba00 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
2ba10 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
2ba20 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2ba30 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
2ba40 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2ba50 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
2ba60 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62  Func(sqlite3 *db
2ba70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
2ba80 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
2ba90 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c  nfo->aFunc = sql
2baa0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
2bab0 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20  e(.       db, . 
2bac0 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75        pInfo->aFu
2bad0 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  nc,.       sizeo
2bae0 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
2baf0 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  ]),.       &pInf
2bb00 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->nFunc,.      
2bb10 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
2bb20 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
2bb30 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
2bb40 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  xprCallback for 
2bb50 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20  a tree walker.  
2bb60 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  It is used to.**
2bb70 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
2bb80 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2bb90 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
2bba0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2bbb0 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
2bbc0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
2bbd0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
2bbe0 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
2bbf0 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65  eAggregate(Walke
2bc00 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2bc10 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
2bc20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
2bc30 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
2bc40 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20  >u.pNC;.  Parse 
2bc50 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
2bc60 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
2bc70 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
2bc80 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
2bc90 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
2bca0 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b  = pNC->pAggInfo;
2bcb0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
2bcc0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
2bcd0 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
2bce0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
2bcf0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  UMN: {.      tes
2bd00 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2bd10 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
2bd20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2bd30 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2bd40 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
2bd50 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
2bd60 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   if the column i
2bd70 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
2bd80 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2bd90 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  OM.      ** clau
2bda0 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
2bdb0 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  ate query */.   
2bdc0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53     if( ALWAYS(pS
2bdd0 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  rcList!=0) ){.  
2bde0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
2bdf0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2be00 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a   = pSrcList->a;.
2be10 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2be20 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
2be30 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
2be40 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
2be50 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
2be60 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pCol;.          
2be70 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2be80 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2be90 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2bea0 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2beb0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2bec0 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
2bed0 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
2bee0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
2bef0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
2bf00 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
2bf10 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20  pExpr refers to 
2bf20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  a table.        
2bf30 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69      ** that is i
2bf40 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2bf50 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
2bf60 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20  te query.  .    
2bf70 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2bf80 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61         ** Make a
2bf90 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
2bfa0 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e  column in pAggIn
2bfb0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68  fo->aCol[] if th
2bfc0 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
2bfd0 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74  ** is not an ent
2bfe0 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ry there already
2bff0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
2c000 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2c010 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
2c020 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d  pCol = pAggInfo-
2c030 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  >aCol;.         
2c040 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41     for(k=0; k<pA
2c050 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
2c060 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   k++, pCol++){. 
2c070 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2c080 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70   pCol->iTable==p
2c090 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
2c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0b0 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d    pCol->iColumn=
2c0c0 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
2c0d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c0e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2c0f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c100 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c110 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67      if( (k>=pAgg
2c120 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20  Info->nColumn). 
2c130 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2c140 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  k = addAggInfoCo
2c150 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  lumn(pParse->db,
2c160 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a   pAggInfo))>=0 .
2c170 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
2c180 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2c190 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
2c1a0 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  Col[k];.        
2c1b0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
2c1c0 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
2c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2c1e0 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ol->iTable = pEx
2c1f0 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
2c200 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2c210 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
2c220 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
2c230 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d          pCol->iM
2c240 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
2c250 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
2c260 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
2c270 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
2c280 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2c290 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
2c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2c2b0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  ( pAggInfo->pGro
2c2c0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
2c2d0 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e          int j, n
2c2e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c2f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20    ExprList *pGB 
2c300 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  = pAggInfo->pGro
2c310 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20  upBy;.          
2c320 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
2c330 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
2c340 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20  m = pGB->a;.    
2c350 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
2c360 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pGB->nExpr;.    
2c370 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2c380 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70  j=0; j<n; j++, p
2c390 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
2c3a0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
2c3b0 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pE = pTerm->pEx
2c3c0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2c3d0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
2c3e0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
2c3f0 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  E->iTable==pExpr
2c400 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
2c410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c420 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70    pE->iColumn==p
2c430 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
2c440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c450 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2c460 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  erColumn = j;.  
2c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c480 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2c490 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2c4d0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2c4e0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
2c4f0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2c500 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
2c510 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69  pAggInfo->nSorti
2c520 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20  ngColumn++;.    
2c530 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c550 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
2c560 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66  s now an entry f
2c570 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67  or pExpr in pAgg
2c580 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69  Info->aCol[] (ei
2c590 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
2c5a0 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77   ** because it w
2c5b0 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20  as there before 
2c5c0 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  or because we ju
2c5d0 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a  st created it)..
2c5e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43              ** C
2c5f0 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72  onvert the pExpr
2c600 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f   to be a TK_AGG_
2c610 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67  COLUMN referring
2c620 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   to that.       
2c630 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f       ** pAggInfo
2c640 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a  ->aCol[] entry..
2c650 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2c660 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53             ExprS
2c670 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
2c680 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
2c690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2c6a0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
2c6b0 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
2c6c0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
2c6d0 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   = TK_AGG_COLUMN
2c6e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
2c6f0 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36  xpr->iAgg = (i16
2c700 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  )k;.            
2c710 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2c720 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70   } /* endif pExp
2c730 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
2c740 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20  ->iCursor */.   
2c750 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f       } /* end lo
2c760 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  op over pSrcList
2c770 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2c780 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2c790 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ne;.    }.    ca
2c7a0 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
2c7b0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ON: {.      if( 
2c7c0 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20  (pNC->ncFlags & 
2c7d0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30  NC_InAggFunc)==0
2c7e0 0a 20 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b  .       && pWalk
2c7f0 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d  er->walkerDepth=
2c800 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20  =pExpr->op2.    
2c810 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
2c820 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2c830 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69  pExpr is a dupli
2c840 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  cate of another 
2c850 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20  aggregate .     
2c860 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74     ** function t
2c870 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  hat is already i
2c880 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73  n the pAggInfo s
2c890 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20  tructure.       
2c8a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75   */.        stru
2c8b0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
2c8c0 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66  *pItem = pAggInf
2c8d0 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20  o->aFunc;.      
2c8e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
2c8f0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2c900 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2c910 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2c920 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
2c930 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70   pItem->pExpr, p
2c940 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  Expr, -1)==0 ){.
2c950 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2c960 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
2c970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c980 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
2c990 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
2c9a0 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
2c9b0 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
2c9c0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
2c9d0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2c9e0 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
2c9f0 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
2ca00 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
2ca10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
2ca20 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
2ca30 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
2ca40 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
2ca50 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
2ca60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2ca70 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2ca80 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
2ca90 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
2caa0 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
2cab0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
2cac0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
2cad0 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
2cae0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
2caf0 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b   pItem->iMem = +
2cb00 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2cb10 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2cb20 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2cb30 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
2cb40 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
2cb50 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
2cb60 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
2cb70 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
2cb80 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
2cb90 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2cba0 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20  u.zToken, .     
2cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2cbc0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70  xpr->x.pList ? p
2cbd0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
2cbe0 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30  Expr : 0, enc, 0
2cbf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2cc00 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
2cc10 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b  & EP_Distinct ){
2cc20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2cc30 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
2cc40 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2cc50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
2cc60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2cc70 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
2cc80 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
2cc90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cca0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2ccb0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45        /* Make pE
2ccc0 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  xpr point to the
2ccd0 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67   appropriate pAg
2cce0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65  gInfo->aFunc[] e
2ccf0 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ntry.        */.
2cd00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2cd10 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2cd20 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
2cd30 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2cd40 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   );.        Expr
2cd50 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2cd60 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
2cd70 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  e);.        pExp
2cd80 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69  r->iAgg = (i16)i
2cd90 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
2cda0 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
2cdb0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  Info;.        re
2cdc0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2cdd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cde0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2cdf0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  Continue;.      
2ce00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
2ce10 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2ce20 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  e;.}.static int 
2ce30 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2ce40 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72  sInSelect(Walker
2ce50 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
2ce60 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55  t *pSelect){.  U
2ce70 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2ce80 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61 6c  pSelect);.  pWal
2ce90 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
2cea0 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  ++;.  return WRC
2ceb0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61  _Continue;.}.sta
2cec0 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65  tic void analyze
2ced0 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
2cee0 63 74 45 6e 64 28 57 61 6c 6b 65 72 20 2a 70 57  ctEnd(Walker *pW
2cef0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
2cf00 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45  Select){.  UNUSE
2cf10 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c  D_PARAMETER(pSel
2cf20 65 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  ect);.  pWalker-
2cf30 3e 77 61 6c 6b 65 72 44 65 70 74 68 2d 2d 3b 0a  >walkerDepth--;.
2cf40 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
2cf50 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
2cf60 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ssion looking fo
2cf70 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
2cf80 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72  tions and.** for
2cf90 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
2cfa0 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64  need to be added
2cfb0 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65   to AggInfo obje
2cfc0 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67  ct that pNC->pAg
2cfd0 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20  gInfo.** points 
2cfe0 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20  to.  Additional 
2cff0 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65  entries are made
2d000 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   on the AggInfo 
2d010 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63  object as.** nec
2d020 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  essary..**.** Th
2d030 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
2d040 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
2d050 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65   after the expre
2d060 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a  ssion has been.*
2d070 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71  * analyzed by sq
2d080 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
2d090 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Names()..*/.void
2d0a0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2d0b0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61  yzeAggregates(Na
2d0c0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
2d0d0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2d0e0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45  Walker w;.  w.xE
2d0f0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e  xprCallback = an
2d100 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a  alyzeAggregate;.
2d110 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2d120 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ack = analyzeAgg
2d130 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b  regatesInSelect;
2d140 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2d150 62 61 63 6b 32 20 3d 20 61 6e 61 6c 79 7a 65 41  back2 = analyzeA
2d160 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
2d170 74 45 6e 64 3b 0a 20 20 77 2e 77 61 6c 6b 65 72  tEnd;.  w.walker
2d180 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 77 2e 75  Depth = 0;.  w.u
2d190 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73  .pNC = pNC;.  as
2d1a0 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c  sert( pNC->pSrcL
2d1b0 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ist!=0 );.  sqli
2d1c0 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
2d1d0 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
2d1e0 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
2d1f0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2d200 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  es() for every e
2d210 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a  xpression in an.
2d220 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
2d230 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  st.  Return the 
2d240 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
2d250 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
2d260 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ror is found, th
2d270 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75  e analysis is cu
2d280 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64  t short..*/.void
2d290 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2d2a0 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43  yzeAggList(NameC
2d2b0 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
2d2c0 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
2d2d0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2d2e0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
2d2f0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
2d300 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  st ){.    for(pI
2d310 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
2d320 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
2d330 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
2d340 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2d350 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2d360 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d  ates(pNC, pItem-
2d370 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
2d380 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
2d390 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65  cate a single ne
2d3a0 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75  w register for u
2d3b0 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20  se to hold some 
2d3c0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
2d3d0 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ult..*/.int sqli
2d3e0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61  te3GetTempReg(Pa
2d3f0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
2d400 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
2d410 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pReg==0 ){.    r
2d420 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e  eturn ++pParse->
2d430 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nMem;.  }.  retu
2d440 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  rn pParse->aTemp
2d450 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54  Reg[--pParse->nT
2d460 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  empReg];.}../*.*
2d470 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72  * Deallocate a r
2d480 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20  egister, making 
2d490 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
2d4a0 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
2d4b0 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a  er.** purpose..*
2d4c0 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
2d4d0 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
2d4e0 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  being used by th
2d4f0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20  e column cache, 
2d500 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c  then.** the deal
2d510 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65  location is defe
2d520 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63  rred until the c
2d530 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65  olumn cache line
2d540 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68   that uses.** th
2d550 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d  e register becom
2d560 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69  es stale..*/.voi
2d570 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2d580 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
2d590 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
2d5a0 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
2d5b0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2d5c0 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
2d5d0 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
2d5e0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
2d5f0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
2d600 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  *p;.    for(i=0,
2d610 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
2d620 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e  ache; i<pParse->
2d630 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20  nColCache; i++, 
2d640 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
2d650 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
2d660 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  .        p->temp
2d670 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Reg = 1;.       
2d680 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
2d690 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
2d6a0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
2d6b0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
2d6c0 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
2d6d0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
2d6e0 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
2d6f0 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
2d700 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
2d710 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2d720 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
2d730 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2d740 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
2d750 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d   n;.  if( nReg==
2d760 31 20 29 20 72 65 74 75 72 6e 20 73 71 6c 69 74  1 ) return sqlit
2d770 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
2d780 72 73 65 29 3b 0a 20 20 69 20 3d 20 70 50 61 72  rse);.  i = pPar
2d790 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20  se->iRangeReg;. 
2d7a0 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61   n = pParse->nRa
2d7b0 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52  ngeReg;.  if( nR
2d7c0 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73  eg<=n ){.    ass
2d7d0 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75  ert( !usedAsColu
2d7e0 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
2d7f0 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20  i, i+n-1) );.   
2d800 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2d810 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  eg += nReg;.    
2d820 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2d830 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c  g -= nReg;.  }el
2d840 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72  se{.    i = pPar
2d850 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
2d860 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
2d870 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nReg;.  }.  retu
2d880 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  rn i;.}.void sql
2d890 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2d8a0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
2d8b0 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
2d8c0 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e  t nReg){.  if( n
2d8d0 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71  Reg==1 ){.    sq
2d8e0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2d8f0 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 67  Reg(pParse, iReg
2d900 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2d910 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
2d920 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
2d930 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b  se, iReg, nReg);
2d940 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72  .  if( nReg>pPar
2d950 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b  se->nRangeReg ){
2d960 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
2d970 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20  ngeReg = nReg;. 
2d980 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
2d990 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d  eReg = iReg;.  }
2d9a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
2d9b0 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  ll temporary reg
2d9c0 69 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20  isters as being 
2d9d0 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  unavailable for 
2d9e0 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reuse..*/.void s
2d9f0 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
2da00 65 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  egCache(Parse *p
2da10 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
2da20 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a  ->nTempReg = 0;.
2da30 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
2da40 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Reg = 0;.}../*.*
2da50 2a 20 56 61 6c 69 64 61 74 65 20 74 68 61 74 20  * Validate that 
2da60 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  no temporary reg
2da70 69 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68  ister falls with
2da80 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a  in the range of.
2da90 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74  ** iFirst..iLast
2daa0 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68  , inclusive.  Th
2dab0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
2dac0 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74  ly call from wit
2dad0 68 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20  hin assert().** 
2dae0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23  statements..*/.#
2daf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2db00 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f  UG.int sqlite3No
2db10 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72  TempsInRange(Par
2db20 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
2db30 69 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73  iFirst, int iLas
2db40 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
2db50 66 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  f( pParse->nRang
2db60 65 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61  eReg>0.   && pPa
2db70 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70  rse->iRangeReg+p
2db80 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2db90 20 3e 20 69 46 69 72 73 74 0a 20 20 20 26 26 20   > iFirst.   && 
2dba0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2dbb0 67 20 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b 0a  g <= iLast.  ){.
2dbc0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2dbd0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
2dbe0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2dbf0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2dc00 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2dc10 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70  [i]>=iFirst && p
2dc20 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2dc30 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20  i]<=iLast ){.   
2dc40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
2dc50 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2dc60 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
2dc70 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a     QLITE_DEBUG */.