/ Hex Artifact Content
Login

Artifact c83f799f3e5e3f3863bd0716119383e4a062d00a1e34e7273a78555918840a7c:


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: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
0fd0: 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20  quence might be 
0fe0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20  determined by a 
0ff0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
1000: 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72  .** or by the pr
1010: 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75  esence of a colu
1020: 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  mn with a define
1030: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
1040: 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45  ence..** COLLATE
1050: 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20   operators take 
1060: 66 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65  first precedence
1070: 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73  .  Left operands
1080: 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65   take.** precede
1090: 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f  nce over right o
10a0: 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c  perands..*/.Coll
10b0: 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72  Seq *sqlite3Expr
10c0: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
10d0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
10e0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
10f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1100: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1110: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
1120: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
1130: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
1140: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
1150: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
1160: 50 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61  P_Generic ) brea
1170: 6b 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  k;.    if( op==T
1180: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1190: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
11a0: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
11b0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
11c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
11d0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f  TK_COLLATE || (o
11e0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
11f0: 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c  & p->op2==TK_COL
1200: 4c 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70  LATE) ){.      p
1210: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
1220: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
1230: 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e   ENC(db), 0, p->
1240: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1260: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
1270: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
1280: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1290: 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45      || op==TK_RE
12a0: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
12b0: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26  _TRIGGER).     &
12c0: 26 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  & p->pTab!=0.   
12d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d   ){.      /* op=
12e0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
12f0: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
1300: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
1310: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
1320: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1330: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1340: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1350: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1360: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1370: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1380: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1390: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
13a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
13b0: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
13c0: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
13d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
13e0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
13f0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
1400: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1420: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
1430: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
1440: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1450: 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66  Left && (p->pLef
1460: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1470: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
1480: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
1490: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
14a0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
14b0: 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74  ext  = p->pRight
14c0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
14d0: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
14e0: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
14f0: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
1500: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
1510: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1520: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
1530: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
1540: 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c          /* p->fl
1550: 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c  ags holds EP_Col
1560: 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66  late and p->pLef
1570: 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f  t->flags does no
1580: 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20  t.  And.        
1590: 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ** p->x.pSelect 
15a0: 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70  cannot.  So if p
15b0: 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73  ->x.pLeft exists
15c0: 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61  , it must hold a
15d0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61  t.        ** lea
15e0: 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74  st one EP_Collat
15f0: 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c  e. Thus the foll
1600: 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53  owing two ALWAYS
1610: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
1620: 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26   p->x.pList!=0 &
1630: 26 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61  & ALWAYS(!ExprHa
1640: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1650: 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20  xIsSelect)) ){. 
1660: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
1670: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1680: 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78  0; ALWAYS(i<p->x
1690: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20  .pList->nExpr); 
16a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
16b0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
16c0: 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74  perty(p->x.pList
16d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  ->a[i].pExpr, EP
16e0: 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20  _Collate) ){.   
16f0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74             pNext
1700: 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61   = p->x.pList->a
1710: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
1720: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1750: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20    }.        p = 
1760: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1770: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1780: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1790: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
17a0: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
17b0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
17c0: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
17d0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
17e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
17f0: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
1800: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1810: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
1820: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
1830: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
1840: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
1850: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1860: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
1870: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1880: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
1890: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
18a0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
18b0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
18c0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
18d0: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
18e0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
18f0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1900: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
1910: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
1920: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
1930: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
1940: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
1950: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
1960: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
1970: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
1980: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
1990: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
19a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19b0: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
19c0: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
19d0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
19e0: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
19f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a00: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
1a10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1a20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1a30: 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BLOB;.    }.  }
1a40: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
1a50: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
1a60: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
1a70: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
1a80: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
1a90: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
1aa0: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
1ab0: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
1ac0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1ad0: 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BLOB;.  }else{.
1ae0: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
1af0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
1b00: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
1b10: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
1b20: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
1b30: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
1b40: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
1b50: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
1b60: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
1b70: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
1b80: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1b90: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
1ba0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1bb0: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
1bc0: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
1bd0: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
1be0: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
1bf0: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
1c00: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
1c10: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
1c20: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
1c30: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
1c40: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
1c50: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1c60: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
1c70: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
1c80: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
1c90: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
1ca0: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
1cb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
1cc0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
1cd0: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70  ->op==TK_NE || p
1ce0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1cf0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1d00: 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65  _ISNOT );.  asse
1d10: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1d20: 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69   );.  aff = sqli
1d30: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1d40: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1d50: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
1d60: 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ht ){.    aff = 
1d70: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1d80: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52  finity(pExpr->pR
1d90: 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65  ight, aff);.  }e
1da0: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
1db0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1dc0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1dd0: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1de0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1df0: 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63  (pExpr->x.pSelec
1e00: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
1e10: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
1e20: 65 6c 73 65 20 69 66 28 20 61 66 66 3d 3d 30 20  else if( aff==0 
1e30: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c  ){.    aff = SQL
1e40: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
1e50: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
1e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1e70: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65  s a comparison e
1e80: 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27  xpression, eg. '
1e90: 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29  =', '<', IN(...)
1ea0: 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66   etc..** idx_aff
1eb0: 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66  inity is the aff
1ec0: 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65  inity of an inde
1ed0: 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75  xed column. Retu
1ee0: 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68  rn true.** if th
1ef0: 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66  e index with aff
1f00: 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69  inity idx_affini
1f10: 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  ty may be used t
1f20: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74  o implement.** t
1f30: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  he comparison in
1f40: 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pExpr..*/.int s
1f50: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
1f60: 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70  ityOk(Expr *pExp
1f70: 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69  r, char idx_affi
1f80: 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66  nity){.  char af
1f90: 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  f = comparisonAf
1fa0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
1fb0: 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a   switch( aff ){.
1fc0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1fd0: 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20  AFF_BLOB:.      
1fe0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61  return 1;.    ca
1ff0: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  se SQLITE_AFF_TE
2000: 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  XT:.      return
2010: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
2020: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
2030: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
2040: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2050: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
2060: 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ty(idx_affinity)
2070: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
2080: 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c  eturn the P5 val
2090: 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ue that should b
20a0: 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e  e used for a bin
20b0: 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  ary comparison.*
20c0: 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c  * opcode (OP_Eq,
20d0: 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65   OP_Ge etc.) use
20e0: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78  d to compare pEx
20f0: 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a  pr1 and pExpr2..
2100: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e  */.static u8 bin
2110: 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70  aryCompareP5(Exp
2120: 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20  r *pExpr1, Expr 
2130: 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d  *pExpr2, int jum
2140: 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61  pIfNull){.  u8 a
2150: 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74  ff = (char)sqlit
2160: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
2170: 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20  Expr2);.  aff = 
2180: 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61  (u8)sqlite3Compa
2190: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
21a0: 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75  1, aff) | (u8)ju
21b0: 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75  mpIfNull;.  retu
21c0: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
21d0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
21e0: 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69  r to the collati
21f0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  on sequence that
2200: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
2210: 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63  by.** a binary c
2220: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
2230: 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65  or comparing pLe
2240: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
2250: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74  *.** If the left
2260: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
2270: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
2280: 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20   sequence type, 
2290: 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73  then it is.** us
22a0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  ed. Otherwise th
22b0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
22c0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67  ence for the rig
22d0: 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ht hand expressi
22e0: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f  on.** is used, o
22f0: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42  r the default (B
2300: 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65  INARY) if neithe
2310: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  r expression has
2320: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20   a collating.** 
2330: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  type..**.** Argu
2340: 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74  ment pRight (but
2350: 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20   not pLeft) may 
2360: 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  be a null pointe
2370: 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
2380: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f  .** it is not co
2390: 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c  nsidered..*/.Col
23a0: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e  lSeq *sqlite3Bin
23b0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
23c0: 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  q(.  Parse *pPar
23d0: 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65  se, .  Expr *pLe
23e0: 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69  ft, .  Expr *pRi
23f0: 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ght.){.  CollSeq
2400: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72   *pColl;.  asser
2410: 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66  t( pLeft );.  if
2420: 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ( pLeft->flags &
2430: 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
2440: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2450: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2460: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
2470: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
2480: 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61   && (pRight->fla
2490: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
24a0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  !=0 ){.    pColl
24b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24c0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52  llSeq(pParse, pR
24d0: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
24e0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
24f0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2500: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
2510: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
2520: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
2530: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2540: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
2550: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2560: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
2570: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
2580: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
2590: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
25a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
25b0: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
25c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
25d0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
25e0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
25f0: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
2600: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
2610: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
2620: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
2630: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
2640: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
2650: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
2660: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
2670: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
2680: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20  e */.  int in1, 
2690: 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69  int in2, /* Regi
26a0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65  ster holding ope
26b0: 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rands */.  int d
26c0: 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
26d0: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75  Jump here if tru
26e0: 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  e.  */.  int jum
26f0: 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66  pIfNull    /* If
2700: 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65   true, jump if e
2710: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
2720: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
2730: 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72  t p5;.  int addr
2740: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b  ;.  CollSeq *p4;
2750: 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33  ..  p4 = sqlite3
2760: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
2770: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
2780: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70  ft, pRight);.  p
2790: 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  5 = binaryCompar
27a0: 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68  eP5(pLeft, pRigh
27b0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
27c0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
27d0: 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73  VdbeAddOp4(pPars
27e0: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
27f0: 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31  , in2, dest, in1
2800: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
2820: 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53  id*)p4, P4_COLLS
2830: 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EQ);.  sqlite3Vd
2840: 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73  beChangeP5(pPars
2850: 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35  e->pVdbe, (u8)p5
2860: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
2870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2880: 6e 20 74 72 75 65 20 69 66 20 65 78 70 72 65 73  n true if expres
2890: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20  sion pExpr is a 
28a0: 76 65 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65  vector, or false
28b0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
28c0: 2a 20 41 20 76 65 63 74 6f 72 20 69 73 20 64 65  * A vector is de
28d0: 66 69 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70  fined as any exp
28e0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73  ression that res
28f0: 75 6c 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d  ults in two or m
2900: 6f 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f  ore.** columns o
2910: 66 20 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79  f result.  Every
2920: 20 54 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20   TK_VECTOR node 
2930: 69 73 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63  is an vector bec
2940: 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73  ause the.** pars
2950: 65 72 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65  er will not gene
2960: 72 61 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52  rate a TK_VECTOR
2970: 20 77 69 74 68 20 66 65 77 65 72 20 74 68 61 6e   with fewer than
2980: 20 74 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a   two entries..**
2990: 20 42 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54   But a TK_SELECT
29a0: 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
29b0: 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73   a vector or a s
29c0: 63 61 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c  calar. It is onl
29d0: 79 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20  y.** considered 
29e0: 61 20 76 65 63 74 6f 72 20 69 66 20 69 74 20 68  a vector if it h
29f0: 61 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72  as two or more r
2a00: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  esult columns..*
2a10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2a20: 72 49 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a  rIsVector(Expr *
2a30: 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e  pExpr){.  return
2a40: 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
2a50: 6f 72 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b  orSize(pExpr)>1;
2a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
2a70: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
2a80: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
2a90: 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79  rgument is of ty
2aa0: 70 65 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a  pe TK_VECTOR .**
2ab0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
2ac0: 65 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  er of expression
2ad0: 73 20 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e  s in the vector.
2ae0: 20 4f 72 2c 20 69 66 20 74 68 65 20 65 78 70 72   Or, if the expr
2af0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73  ession.** is a s
2b00: 75 62 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72  ub-select, retur
2b10: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2b20: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73  columns in the s
2b30: 75 62 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a  ub-select. For.*
2b40: 2a 20 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65  * any other type
2b50: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   of expression, 
2b60: 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74  return 1..*/.int
2b70: 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
2b80: 6f 72 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78  orSize(Expr *pEx
2b90: 70 72 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70  pr){.  u8 op = p
2ba0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
2bb0: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
2bc0: 29 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70  ) op = pExpr->op
2bd0: 32 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  2;.  if( op==TK_
2be0: 56 45 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65  VECTOR ){.    re
2bf0: 74 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c  turn pExpr->x.pL
2c00: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65  ist->nExpr;.  }e
2c10: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53  lse if( op==TK_S
2c20: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74  ELECT ){.    ret
2c30: 75 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  urn pExpr->x.pSe
2c40: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
2c50: 78 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  xpr;.  }else{.  
2c60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2c80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
2c90: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  ubexpression of 
2ca0: 70 56 65 63 74 6f 72 20 74 68 61 74 20 69 73 20  pVector that is 
2cb0: 74 68 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75  the i-th.** colu
2cc0: 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  mn of the vector
2cd0: 20 28 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74   (numbered start
2ce0: 69 6e 67 20 77 69 74 68 20 30 29 2e 20 20 54 68  ing with 0).  Th
2cf0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
2d00: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 20 69   ensure that i i
2d10: 73 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a  s within range..
2d20: 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72  **.** If pVector
2d30: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61   is really a sca
2d40: 6c 61 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72  lar (and "scalar
2d50: 22 20 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20  " here includes 
2d60: 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68  subqueries.** th
2d70: 61 74 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  at return a sing
2d80: 6c 65 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e  le column!) then
2d90: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20   return pVector 
2da0: 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  unmodified..**.*
2db0: 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e  * pVector retain
2dc0: 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  s ownership of t
2dd0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 75 62 65  he returned sube
2de0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2df0: 20 49 66 20 74 68 65 20 76 65 63 74 6f 72 20 69   If the vector i
2e00: 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  s a (SELECT ...)
2e10: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
2e20: 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73  sion returned is
2e30: 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70  .** just the exp
2e40: 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20  ression for the 
2e50: 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  i-th term of the
2e60: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
2e70: 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72   may.** not be r
2e80: 65 61 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74  eady for evaluat
2e90: 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ion because the 
2ea0: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73  table cursor has
2eb0: 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e   not yet.** been
2ec0: 20 70 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a   positioned..*/.
2ed0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63  Expr *sqlite3Vec
2ee0: 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
2ef0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69  Expr *pVector, i
2f00: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
2f10: 20 69 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65   i<sqlite3ExprVe
2f20: 63 74 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72  ctorSize(pVector
2f30: 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ) );.  if( sqlit
2f40: 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
2f50: 56 65 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61  Vector) ){.    a
2f60: 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e  ssert( pVector->
2f70: 6f 70 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f  op2==0 || pVecto
2f80: 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
2f90: 45 52 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ER );.    if( pV
2fa0: 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  ector->op==TK_SE
2fb0: 4c 45 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d  LECT || pVector-
2fc0: 3e 6f 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  >op2==TK_SELECT 
2fd0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2fe0: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65  pVector->x.pSele
2ff0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ct->pEList->a[i]
3000: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73  .pExpr;.    }els
3010: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
3020: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
3030: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
3040: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3050: 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   pVector;.}../*.
3060: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
3070: 65 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72  eturn a new Expr
3080: 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77 68   object which wh
3090: 65 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20  en passed to.** 
30a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
30b0: 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  ) will generate 
30c0: 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f  all necessary co
30d0: 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a  de to compute.**
30e0: 20 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63   the iField-th c
30f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
3100: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70  tor expression p
3110: 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74  Vector..**.** It
3120: 20 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74   is ok for pVect
3130: 6f 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  or to be a scala
3140: 72 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46  r (as long as iF
3150: 69 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49  ield==0).  .** I
3160: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69  n that case, thi
3170: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
3180: 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
3190: 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Dup()..**.** The
31a0: 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65   caller owns the
31b0: 20 72 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f   returned Expr o
31c0: 62 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65 73  bject and is res
31d0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  ponsible for.** 
31e0: 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
31f0: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
3200: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
3210: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   freed..**.** Th
3220: 65 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73  e caller retains
3230: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56   ownership of pV
3240: 65 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74  ector.  If pVect
3250: 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43  or is a TK_SELEC
3260: 54 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  T,.** then the r
3270: 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77  eturned object w
3280: 69 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56  ill reference pV
3290: 65 63 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65  ector and so pVe
32a0: 63 74 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e  ctor must remain
32b0: 0a 2a 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68  .** valid for th
32c0: 65 20 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65  e life of the re
32d0: 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20  turned object.  
32e0: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
32f0: 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20  TK_VECTOR.** or 
3300: 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
3310: 69 6f 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e  ion, then it can
3320: 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73   be deleted as s
3330: 6f 6f 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74  oon as this rout
3340: 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a  ine.** returns..
3350: 2a 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f  **.** A trick to
3360: 20 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45   cause a TK_SELE
3370: 43 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  CT pVector to be
3380: 20 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65   deleted togethe
3390: 72 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65  r with.** the re
33a0: 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65  turned Expr obje
33b0: 63 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20  ct is to attach 
33c0: 74 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74  the pVector to t
33d0: 68 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a  he pRight field.
33e0: 2a 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ** of the return
33f0: 65 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  ed TK_SELECT_COL
3400: 55 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e  UMN Expr object.
3410: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
3420: 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69  3ExprForVectorFi
3430: 65 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  eld(.  Parse *pP
3440: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
3450: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
3460: 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f  /.  Expr *pVecto
3470: 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r,       /* The 
3480: 76 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66  vector.  List of
3490: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
34a0: 61 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a  a sub-SELECT */.
34b0: 20 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20    int iField    
34c0: 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
34d0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65  column of the ve
34e0: 63 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a  ctor to return *
34f0: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65  /.){.  Expr *pRe
3500: 74 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72  t;.  if( pVector
3510: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3520: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3530: 56 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20  Vector->flags & 
3540: 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a  EP_xIsSelect );.
3550: 20 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45      /* The TK_SE
3560: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72  LECT_COLUMN Expr
3570: 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20   node:.    **.  
3580: 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20    ** pLeft:     
3590: 20 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f        pVector co
35a0: 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45  ntaining TK_SELE
35b0: 43 54 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64  CT.  Not deleted
35c0: 2e 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a  ..    ** pRight:
35d0: 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73            not us
35e0: 65 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69  ed.  But recursi
35f0: 76 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20  vely deleted..  
3600: 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20    ** iColumn:   
3610: 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61        Index of a
3620: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74   column in pVect
3630: 6f 72 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65  or.    ** iTable
3640: 3a 20 20 20 20 20 20 20 20 20 20 30 20 6f 72 20  :          0 or 
3650: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
3660: 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53  lumns on the LHS
3670: 20 6f 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e   of an assignmen
3680: 74 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e  t.    ** pLeft->
3690: 69 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20  iTable:   First 
36a0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
36b0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
36c0: 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20  result, or 0.   
36d0: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
36e0: 20 20 20 20 20 69 66 20 74 68 65 20 72 65 73 75       if the resu
36f0: 6c 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f  lt is not yet co
3700: 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  mputed..    **. 
3710: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70     ** sqlite3Exp
3720: 72 44 65 6c 65 74 65 28 29 20 73 70 65 63 69 66  rDelete() specif
3730: 69 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65  ically skips the
3740: 20 72 65 63 75 72 73 69 76 65 20 64 65 6c 65 74   recursive delet
3750: 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66  e of.    ** pLef
3760: 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43  t on TK_SELECT_C
3770: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75  OLUMN nodes.  Bu
3780: 74 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c  t pRight is foll
3790: 6f 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72  owed, so pVector
37a0: 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61  .    ** can be a
37b0: 74 74 61 63 68 65 64 20 74 6f 20 70 52 69 67 68  ttached to pRigh
37c0: 74 20 74 6f 20 63 61 75 73 65 20 74 68 69 73 20  t to cause this 
37d0: 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e  node to take own
37e0: 65 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a  ership of.    **
37f0: 20 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63   pVector.  Typic
3800: 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20  ally there will 
3810: 62 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53  be multiple TK_S
3820: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  ELECT_COLUMN nod
3830: 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  es.    ** with t
3840: 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f  he same pLeft po
3850: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56 65  inter to the pVe
3860: 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f  ctor, but only o
3870: 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ne of them.    *
3880: 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70  * will own the p
3890: 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  Vector..    */. 
38a0: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
38b0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
38c0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c  K_SELECT_COLUMN,
38d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
38e0: 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52  pRet ){.      pR
38f0: 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46  et->iColumn = iF
3900: 69 65 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74  ield;.      pRet
3910: 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f  ->pLeft = pVecto
3920: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
3930: 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20  ert( pRet==0 || 
3940: 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  pRet->iTable==0 
3950: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3960: 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d  if( pVector->op=
3970: 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65  =TK_VECTOR ) pVe
3980: 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e  ctor = pVector->
3990: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  x.pList->a[iFiel
39a0: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52  d].pExpr;.    pR
39b0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
39c0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
39d0: 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d  pVector, 0);.  }
39e0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
39f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72  }../*.** If expr
3a00: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
3a10: 6f 66 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43  of type TK_SELEC
3a20: 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  T, generate code
3a30: 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20   to evaluate.** 
3a40: 69 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72  it. Return the r
3a50: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
3a60: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
3a70: 74 6f 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68  tored (or, if th
3a80: 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
3a90: 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68   returns more th
3aa0: 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74  an one column, t
3ab0: 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61  he first in an a
3ac0: 72 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73  rray.** of regis
3ad0: 74 65 72 73 20 69 6e 20 77 68 69 63 68 20 74 68  ters in which th
3ae0: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
3af0: 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ed)..**.** If pE
3b00: 78 70 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f  xpr is not a TK_
3b10: 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f  SELECT expressio
3b20: 6e 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  n, return 0..*/.
3b30: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 43  static int exprC
3b40: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72  odeSubselect(Par
3b50: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
3b60: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
3b70: 72 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  reg = 0;.#ifndef
3b80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
3b90: 51 55 45 52 59 0a 20 20 69 66 28 20 70 45 78 70  QUERY.  if( pExp
3ba0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
3bb0: 20 29 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71   ){.    reg = sq
3bc0: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
3bd0: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
3be0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
3bf0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67  dif.  return reg
3c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
3c10: 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e  ent pVector poin
3c20: 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65  ts to a vector e
3c30: 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68  xpression - eith
3c40: 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a  er a TK_VECTOR.*
3c50: 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74  * or TK_SELECT t
3c60: 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  hat returns more
3c70: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
3c80: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
3c90: 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72  returns.** the r
3ca0: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f  egister number o
3cb0: 66 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61  f a register tha
3cc0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  t contains the v
3cd0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  alue of.** eleme
3ce0: 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65  nt iField of the
3cf0: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   vector..**.** I
3d00: 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54  f pVector is a T
3d10: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
3d20: 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  ion, then code f
3d30: 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76 65 20  or it must have 
3d40: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3d50: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
3d60: 20 74 68 65 20 65 78 70 72 43 6f 64 65 53 75 62   the exprCodeSub
3d70: 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  select() routine
3d80: 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
3d90: 65 20 70 61 72 61 6d 65 74 65 72 20 72 65 67 53  e parameter regS
3da0: 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20  elect should be 
3db0: 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
3dc0: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
3dd0: 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  rs.** containing
3de0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
3df0: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  the sub-select. 
3e00: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f  .**.** If pVecto
3e10: 72 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  r is of type TK_
3e20: 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64  VECTOR, then cod
3e30: 65 20 66 6f 72 20 74 68 65 20 72 65 71 75 65 73  e for the reques
3e40: 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20  ted field.** is 
3e50: 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68  generated. In th
3e60: 69 73 20 63 61 73 65 20 28 2a 70 52 65 67 46 72  is case (*pRegFr
3e70: 65 65 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  ee) may be set t
3e80: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
3e90: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  ** a temporary r
3ea0: 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 66 72  egister to be fr
3eb0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
3ec0: 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
3ed0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ng..**.** Before
3ee0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70   returning, outp
3ef0: 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
3f00: 70 45 78 70 72 29 20 69 73 20 73 65 74 20 74 6f  pExpr) is set to
3f10: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
3f20: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72   Expr object cor
3f30: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c  responding to el
3f40: 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74  ement iElem of t
3f50: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74  he vector..*/.st
3f60: 61 74 69 63 20 69 6e 74 20 65 78 70 72 56 65 63  atic int exprVec
3f70: 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20 20 50  torRegister(.  P
3f80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3fa0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
3fb0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74  */.  Expr *pVect
3fc0: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
3fd0: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74       /* Vector t
3fe0: 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e  o extract elemen
3ff0: 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
4000: 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20  iField,         
4010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4020: 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20  ield to extract 
4030: 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a  from pVector */.
4040: 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c    int regSelect,
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
4070: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
4080: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
4090: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
40a0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78        /* OUT: Ex
40b0: 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74  pression element
40c0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46   */.  int *pRegF
40d0: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
40e0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65        /* OUT: Te
40f0: 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66  mp register to f
4100: 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f  ree */.){.  u8 o
4110: 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3b  p = pVector->op;
4120: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
4130: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d  K_VECTOR || op==
4140: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
4150: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
4160: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
4170: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a 70 70  ISTER ){.    *pp
4180: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 56 65  Expr = sqlite3Ve
4190: 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
41a0: 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65 6c 64  (pVector, iField
41b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56  );.    return pV
41c0: 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b 69 46  ector->iTable+iF
41d0: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ield;.  }.  if( 
41e0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
41f0: 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70  .    *ppExpr = p
4200: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
4210: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69  t->pEList->a[iFi
4220: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
4230: 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63   return regSelec
4240: 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20  t+iField;.  }.  
4250: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
4260: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46  r->x.pList->a[iF
4270: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72  ield].pExpr;.  r
4280: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
4290: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
42a0: 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46  , *ppExpr, pRegF
42b0: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ree);.}../*.** E
42c0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
42d0: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
42e0: 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74  between two vect
42f0: 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75  or values. Compu
4300: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
4310: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
4320: 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c  on (1, 0, or NUL
4330: 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  L) and write tha
4340: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f  t.** result into
4350: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
4360: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4370: 20 6d 75 73 74 20 73 61 74 69 73 66 79 20 74 68   must satisfy th
4380: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63  e following prec
4390: 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  onditions:.**.**
43a0: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
43b0: 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70  ==TK_IS:      op
43c0: 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d  ==TK_EQ and p5==
43d0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
43e0: 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70      if pExpr->op
43f0: 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70  ==TK_ISNOT:   op
4400: 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d  ==TK_NE and p5==
4410: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a  SQLITE_NULLEQ.**
4420: 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20      otherwise:  
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
4440: 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  ==pExpr->op and 
4450: 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20  p5==0.*/.static 
4460: 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43  void codeVectorC
4470: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
4480: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
4490: 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f  /* Code generato
44a0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
44b0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
44c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
44d0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  arison operation
44e0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
4500: 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
4510: 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
4520: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20  */.  u8 op,     
4530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
4540: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
4550: 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  r */.  u8 p5    
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4570: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72  SQLITE_NULLEQ or
4580: 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64   zero */.){.  Vd
4590: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
45a0: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
45b0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
45c0: 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69  eft;.  Expr *pRi
45d0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
45e0: 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74  ght;.  int nLeft
45f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
4600: 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b  ctorSize(pLeft);
4610: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4620: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 69  regLeft = 0;.  i
4630: 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b  nt regRight = 0;
4640: 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b 0a  .  u8 opx = op;.
4650: 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65 20 3d    int addrDone =
4660: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4670: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 69 66 28  Label(v);..  if(
4680: 20 6e 4c 65 66 74 21 3d 73 71 6c 69 74 65 33 45   nLeft!=sqlite3E
4690: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 52  xprVectorSize(pR
46a0: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
46b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
46c0: 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
46d0: 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 72  misused");.    r
46e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
46f0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
4700: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
4710: 6f 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20  op==TK_NE .     
4720: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
4730: 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IS || pExpr->
4740: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20  op==TK_ISNOT .  
4750: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
4760: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70  p==TK_LT || pExp
4770: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20  r->op==TK_GT .  
4780: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
4790: 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70  p==TK_LE || pExp
47a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20  r->op==TK_GE .  
47b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
47c0: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70  pr->op==op || (p
47d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
47e0: 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20  && op==TK_EQ).  
47f0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45            || (pE
4800: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4810: 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29 20  T && op==TK_NE) 
4820: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d  );.  assert( p5=
4830: 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21  =0 || pExpr->op!
4840: 3d 6f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =op );.  assert(
4850: 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   p5==SQLITE_NULL
4860: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
4870: 3d 6f 70 20 29 3b 0a 0a 20 20 70 35 20 7c 3d 20  =op );..  p5 |= 
4880: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 3b 0a  SQLITE_STOREP2;.
4890: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45    if( opx==TK_LE
48a0: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a   ) opx = TK_LT;.
48b0: 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45    if( opx==TK_GE
48c0: 20 29 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a   ) opx = TK_GT;.
48d0: 0a 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70  .  regLeft = exp
48e0: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
48f0: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
4900: 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72   regRight = expr
4910: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4920: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a  arse, pRight);..
4930: 20 20 66 6f 72 28 69 3d 30 3b 20 31 20 2f 2a 4c    for(i=0; 1 /*L
4940: 6f 6f 70 20 65 78 69 74 73 20 62 79 20 22 62 72  oop exits by "br
4950: 65 61 6b 22 2a 2f 3b 20 69 2b 2b 29 7b 0a 20 20  eak"*/; i++){.  
4960: 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
4970: 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30   0, regFree2 = 0
4980: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 2c 20  ;.    Expr *pL, 
4990: 2a 70 52 3b 20 0a 20 20 20 20 69 6e 74 20 72 31  *pR; .    int r1
49a0: 2c 20 72 32 3b 0a 20 20 20 20 61 73 73 65 72 74  , r2;.    assert
49b0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 6e 4c 65 66  ( i>=0 && i<nLef
49c0: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3e 30  t );.    if( i>0
49d0: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 61   ) sqlite3ExprCa
49e0: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
49f0: 0a 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65  .    r1 = exprVe
4a00: 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61  ctorRegister(pPa
4a10: 72 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72  rse, pLeft, i, r
4a20: 65 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65  egLeft, &pL, &re
4a30: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20  gFree1);.    r2 
4a40: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
4a50: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69  ster(pParse, pRi
4a60: 67 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74  ght, i, regRight
4a70: 2c 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32  , &pR, &regFree2
4a80: 29 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  );.    codeCompa
4a90: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70  re(pParse, pL, p
4aa0: 52 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20  R, opx, r1, r2, 
4ab0: 64 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74  dest, p5);.    t
4ac0: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
4ad0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4ae0: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
4af0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
4b00: 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
4b10: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4b20: 50 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63  P_Le);.    testc
4b30: 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
4b40: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
4b50: 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
4b60: 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
4b70: 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
4b80: 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
4b90: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4ba0: 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
4bb0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4bc0: 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73  =OP_Eq);.    tes
4bd0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
4be0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4bf0: 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
4c00: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4c10: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4c20: 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20   regFree1);.    
4c30: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4c40: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
4c50: 67 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28  gFree2);.    if(
4c60: 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78   i>0 ) sqlite3Ex
4c70: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
4c80: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  e);.    if( i==n
4c90: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
4ca0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4cb0: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20   if( opx==TK_EQ 
4cc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4cd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4ce0: 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64  _IfNot, dest, ad
4cf0: 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76  drDone); VdbeCov
4d00: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
4d10: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45  p5 |= SQLITE_KEE
4d20: 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  PNULL;.    }else
4d30: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20   if( opx==TK_NE 
4d40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4d50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4d60: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
4d70: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
4d80: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
4d90: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
4da0: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
4db0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
4dc0: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LT || op==TK
4dd0: 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45  _GT || op==TK_LE
4de0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b   || op==TK_GE );
4df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4e00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
4e10: 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64  lseNotEq, 0, add
4e20: 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  rDone);.      Vd
4e30: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
4e40: 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20  op==TK_LT);.    
4e50: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4e60: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  (v, op==TK_GT);.
4e70: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
4e80: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
4e90: 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  E);.      VdbeCo
4ea0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
4eb0: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66  TK_GE);.      if
4ec0: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
4ed0: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20  px = op;.    }. 
4ee0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4ef0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
4f00: 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69  addrDone);.}..#i
4f10: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
4f20: 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20  R_DEPTH>0./*.** 
4f30: 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d  Check that argum
4f40: 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c  ent nHeight is l
4f50: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
4f60: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
4f70: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
4f80: 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66  epth allowed. If
4f90: 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76   it is not, leav
4fa0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
4fb0: 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e  ge in.** pParse.
4fc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
4fd0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50  xprCheckHeight(P
4fe0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
4ff0: 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e  t nHeight){.  in
5000: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5010: 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74  ;.  int mxHeight
5020: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
5030: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5040: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
5050: 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78    if( nHeight>mx
5060: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  Height ){.    sq
5070: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5080: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45  arse, .       "E
5090: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
50a0: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78  s too large (max
50b0: 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c  imum depth %d)",
50c0: 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b   mxHeight.    );
50d0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
50e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
50f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
5100: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
5110: 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65  ee functions, he
5120: 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65  ightOfExpr(), he
5130: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29  ightOfExprList()
5140: 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66  .** and heightOf
5150: 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73  Select(), are us
5160: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
5170: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5180: 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70  ht.** of any exp
5190: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
51a0: 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73  erenced by the s
51b0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
51c0: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
51d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
51e0: 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20  If this maximum 
51f0: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
5200: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
5210: 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  nt value pointed
5220: 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67  .** to by pnHeig
5230: 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ht, the second p
5240: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73  arameter, then s
5250: 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20  et *pnHeight to 
5260: 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  that.** value..*
5270: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
5280: 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20  ightOfExpr(Expr 
5290: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
52a0: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
52b0: 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68     if( p->nHeigh
52c0: 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20  t>*pnHeight ){. 
52d0: 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
52e0: 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20   p->nHeight;.   
52f0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5300: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
5310: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
5320: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
5330: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
5340: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
5350: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
5360: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65  ; i++){.      he
5370: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b  ightOfExpr(p->a[
5380: 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67  i].pExpr, pnHeig
5390: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ht);.    }.  }.}
53a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
53b0: 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65  ghtOfSelect(Sele
53c0: 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  ct *p, int *pnHe
53d0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
53e0: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  {.    heightOfEx
53f0: 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e  pr(p->pWhere, pn
5400: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5410: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61  ghtOfExpr(p->pHa
5420: 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b  ving, pnHeight);
5430: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5440: 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48  r(p->pLimit, pnH
5450: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5460: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66  htOfExpr(p->pOff
5470: 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  set, pnHeight);.
5480: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5490: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
54a0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
54b0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
54c0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
54d0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
54e0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
54f0: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
5500: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5510: 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f  fSelect(p->pPrio
5520: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
5530: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
5540: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
5550: 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20  variable in the 
5560: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
5570: 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d   as an .** argum
5580: 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69  ent. An expressi
5590: 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64  on with no child
55a0: 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20  ren, Expr.pList 
55b0: 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c  or .** Expr.pSel
55c0: 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61  ect member has a
55d0: 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e   height of 1. An
55e0: 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  y other expressi
55f0: 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67  on.** has a heig
5600: 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ht equal to the 
5610: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
5620: 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20  f any other .** 
5630: 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20  referenced Expr 
5640: 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  plus one..**.** 
5650: 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 45  Also propagate E
5660: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
5670: 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e 78  s up from Expr.x
5680: 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e 66  .pList to Expr.f
5690: 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72  lags,.** if appr
56a0: 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
56b0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
56c0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
56d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
56e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
56f0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
5700: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
5710: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
5720: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
5730: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
5740: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
5750: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
5760: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
5770: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
5780: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
5790: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
57a0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
57b0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48  (p->x.pList, &nH
57c0: 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66  eight);.    p->f
57d0: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
57e0: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
57f0: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
5800: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70  .pList);.  }.  p
5810: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
5820: 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ght + 1;.}../*.*
5830: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
5840: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
5850: 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53 65  using the exprSe
5860: 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74 69  tHeight() functi
5870: 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65  on. If.** the he
5880: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
5890: 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  than the maximum
58a0: 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73   allowed express
58b0: 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65  ion depth,.** le
58c0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
58d0: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  pParse..**.** Al
58e0: 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c 6c  so propagate all
58f0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c   EP_Propagate fl
5900: 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ags from the Exp
5910: 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a  r.x.pList into.*
5920: 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a  * Expr.flags. .*
5930: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5940: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
5950: 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ags(Parse *pPars
5960: 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  e, Expr *p){.  i
5970: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
5980: 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70 72  ) return;.  expr
5990: 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20  SetHeight(p);.  
59a0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
59b0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
59c0: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f  ->nHeight);.}../
59d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
59e0: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
59f0: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
5a00: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
5a10: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
5a20: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
5a30: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
5a40: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5a50: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
5a60: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
5a70: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
5a80: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
5a90: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
5aa0: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
5ab0: 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f  ;.}.#else /* ABO
5ac0: 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66 6f  VE:  Height enfo
5ad0: 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e  rcement enabled.
5ae0: 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74 20    BELOW: Height 
5af0: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20  enforcement off 
5b00: 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61  */./*.** Propaga
5b10: 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67  te all EP_Propag
5b20: 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74  ate flags from t
5b30: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
5b40: 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61  into.** Expr.fla
5b50: 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gs. .*/.void sql
5b60: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
5b70: 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20  tAndFlags(Parse 
5b80: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
5b90: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  ){.  if( p && p-
5ba0: 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78 70  >x.pList && !Exp
5bb0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5bc0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
5bd0: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
5be0: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
5bf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
5c00: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
5c10: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
5c20: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
5c30: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5c40: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
5c50: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
5c60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
5c70: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
5c80: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
5c90: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
5ca0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
5cb0: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
5cc0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
5cd0: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
5ce0: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
5cf0: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
5d00: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
5d10: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
5d20: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
5d30: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
5d40: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
5d50: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
5d60: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
5d70: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
5d80: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
5d90: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
5da0: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
5db0: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
5dc0: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
5dd0: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
5de0: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
5df0: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
5e00: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ing is performed
5e10: 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a  .  The deQuote.*
5e20: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  * parameter is i
5e30: 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e  gnored if pToken
5e40: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
5e50: 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f  he token does no
5e60: 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62  t.** appear to b
5e70: 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68  e quoted.  If th
5e80: 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66  e quotes were of
5e90: 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20   the form "..." 
5ea0: 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a  (double-quotes).
5eb0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44  ** then the EP_D
5ec0: 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73  blQuoted flag is
5ed0: 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72   set on the expr
5ee0: 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a  ession node..**.
5ef0: 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  ** Special case:
5f00: 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45    If op==TK_INTE
5f10: 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70  GER and pToken p
5f20: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
5f30: 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  g that.** can be
5f40: 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f   translated into
5f50: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
5f60: 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  r, then the toke
5f70: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72  n is not.** stor
5f80: 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20  ed in u.zToken. 
5f90: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e   Instead, the in
5fa0: 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73 20  teger values is 
5fb0: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
5fc0: 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65  u.iValue and the
5fd0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
5fe0: 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78  g is set.  No ex
5ff0: 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69  tra storage.** i
6000: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  s allocated to h
6010: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 20  old the integer 
6020: 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65 71  text and the deq
6030: 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e  uote flag is ign
6040: 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ored..*/.Expr *s
6050: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
6060: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
6070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
6080: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
6090: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20  DbMallocRawNN() 
60a0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60c0: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
60d0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  e */.  const Tok
60e0: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f  en *pToken,    /
60f0: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
6100: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
6110: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
6120: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
6130: 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65   True to dequote
6140: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
6150: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  New;.  int nExtr
6160: 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  a = 0;.  int iVa
6170: 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  lue = 0;..  asse
6180: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
6190: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
61a0: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45   if( op!=TK_INTE
61b0: 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a  GER || pToken->z
61c0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
61d0: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
61e0: 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61  (pToken->z, &iVa
61f0: 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lue)==0 ){.     
6200: 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e   nExtra = pToken
6210: 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  ->n+1;.      ass
6220: 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29  ert( iValue>=0 )
6230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e  ;.    }.  }.  pN
6240: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
6250: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
6260: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
6270: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
6280: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  {.    memset(pNe
6290: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  w, 0, sizeof(Exp
62a0: 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  r));.    pNew->o
62b0: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20  p = (u8)op;.    
62c0: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
62d0: 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  .    if( pToken 
62e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  ){.      if( nEx
62f0: 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tra==0 ){.      
6300: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6310: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
6320: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
6330: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
6340: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6350: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6360: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  en = (char*)&pNe
6370: 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  w[1];.        as
6380: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
6390: 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d  =0 || pToken->n=
63a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
63b0: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65  ( pToken->n ) me
63c0: 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  mcpy(pNew->u.zTo
63d0: 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ken, pToken->z, 
63e0: 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
63f0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b      pNew->u.zTok
6400: 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20  en[pToken->n] = 
6410: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  0;.        if( d
6420: 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65  equote && sqlite
6430: 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Isquote(pNew->u
6440: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
6450: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
6460: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  w->u.zToken[0]==
6470: 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67  '"' ) pNew->flag
6480: 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65  s |= EP_DblQuote
6490: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  d;.          sql
64a0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
64b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
64c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
64d0: 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
64e0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
64f0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  .    pNew->nHeig
6500: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
6510: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
6520: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ew;.}../*.** All
6530: 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  ocate a new expr
6540: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d  ession node from
6550: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
6560: 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  ed token that ha
6570: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65  s.** already bee
6580: 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45  n dequoted..*/.E
6590: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
65a0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
65c0: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
65d0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
65e0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
65f0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
6600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
6610: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
6620: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6630: 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20  *zToken      /* 
6640: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
6650: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6660: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a  /.){.  Token x;.
6670: 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a    x.z = zToken;.
6680: 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f    x.n = zToken ?
6690: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
66a0: 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20  (zToken) : 0;.  
66b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
66c0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20  prAlloc(db, op, 
66d0: 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &x, 0);.}../*.**
66e0: 20 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73   Attach subtrees
66f0: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
6700: 74 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f  t to the Expr no
6710: 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  de pRoot..**.** 
6720: 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74  If pRoot==NULL t
6730: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61  hat means that a
6740: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6750: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
6760: 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61  urred..** In tha
6770: 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74  t case, delete t
6780: 68 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66  he subtrees pLef
6790: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f  t and pRight..*/
67a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
67b0: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
67c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
67d0: 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20    Expr *pRoot,. 
67e0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20   Expr *pLeft,.  
67f0: 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a  Expr *pRight.){.
6800: 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29    if( pRoot==0 )
6810: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
6820: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6830: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6840: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
6850: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
6860: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
6870: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
6880: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29      if( pRight )
6890: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
68a0: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a  Right = pRight;.
68b0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
68c0: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
68d0: 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61  te & pRight->fla
68e0: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  gs;.    }.    if
68f0: 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ( pLeft ){.     
6900: 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20   pRoot->pLeft = 
6910: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f  pLeft;.      pRo
6920: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
6930: 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66  Propagate & pLef
6940: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
6950: 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68      exprSetHeigh
6960: 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a  t(pRoot);.  }.}.
6970: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
6980: 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69  an Expr node whi
6990: 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79  ch joins as many
69a0: 20 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73   as two subtrees
69b0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62  ..**.** One or b
69c0: 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72  oth of the subtr
69d0: 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ees can be NULL.
69e0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
69f0: 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a  er to the new.**
6a00: 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c   Expr node.  Or,
6a10: 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   if an OOM error
6a20: 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61   occurs, set pPa
6a30: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
6a40: 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74  ailed,.** free t
6a50: 68 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20  he subtrees and 
6a60: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6a70: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78  Expr *sqlite3PEx
6a80: 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  pr(.  Parse *pPa
6a90: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
6aa0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
6ab0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ad0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
6ae0: 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  de */.  Expr *pL
6af0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
6b00: 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20  /* Left operand 
6b10: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
6b20: 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
6b30: 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  Right operand */
6b40: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  .){.  Expr *p;. 
6b50: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20   if( op==TK_AND 
6b60: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
6b70: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
6b80: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
6b90: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
6ba0: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
6bb0: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
6bc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
6bd0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
6be0: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
6bf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
6c00: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6c10: 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  wNN(pParse->db, 
6c20: 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
6c30: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
6c40: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
6c50: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
6c60: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 6f 70 20 26      p->op = op &
6c70: 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b 0a 20 20 20   TKFLG_MASK;.   
6c80: 20 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b     p->iAgg = -1;
6c90: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6ca0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
6cb0: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
6cc0: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
6cd0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
6ce0: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
6cf0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
6d00: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
6d10: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
6d20: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   p;.}../*.** Add
6d30: 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20   pSelect to the 
6d40: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66  Expr.x.pSelect f
6d50: 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45  ield.  Or, if pE
6d60: 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65  xpr is NULL (due
6d70: 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20  .** do a memory 
6d80: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
6d90: 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20  re) then delete 
6da0: 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65  the pSelect obje
6db0: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
6dc0: 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
6dd0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
6de0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65   Expr *pExpr, Se
6df0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
6e00: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
6e10: 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c     pExpr->x.pSel
6e20: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20  ect = pSelect;. 
6e30: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
6e40: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
6e50: 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65  Select|EP_Subque
6e60: 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
6e70: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
6e80: 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 45  Flags(pParse, pE
6e90: 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  xpr);.  }else{. 
6ea0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
6eb0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6ec0: 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  led );.    sqlit
6ed0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
6ee0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65  Parse->db, pSele
6ef0: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ct);.  }.}.../*.
6f00: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
6f10: 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  sion is always e
6f20: 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41  ither TRUE or FA
6f30: 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c  LSE (respectivel
6f40: 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  y),.** then retu
6f50: 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61  rn 1.  If one ca
6f60: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74  nnot determine t
6f70: 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f  he truth value o
6f80: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
6f90: 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ion at compile-t
6fa0: 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ime return 0..**
6fb0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f  .** This is an o
6fc0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66  ptimization.  If
6fd0: 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e   is OK to return
6fe0: 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a   0 here even if.
6ff0: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
7000: 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61  n really is alwa
7010: 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73  ys false or fals
7020: 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74  e (a false negat
7030: 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20  ive)..** But it 
7040: 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75  is a bug to retu
7050: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
7060: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76  ession might hav
7070: 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62  e different.** b
7080: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e  oolean values in
7090: 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75   different circu
70a0: 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73  mstances (a fals
70b0: 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a  e positive.).**.
70c0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
70d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
70e0: 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74  s part of condit
70f0: 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c  ional for a.** L
7100: 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77  EFT JOIN, then w
7110: 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
7120: 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ne at compile-ti
7130: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
7140: 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20  t.** is it true 
7150: 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77  or false, so alw
7160: 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ays return 0..*/
7170: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
7180: 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20  AlwaysTrue(Expr 
7190: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
71a0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
71b0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
71c0: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
71d0: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
71e0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
71f0: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
7200: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30  0;.  return v!=0
7210: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  ;.}.static int e
7220: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45  xprAlwaysFalse(E
7230: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76  xpr *p){.  int v
7240: 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72   = 0;.  if( Expr
7250: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
7260: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
7270: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
7280: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
7290: 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74  ger(p, &v) ) ret
72a0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
72b0: 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  v==0;.}../*.** J
72c0: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
72d0: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
72e0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
72f0: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
7300: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
7310: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
7320: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
7330: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
7340: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
7350: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
7360: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
7370: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
7380: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
7390: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
73a0: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
73b0: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
73c0: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
73d0: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
73e0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
73f0: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
7400: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
7410: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
7420: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
7430: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
7440: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
7450: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
7460: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
7470: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70  .  }else if( exp
7480: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
7490: 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79  ft) || exprAlway
74a0: 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29  sFalse(pRight) )
74b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
74c0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
74d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
74e0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
74f0: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
7500: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
7510: 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
7520: 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
7530: 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d  kens[0], 0);.  }
7540: 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a  else{.    Expr *
7550: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
7560: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41  prAlloc(db, TK_A
7570: 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ND, 0, 0);.    s
7580: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
7590: 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65  Subtrees(db, pNe
75a0: 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  w, pLeft, pRight
75b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e  );.    return pN
75c0: 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ew;.  }.}../*.**
75d0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
75e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
75f0: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
7600: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
7610: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
7620: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
7630: 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
7640: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
7650: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
7660: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
7670: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
7680: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7690: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
76a0: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
76b0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
76c0: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
76d0: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
76e0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
76f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
7700: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
7710: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
7720: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
7730: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
7740: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7750: 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  .  pNew->x.pList
7760: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65   = pList;.  asse
7770: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
7780: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
7790: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71  sSelect) );.  sq
77a0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
77b0: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
77c0: 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  e, pNew);.  retu
77d0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
77e0: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
77f0: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
7800: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
7810: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
7820: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
7830: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
7840: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
7850: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
7860: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
7870: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
7880: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7890: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
78a0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
78b0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
78c0: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
78d0: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
78e0: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
78f0: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
7900: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20   is not too big 
7910: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
7920: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
7930: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
7940: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
7950: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
7960: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
7970: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7980: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c  the form ":aaa",
7990: 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61   "@aaa", or "$aa
79a0: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
79b0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
79c0: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
79d0: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
79e0: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
79f0: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
7a00: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
7a10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
7a20: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
7a30: 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69   sequential vari
7a40: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
7a50: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
7a60: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
7a70: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
7a80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
7a90: 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e  pr *pExpr, u32 n
7aa0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7ab0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7ac0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7ad0: 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66    ynVar x;..  if
7ae0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
7af0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21  urn;.  assert( !
7b00: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7b10: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
7b20: 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50  ue|EP_Reduced|EP
7b30: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20  _TokenOnly) );. 
7b40: 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54   z = pExpr->u.zT
7b50: 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
7b60: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
7b70: 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61  ( z[0]!=0 );.  a
7b80: 73 73 65 72 74 28 20 6e 3d 3d 28 75 33 32 29 73  ssert( n==(u32)s
7b90: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7ba0: 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  ) );.  if( z[1]=
7bb0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
7bc0: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
7bd0: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
7be0: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
7bf0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
7c00: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
7c10: 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79 6e 56   );.    x = (ynV
7c20: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
7c30: 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ar);.  }else{.  
7c40: 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20 30 3b    int doAdd = 0;
7c50: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
7c60: 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  ?' ){.      /* W
7c70: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
7c80: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
7c90: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
7ca0: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
7cb0: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
7cc0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
7cd0: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ber */.      i64
7ce0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   i;.      int bO
7cf0: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  k;.      if( n==
7d00: 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  2 ){ /*OPTIMIZAT
7d10: 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20  ION-IF-TRUE*/.  
7d20: 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d 2d 27        i = z[1]-'
7d30: 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  0';  /* The comm
7d40: 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20 66 6f  on case of ?N fo
7d50: 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67 69 74  r a single digit
7d60: 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f   N */.        bO
7d70: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  k = 1;.      }el
7d80: 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20  se{.        bOk 
7d90: 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  = 0==sqlite3Atoi
7da0: 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d  64(&z[1], &i, n-
7db0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  1, SQLITE_UTF8);
7dc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
7dd0: 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b  estcase( i==0 );
7de0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7df0: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74   i==1 );.      t
7e00: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
7e10: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7e20: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7e30: 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20  BER]-1 );.      
7e40: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
7e50: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7e60: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7e70: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69  MBER] );.      i
7e80: 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31  f( bOk==0 || i<1
7e90: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
7ea0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7eb0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
7ec0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7ed0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7ee0: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
7ef0: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
7f00: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
7f20: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7f30: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7f40: 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  BER]);.        r
7f50: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
7f60: 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29       x = (ynVar)
7f70: 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  i;.      if( x>p
7f80: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
7f90: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
7fa0: 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20 20  Var = (int)x;.  
7fb0: 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b        doAdd = 1;
7fc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7fd0: 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d   sqlite3VListNum
7fe0: 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70  ToName(pParse->p
7ff0: 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b 0a  VList, x)==0 ){.
8000: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
8010: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
8020: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
8030: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
8040: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
8050: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
8060: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
8070: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
8080: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
8090: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
80a0: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
80b0: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
80c0: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
80d0: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
80e0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
80f0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
8100: 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20     */.      x = 
8110: 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33 56 4c  (ynVar)sqlite3VL
8120: 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50 61  istNameToNum(pPa
8130: 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20  rse->pVList, z, 
8140: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3d  n);.      if( x=
8150: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20  =0 ){.        x 
8160: 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72  = (ynVar)(++pPar
8170: 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20  se->nVar);.     
8180: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
81a0: 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20 20 20  if( doAdd ){.   
81b0: 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73     pParse->pVLis
81c0: 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74  t = sqlite3VList
81d0: 41 64 64 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  Add(db, pParse->
81e0: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78 29  pVList, z, n, x)
81f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
8200: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78  xpr->iColumn = x
8210: 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e 61 4c  ;.  if( x>db->aL
8220: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8230: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
8240: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
8250: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8260: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
8270: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
8280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
8290: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
82a0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
82b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
82c0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
82d0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
82e0: 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eNN(sqlite3 *db,
82f0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73   Expr *p){.  ass
8300: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f  ert( p!=0 );.  /
8310: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
8320: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
8330: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
8340: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
8350: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
8360: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
8370: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
8380: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
8390: 75 65 3e 3d 30 20 29 3b 0a 23 69 66 64 65 66 20  ue>=0 );.#ifdef 
83a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
83b0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
83c0: 74 79 28 70 2c 20 45 50 5f 4c 65 61 66 29 20 26  ty(p, EP_Leaf) &
83d0: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
83e0: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
83f0: 6c 79 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ly) ){.    asser
8400: 74 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29  t( p->pLeft==0 )
8410: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
8420: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70    assert( p->x.p
8440: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d  Select==0 );.  }
8450: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 45  .#endif.  if( !E
8460: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8470: 2c 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  , (EP_TokenOnly|
8480: 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20  EP_Leaf)) ){.   
8490: 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75   /* The Expr.x u
84a0: 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73  nion is never us
84b0: 65 64 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  ed at the same t
84c0: 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69 67  ime as Expr.pRig
84d0: 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ht */.    assert
84e0: 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20  ( p->x.pList==0 
84f0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
8500: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  );.    if( p->pL
8510: 65 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b  eft && p->op!=TK
8520: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
8530: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8540: 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66  teNN(db, p->pLef
8550: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
8560: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
8570: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66  >pRight);.    if
8580: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8590: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
85a0: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
85b0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
85c0: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
85d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
85e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
85f0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
8600: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
8610: 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48  .  }.  if( ExprH
8620: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8630: 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c  _MemToken) ) sql
8640: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8650: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69  ->u.zToken);.  i
8660: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8670: 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63  rty(p, EP_Static
8680: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8690: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
86a0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
86b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
86c0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
86d0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73  *p){.  if( p ) s
86e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
86f0: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  NN(db, p);.}../*
8700: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
8710: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
8720: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
8730: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75   expression stru
8740: 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64  cture .** passed
8750: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
8760: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
8770: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58  always one of EX
8780: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20  PR_FULLSIZE,.** 
8790: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
87a0: 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   or EXPR_TOKENON
87b0: 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  LYSIZE..*/.stati
87c0: 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74  c int exprStruct
87d0: 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  Size(Expr *p){. 
87e0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
87f0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8800: 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45  Only) ) return E
8810: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
8820: 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  E;.  if( ExprHas
8830: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
8840: 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e  educed) ) return
8850: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
8860: 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52  E;.  return EXPR
8870: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  _FULLSIZE;.}../*
8880: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8890: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
88a0: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
88b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
88c0: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
88d0: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
88e0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
88f0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
8900: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
8910: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
8920: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
8930: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
8940: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
8950: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
8960: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
8970: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
8980: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
8990: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
89a0: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
89b0: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
89c0: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
89d0: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
89e0: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
89f0: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
8a00: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
8a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
8a50: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
8a60: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
8a70: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
8a80: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
8a90: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
8aa0: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
8ab0: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
8ac0: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
8ad0: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
8ae0: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
8af0: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
8b00: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
8b10: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
8b20: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
8b30: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
8b40: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
8b50: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
8b60: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
8b70: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
8b80: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
8b90: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
8ba0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
8bb0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
8bc0: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
8bd0: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
8be0: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
8bf0: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
8c00: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
8c10: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
8c20: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
8c30: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
8c40: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
8c50: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
8c60: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
8c70: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
8c80: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
8c90: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
8ca0: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
8cb0: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
8cc0: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
8cd0: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
8ce0: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
8cf0: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
8d00: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
8d10: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
8d20: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
8d30: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
8d40: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
8d50: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
8d60: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
8d70: 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63  f teh Expr objec
8d80: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
8d90: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
8da0: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
8db0: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
8dc0: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
8dd0: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
8de0: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
8df0: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
8e00: 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  an EXPRDUP_REDUC
8e10: 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75  E copy of a redu
8e20: 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ced expression. 
8e30: 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61   It is only lega
8e40: 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61  l.** to reduce a
8e50: 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73   pristine expres
8e60: 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74  sion tree from t
8e70: 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20  he parser.  The 
8e80: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
8e90: 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74  * of dupedExprSt
8ea0: 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61  ructSize() conta
8eb0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65  in multiple asse
8ec0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
8ed0: 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20  that attempt.** 
8ee0: 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
8ef0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
8f00: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
8f10: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
8f20: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
8f30: 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a  ){.  int nSize;.
8f40: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
8f50: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
8f60: 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f  || flags==0 ); /
8f70: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20  * Only one flag 
8f80: 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  value allowed */
8f90: 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f  .  assert( EXPR_
8fa0: 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20  FULLSIZE<=0xfff 
8fb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78  );.  assert( (0x
8fc0: 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65  fff & (EP_Reduce
8fd0: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29  d|EP_TokenOnly))
8fe0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d  ==0 );.  if( 0==
8ff0: 66 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  flags || p->op==
9000: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
9010: 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   ){.    nSize = 
9020: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20  EXPR_FULLSIZE;. 
9030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
9040: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9050: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
9060: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
9070: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9080: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
9090: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
90a0: 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28   ); .    assert(
90b0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
90c0: 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  y(p, EP_MemToken
90d0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
90e0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
90f0: 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  y(p, EP_NoReduce
9100: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ) );.    if( p->
9110: 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c  pLeft || p->x.pL
9120: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  ist ){.      nSi
9130: 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45  ze = EXPR_REDUCE
9140: 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75 63  DSIZE | EP_Reduc
9150: 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ed;.    }else{. 
9160: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9170: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
9180: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
9190: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
91a0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20  EP_TokenOnly;.  
91b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
91c0: 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nSize;.}../*.**
91d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
91e0: 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63 65  eturns the space
91f0: 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69 72   in bytes requir
9200: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
9210: 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20  copy .** of the 
9220: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 61  Expr structure a
9230: 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  nd a copy of the
9240: 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73   Expr.u.zToken s
9250: 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a 2a  tring (if that.*
9260: 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66 69  * string is defi
9270: 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ned.).*/.static 
9280: 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64  int dupedExprNod
9290: 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  eSize(Expr *p, i
92a0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
92b0: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
92c0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
92d0: 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b 0a  flags) & 0xfff;.
92e0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
92f0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
9300: 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
9310: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79  Token ){.    nBy
9320: 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
9330: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
9340: 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n)+1;.  }.  retu
9350: 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29  rn ROUND8(nByte)
9360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9370: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
9380: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
9390: 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69  o create a dupli
93a0: 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  cate of the .** 
93b0: 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
93c0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
93d0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63  rgument. The sec
93e0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
93f0: 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69  a.** mask contai
9400: 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58  ning EXPRDUP_XXX
9410: 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
9420: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
9430: 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20   includes space 
9440: 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  to create a copy
9450: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
9460: 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e  uct.** itself an
9470: 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66  d the buffer ref
9480: 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72  erred to by Expr
9490: 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e  .u.zToken, if an
94a0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
94b0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66  EXPRDUP_REDUCE f
94c0: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
94d0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
94e0: 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73  e includes .** s
94f0: 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74  pace to duplicat
9500: 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73  e all Expr nodes
9510: 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72   in the tree for
9520: 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66  med by Expr.pLef
9530: 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70  t .** and Expr.p
9540: 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20  Right variables 
9550: 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79  (but not for any
9560: 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e   structures poin
9570: 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65  ted to or .** de
9580: 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65  scended from the
9590: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72   Expr.x.pList or
95a0: 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20   Expr.x.pSelect 
95b0: 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73  variables)..*/.s
95c0: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
95d0: 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  xprSize(Expr *p,
95e0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
95f0: 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20  nt nByte = 0;.  
9600: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79  if( p ){.    nBy
9610: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  te = dupedExprNo
9620: 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  deSize(p, flags)
9630: 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26  ;.    if( flags&
9640: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
9650: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
9660: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9670: 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20  ->pLeft, flags) 
9680: 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  + dupedExprSize(
9690: 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73  p->pRight, flags
96a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
96b0: 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a  eturn nByte;.}..
96c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
96d0: 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
96e0: 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  o sqlite3ExprDup
96f0: 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
9700: 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20  if pzBuffer .** 
9710: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
9720: 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73   *pzBuffer is as
9730: 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  sumed to point t
9740: 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65  o a buffer large
9750: 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73   enough .** to s
9760: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66  tore the copy of
9770: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74   expression p, t
9780: 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e  he copies of p->
9790: 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20  u.zToken.** (if 
97a0: 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64  applicable), and
97b0: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74   the copies of t
97c0: 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20  he p->pLeft and 
97d0: 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73  p->pRight expres
97e0: 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79  sions,.** if any
97f0: 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  . Before returni
9800: 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73  ng, *pzBuffer is
9810: 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73   set to the firs
9820: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a  t byte past the.
9830: 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ** portion of th
9840: 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20  e buffer copied 
9850: 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e  into by this fun
9860: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
9870: 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73   Expr *exprDup(s
9880: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
9890: 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67   *p, int dupFlag
98a0: 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72  s, u8 **pzBuffer
98b0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
98c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
98d0: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
98e0: 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20  .  u8 *zAlloc;  
98f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
9900: 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68  ry space from wh
9910: 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70  ich to build Exp
9920: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33  r object */.  u3
9930: 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20  2 staticFlag;   
9940: 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63      /* EP_Static
9950: 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62   if space not ob
9960: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
9970: 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  oc */..  assert(
9980: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
9990: 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72  rt( p );.  asser
99a0: 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c  t( dupFlags==0 |
99b0: 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52  | dupFlags==EXPR
99c0: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20  DUP_REDUCE );.  
99d0: 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72  assert( pzBuffer
99e0: 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d  ==0 || dupFlags=
99f0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
9a00: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
9a10: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
9a20: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
9a30: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
9a40: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
9a50: 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a      zAlloc = *pz
9a60: 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74  Buffer;.    stat
9a70: 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74  icFlag = EP_Stat
9a80: 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ic;.  }else{.   
9a90: 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65   zAlloc = sqlite
9aa0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
9ab0: 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  b, dupedExprSize
9ac0: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a  (p, dupFlags));.
9ad0: 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d      staticFlag =
9ae0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d   0;.  }.  pNew =
9af0: 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b   (Expr *)zAlloc;
9b00: 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ..  if( pNew ){.
9b10: 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53      /* Set nNewS
9b20: 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
9b30: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
9b40: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
9b50: 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79  ted to.    ** by
9b60: 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65   pNew. This is e
9b70: 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53  ither EXPR_FULLS
9b80: 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45  IZE, EXPR_REDUCE
9b90: 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20  DSIZE or.    ** 
9ba0: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
9bb0: 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65  ZE. nToken is se
9bc0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
9bd0: 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65  of bytes consume
9be0: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
9bf0: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75  copy of the p->u
9c00: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28  .zToken string (
9c10: 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a  if any)..    */.
9c20: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
9c30: 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d  ed nStructSize =
9c40: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
9c50: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
9c60: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  );.    const int
9c70: 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72   nNewSize = nStr
9c80: 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b  uctSize & 0xfff;
9c90: 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b  .    int nToken;
9ca0: 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61  .    if( !ExprHa
9cb0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9cc0: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
9cd0: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
9ce0: 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74    nToken = sqlit
9cf0: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
9d00: 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20  zToken) + 1;.   
9d10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54   }else{.      nT
9d20: 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  oken = 0;.    }.
9d30: 20 20 20 20 69 66 28 20 64 75 70 46 6c 61 67 73      if( dupFlags
9d40: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
9d50: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9d60: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
9d70: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ==0 );.      mem
9d80: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
9d90: 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65  NewSize);.    }e
9da0: 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e  lse{.      u32 n
9db0: 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72  Size = (u32)expr
9dc0: 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20  StructSize(p);. 
9dd0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c       memcpy(zAll
9de0: 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20  oc, p, nSize);. 
9df0: 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45       if( nSize<E
9e00: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20  XPR_FULLSIZE ){ 
9e10: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
9e20: 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20  &zAlloc[nSize], 
9e30: 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  0, EXPR_FULLSIZE
9e40: 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  -nSize);.      }
9e50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
9e60: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
9e70: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
9e80: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
9e90: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
9ea0: 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ly. */.    pNew-
9eb0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52  >flags &= ~(EP_R
9ec0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
9ed0: 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50  nly|EP_Static|EP
9ee0: 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  _MemToken);.    
9ef0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e  pNew->flags |= n
9f00: 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50  StructSize & (EP
9f10: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
9f20: 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77  nOnly);.    pNew
9f30: 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69  ->flags |= stati
9f40: 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43  cFlag;..    /* C
9f50: 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f  opy the p->u.zTo
9f60: 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61  ken string, if a
9f70: 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ny. */.    if( n
9f80: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63  Token ){.      c
9f90: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
9fa0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
9fb0: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
9fc0: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d  ewSize];.      m
9fd0: 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d  emcpy(zToken, p-
9fe0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  >u.zToken, nToke
9ff0: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  n);.    }..    i
a000: 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73  f( 0==((p->flags
a010: 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20  |pNew->flags) & 
a020: 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  (EP_TokenOnly|EP
a030: 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20  _Leaf)) ){.     
a040: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
a050: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
a060: 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  or pNew->x.pList
a070: 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   member. */.    
a080: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
a090: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
a0a0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
a0b0: 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63    pNew->x.pSelec
a0c0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
a0d0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53  tDup(db, p->x.pS
a0e0: 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29  elect, dupFlags)
a0f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a100: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
a110: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
a120: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
a130: 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61  >x.pList, dupFla
a140: 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gs);.      }.   
a150: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20   }..    /* Fill 
a160: 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61  in pNew->pLeft a
a170: 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e  nd pNew->pRight.
a180: 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72   */.    if( Expr
a190: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
a1a0: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
a1b0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
a1c0: 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75      zAlloc += du
a1d0: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
a1e0: 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  p, dupFlags);.  
a1f0: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a200: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
a210: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
a220: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
a230: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
a240: 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20  >pLeft ?.       
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
a260: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
a270: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
a280: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20  UCE, &zAlloc) : 
a290: 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
a2a0: 3e 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69  >pRight = p->pRi
a2b0: 67 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20  ght ?.          
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
a2d0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
a2e0: 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ht, EXPRDUP_REDU
a2f0: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30  CE, &zAlloc) : 0
a300: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a310: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
a320: 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65          *pzBuffe
a330: 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20  r = zAlloc;.    
a340: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
a350: 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
a360: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
a370: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61  TokenOnly|EP_Lea
a380: 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  f) ){.        if
a390: 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b 5f 53  ( pNew->op==TK_S
a3a0: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  ELECT_COLUMN ){.
a3b0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
a3c0: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a3d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
a3e0: 72 74 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  rt( p->iColumn==
a3f0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
a400: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
a410: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
a420: 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68  ==0  || p->pRigh
a430: 74 3d 3d 70 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  t==p->pLeft );. 
a440: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a450: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
a460: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
a470: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66  rDup(db, p->pLef
a480: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, 0);.        }
a490: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
a4a0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
a4b0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
a4c0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
a4d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
a4e0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
a4f0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72  .** Create and r
a500: 65 74 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70  eturn a deep cop
a510: 79 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20  y of the object 
a520: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
a530: 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
a540: 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e  t. If an OOM con
a550: 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e  dition is encoun
a560: 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  tered, NULL is r
a570: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74  eturned.** and t
a580: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
a590: 6c 65 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f  led flag set..*/
a5a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a5b0: 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20  OMIT_CTE.static 
a5c0: 57 69 74 68 20 2a 77 69 74 68 44 75 70 28 73 71  With *withDup(sq
a5d0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20  lite3 *db, With 
a5e0: 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65  *p){.  With *pRe
a5f0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  t = 0;.  if( p )
a600: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
a610: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73  = sizeof(*p) + s
a620: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
a630: 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20   (p->nCte-1);.  
a640: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
a650: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
a660: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
a670: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69   pRet ){.      i
a680: 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74  nt i;.      pRet
a690: 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65  ->nCte = p->nCte
a6a0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
a6b0: 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
a6c0: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
a6d0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73  a[i].pSelect = s
a6e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
a6f0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c  db, p->a[i].pSel
a700: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
a710: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c   pRet->a[i].pCol
a720: 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  s = sqlite3ExprL
a730: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  istDup(db, p->a[
a740: 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20  i].pCols, 0);.  
a750: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
a760: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
a770: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e  DbStrDup(db, p->
a780: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
a790: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a7a0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
a7b0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
a7c0: 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65  ithDup(x,y) 0.#e
a7d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
a7e0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
a7f0: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
a800: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
a810: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
a820: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
a830: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
a840: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
a850: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
a860: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
a870: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
a880: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
a890: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
a8a0: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
a8b0: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
a8c0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
a8d0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
a8e0: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
a8f0: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
a900: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
a910: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
a920: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
a930: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
a940: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
a950: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
a960: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
a970: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
a980: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
a990: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
a9a0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
a9b0: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
a9c0: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
a9d0: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
a9e0: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
a9f0: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
aa00: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
aa10: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
aa20: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
aa30: 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  gs..** If the EX
aa40: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
aa50: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
aa60: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  he structure ret
aa70: 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72  urned is a.** tr
aa80: 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20  uncated version 
aa90: 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70  of the usual Exp
aaa0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
aab0: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
aac0: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  as.** part of th
aad0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
aae0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
aaf0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
ab00: 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  a..*/.Expr *sqli
ab10: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
ab20: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
ab30: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
ab40: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
ab50: 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  || flags==EXPRDU
ab60: 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65  P_REDUCE );.  re
ab70: 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70  turn p ? exprDup
ab80: 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30  (db, p, flags, 0
ab90: 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73  ) : 0;.}.ExprLis
aba0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
abb0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
abc0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  b, ExprList *p, 
abd0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78  int flags){.  Ex
abe0: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
abf0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
ac00: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
ac10: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
ac20: 0a 20 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53  .  Expr *pPriorS
ac30: 65 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20  electCol = 0;.  
ac40: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
ac50: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
ac60: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
ac70: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
ac80: 52 61 77 4e 4e 28 64 62 2c 20 0a 20 20 20 20 20  RawNN(db, .     
ac90: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
aca0: 70 4e 65 77 29 2b 73 69 7a 65 6f 66 28 70 4e 65  pNew)+sizeof(pNe
acb0: 77 2d 3e 61 5b 30 5d 29 2a 28 70 2d 3e 6e 45 78  w->a[0])*(p->nEx
acc0: 70 72 2d 31 29 20 29 3b 0a 20 20 69 66 28 20 70  pr-1) );.  if( p
acd0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
ace0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  0;.  pNew->nAllo
acf0: 63 20 3d 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  c = pNew->nExpr 
ad00: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  = p->nExpr;.  pI
ad10: 74 65 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20  tem = pNew->a;. 
ad20: 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61   pOldItem = p->a
ad30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ad40: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
ad50: 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b  tem++, pOldItem+
ad60: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f  +){.    Expr *pO
ad70: 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65  ldExpr = pOldIte
ad80: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45 78  m->pExpr;.    Ex
ad90: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
ada0: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
adb0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
adc0: 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c  db, pOldExpr, fl
add0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  ags);.    if( pO
ade0: 6c 64 45 78 70 72 20 0a 20 20 20 20 20 26 26 20  ldExpr .     && 
adf0: 70 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pOldExpr->op==TK
ae00: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20  _SELECT_COLUMN. 
ae10: 20 20 20 20 26 26 20 28 70 4e 65 77 45 78 70 72      && (pNewExpr
ae20: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29   = pItem->pExpr)
ae30: 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
ae40: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78    assert( pNewEx
ae50: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c  pr->iColumn==0 |
ae60: 7c 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 69  | i>0 );.      i
ae70: 66 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f  f( pNewExpr->iCo
ae80: 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lumn==0 ){.     
ae90: 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 45     assert( pOldE
aea0: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64  xpr->pLeft==pOld
aeb0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a  Expr->pRight );.
aec0: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 53 65          pPriorSe
aed0: 6c 65 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78  lectCol = pNewEx
aee0: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77  pr->pLeft = pNew
aef0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
af00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
af10: 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
af20: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
af30: 28 20 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70  ( pItem[-1].pExp
af40: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
af50: 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72  assert( pNewExpr
af60: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d  ->iColumn==pItem
af70: 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  [-1].pExpr->iCol
af80: 75 6d 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  umn+1 );.       
af90: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 53   assert( pPriorS
afa0: 65 6c 65 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b  electCol==pItem[
afb0: 2d 31 5d 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74  -1].pExpr->pLeft
afc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
afd0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50  Expr->pLeft = pP
afe0: 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20  riorSelectCol;. 
aff0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b000: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
b010: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b020: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
b030: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
b040: 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
b050: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b060: 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  dItem->zSpan);. 
b070: 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72     pItem->sortOr
b080: 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  der = pOldItem->
b090: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70  sortOrder;.    p
b0a0: 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a  Item->done = 0;.
b0b0: 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e      pItem->bSpan
b0c0: 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  IsTab = pOldItem
b0d0: 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20 20  ->bSpanIsTab;.  
b0e0: 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c    pItem->u = pOl
b0f0: 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20  dItem->u;.  }.  
b100: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
b110: 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73  /*.** If cursors
b120: 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77  , triggers, view
b130: 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
b140: 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64   are all omitted
b150: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69   from.** the bui
b160: 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66  ld, then none of
b170: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
b180: 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20  outines, except 
b190: 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53  for .** sqlite3S
b1a0: 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20  electDup(), can 
b1b0: 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74  be called. sqlit
b1c0: 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73  e3SelectDup() is
b1d0: 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61   sometimes.** ca
b1e0: 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c  lled with a NULL
b1f0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
b200: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
b210: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
b220: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b230: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a  OMIT_TRIGGER) \.
b240: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
b250: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b260: 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  Y).SrcList *sqli
b270: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71  te3SrcListDup(sq
b280: 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
b290: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
b2a0: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  ){.  SrcList *pN
b2b0: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
b2c0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65  nt nByte;.  asse
b2d0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
b2e0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b2f0: 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   0;.  nByte = si
b300: 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e  zeof(*p) + (p->n
b310: 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70  Src>0 ? sizeof(p
b320: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53  ->a[0]) * (p->nS
b330: 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e  rc-1) : 0);.  pN
b340: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
b350: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42  llocRawNN(db, nB
b360: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  yte );.  if( pNe
b370: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
b380: 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20  .  pNew->nSrc = 
b390: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
b3a0: 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->nSrc;.  for(i=
b3b0: 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b  0; i<p->nSrc; i+
b3c0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
b3d0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  rcList_item *pNe
b3e0: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
b3f0: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
b400: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  SrcList_item *pO
b410: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
b420: 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
b430: 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ab;.    pNewItem
b440: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64  ->pSchema = pOld
b450: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  Item->pSchema;. 
b460: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61     pNewItem->zDa
b470: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
b480: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b490: 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  dItem->zDatabase
b4a0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b4b0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
b4c0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
b4d0: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
b4e0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
b4f0: 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ias = sqlite3DbS
b500: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
b510: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
b520: 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20   pNewItem->fg = 
b530: 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20  pOldItem->fg;.  
b540: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72    pNewItem->iCur
b550: 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sor = pOldItem->
b560: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65  iCursor;.    pNe
b570: 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  wItem->addrFillS
b580: 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61  ub = pOldItem->a
b590: 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20  ddrFillSub;.    
b5a0: 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74  pNewItem->regRet
b5b0: 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  urn = pOldItem->
b5c0: 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 69  regReturn;.    i
b5d0: 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e  f( pNewItem->fg.
b5e0: 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20  isIndexedBy ){. 
b5f0: 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75       pNewItem->u
b600: 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73  1.zIndexedBy = s
b610: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b620: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e  b, pOldItem->u1.
b630: 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20  zIndexedBy);.   
b640: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
b650: 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64  >pIBIndex = pOld
b660: 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a  Item->pIBIndex;.
b670: 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d      if( pNewItem
b680: 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
b690: 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d  {.      pNewItem
b6a0: 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20  ->u1.pFuncArg = 
b6b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b6c0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
b6d0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70  , pOldItem->u1.p
b6e0: 46 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29 3b  FuncArg, flags);
b6f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
b700: 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62  = pNewItem->pTab
b710: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61   = pOldItem->pTa
b720: 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  b;.    if( pTab 
b730: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  ){.      pTab->n
b740: 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  TabRef++;.    }.
b750: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
b760: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
b770: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c  electDup(db, pOl
b780: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  dItem->pSelect, 
b790: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
b7a0: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
b7b0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b7c0: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c  OldItem->pOn, fl
b7d0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
b7e0: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
b7f0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
b800: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
b810: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
b820: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
b830: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
b840: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
b850: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
b860: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
b870: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
b880: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
b890: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
b8a0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
b8b0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
b8c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
b8d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b8e0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
b8f0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
b900: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
b910: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
b920: 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  Id = p->nId;.  p
b930: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  New->a = sqlite3
b940: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b950: 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  , p->nId*sizeof(
b960: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
b970: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a  ( pNew->a==0 ){.
b980: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b990: 65 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  eNN(db, pNew);. 
b9a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
b9b0: 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  /* Note that 
b9c0: 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65  because the size
b9d0: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   of the allocati
b9e0: 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73  on for p->a[] is
b9f0: 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73   not.  ** necess
ba00: 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66  arily a power of
ba10: 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c   two, sqlite3IdL
ba20: 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20  istAppend() may 
ba30: 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20  not be called.  
ba40: 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63  ** on the duplic
ba50: 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74  ate created by t
ba60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  his function. */
ba70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
ba80: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
ba90: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
baa0: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
bab0: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
bac0: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
bad0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
bae0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65  p->a[i];.    pNe
baf0: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
bb00: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
bb10: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
bb20: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
bb30: 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65  m->idx = pOldIte
bb40: 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65  m->idx;.  }.  re
bb50: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c  turn pNew;.}.Sel
bb60: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
bb70: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
bb80: 62 2c 20 53 65 6c 65 63 74 20 2a 70 44 75 70 2c  b, Select *pDup,
bb90: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
bba0: 65 6c 65 63 74 20 2a 70 52 65 74 20 3d 20 30 3b  elect *pRet = 0;
bbb0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78 74  .  Select *pNext
bbc0: 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a   = 0;.  Select *
bbd0: 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 20 20 53  *pp = &pRet;.  S
bbe0: 65 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61 73 73  elect *p;..  ass
bbf0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
bc00: 66 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b 20 70  for(p=pDup; p; p
bc10: 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  =p->pPrior){.   
bc20: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d 20   Select *pNew = 
bc30: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
bc40: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
bc50: 2a 70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  *p) );.    if( p
bc60: 4e 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  New==0 ) break;.
bc70: 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74      pNew->pEList
bc80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
bc90: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
bca0: 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ist, flags);.   
bcb0: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71   pNew->pSrc = sq
bcc0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
bcd0: 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61  db, p->pSrc, fla
bce0: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  gs);.    pNew->p
bcf0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
bd00: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  xprDup(db, p->pW
bd10: 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  here, flags);.  
bd20: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
bd30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
bd40: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72  stDup(db, p->pGr
bd50: 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  oupBy, flags);. 
bd60: 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67     pNew->pHaving
bd70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
bd80: 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  p(db, p->pHaving
bd90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
bda0: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
bdb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
bdc0: 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  p(db, p->pOrderB
bdd0: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  y, flags);.    p
bde0: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
bdf0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  .    pNew->pNext
be00: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 70 4e   = pNext;.    pN
be10: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ew->pPrior = 0;.
be20: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74      pNew->pLimit
be30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
be40: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  p(db, p->pLimit,
be50: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
be60: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c  w->pOffset = sql
be70: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
be80: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67  p->pOffset, flag
be90: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c  s);.    pNew->iL
bea0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
beb0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
bec0: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c  .    pNew->selFl
bed0: 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
bee0: 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65  s & ~SF_UsesEphe
bef0: 6d 65 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77 2d  meral;.    pNew-
bf00: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
bf10: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
bf20: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
bf30: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d   = -1;.    pNew-
bf40: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
bf50: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
bf60: 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77   pNew->pWith = w
bf70: 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  ithDup(db, p->pW
bf80: 69 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ith);.    sqlite
bf90: 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
bfa0: 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65  New, p->zSelName
bfb0: 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 4e 65  );.    *pp = pNe
bfc0: 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70 4e 65  w;.    pp = &pNe
bfd0: 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  w->pPrior;.    p
bfe0: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  Next = pNew;.  }
bff0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
c000: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
c010: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
c020: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
c030: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
c040: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
c050: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
c060: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
c070: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
c080: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
c090: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
c0a0: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
c0b0: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
c0c0: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
c0d0: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
c0e0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
c0f0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
c100: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
c110: 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72  ccurs, the entir
c120: 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20  e list is freed 
c130: 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  and.** NULL is r
c140: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e  eturned.  If non
c150: 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  -NULL is returne
c160: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  d, then it is gu
c170: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74  aranteed.** that
c180: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
c190: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
c1a0: 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70  appended..*/.Exp
c1b0: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
c1c0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  prListAppend(.  
c1d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c1e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c1f0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c200: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
c210: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
c220: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
c230: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
c240: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  L */.  Expr *pEx
c250: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
c260: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
c270: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
c280: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
c290: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
c2a0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
c2b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c2c0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
c2d0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
c2e0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
c2f0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
c300: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
c310: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
c320: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
c330: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
c340: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
c350: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
c360: 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ->nExpr = 0;.   
c370: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
c380: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
c390: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 4c  pList->nExpr==pL
c3a0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
c3b0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
c3c0: 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  w;.    pNew = sq
c3d0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
c3e0: 62 2c 20 70 4c 69 73 74 2c 20 0a 20 20 20 20 20  b, pList, .     
c3f0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
c400: 70 4c 69 73 74 29 2b 28 32 2a 70 4c 69 73 74 2d  pList)+(2*pList-
c410: 3e 6e 41 6c 6c 6f 63 20 2d 20 31 29 2a 73 69 7a  >nAlloc - 1)*siz
c420: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
c430: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
c440: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
c450: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
c460: 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b     pList = pNew;
c470: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
c480: 6f 63 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20 70  oc *= 2;.  }.  p
c490: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
c4a0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
c4b0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d  ;.  memset(pItem
c4c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
c4d0: 65 6d 29 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70  em));.  pItem->p
c4e0: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
c4f0: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e  return pList;..n
c500: 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a  o_mem:     .  /*
c510: 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d   Avoid leaking m
c520: 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20  emory if malloc 
c530: 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20  has failed. */. 
c540: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
c550: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
c560: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c570: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
c580: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
c590: 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73  ../*.** pColumns
c5a0: 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72 6d 20   and pExpr form 
c5b0: 61 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d  a vector assignm
c5c0: 65 6e 74 20 77 68 69 63 68 20 69 73 20 70 61 72  ent which is par
c5d0: 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a 20  t of the SET.** 
c5e0: 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55 50 44  clause of an UPD
c5f0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ATE statement.  
c600: 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
c610: 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63 29 20          (a,b,c) 
c620: 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  = (expr1,expr2,e
c630: 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20  xpr3).** Or:    
c640: 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45 43  (a,b,c) = (SELEC
c650: 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e  T x,y,z FROM ...
c660: 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  .).**.** For eac
c670: 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 76 65  h term of the ve
c680: 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c  ctor assignment,
c690: 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e 74 72   append new entr
c6a0: 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78  ies to the.** ex
c6b0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c  pression list pL
c6c0: 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63 61 73  ist.  In the cas
c6d0: 65 20 6f 66 20 61 20 73 75 62 71 75 65 72 79 20  e of a subquery 
c6e0: 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70 70 65  on the RHS, appe
c6f0: 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f  nd.** TK_SELECT_
c700: 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f  COLUMN expressio
c710: 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  ns..*/.ExprList 
c720: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
c730: 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a 20 20  AppendVector(.  
c740: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c750: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
c760: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
c770: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
c780: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
c790: 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64   which to append
c7a0: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
c7b0: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f  */.  IdList *pCo
c7c0: 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c  lumns,      /* L
c7d0: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20  ist of names of 
c7e0: 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73 69 67  LHS of the assig
c7f0: 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20  nment */.  Expr 
c800: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
c810: 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78 70 72    /* Vector expr
c820: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70  ession to be app
c830: 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20  ended. Might be 
c840: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  NULL */.){.  sql
c850: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
c860: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a  e->db;.  int n;.
c870: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
c880: 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20 3f 20  First = pList ? 
c890: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
c8a0: 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20  ;.  /* pColumns 
c8b0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c  can only be NULL
c8c0: 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62   due to an OOM b
c8d0: 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63  ut an OOM will c
c8e0: 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69  ause an.  ** exi
c8f0: 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  t prior to this 
c900: 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20 69 6e  routine being in
c910: 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e  voked */.  if( N
c920: 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30  EVER(pColumns==0
c930: 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f  ) ) goto vector_
c940: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20  append_error;.  
c950: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 67  if( pExpr==0 ) g
c960: 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e  oto vector_appen
c970: 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49  d_error;..  /* I
c980: 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20 76  f the RHS is a v
c990: 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65 20 63  ector, then we c
c9a0: 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 63  an immediately c
c9b0: 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
c9c0: 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20   .  ** the size 
c9d0: 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c  of the RHS and L
c9e0: 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74 20 69  HS match.  But i
c9f0: 66 20 74 68 65 20 52 48 53 20 69 73 20 61 20 53  f the RHS is a S
ca00: 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77 69 6c  ELECT, .  ** wil
ca10: 64 63 61 72 64 73 20 28 22 2a 22 29 20 69 6e 20  dcards ("*") in 
ca20: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
ca30: 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d 75 73  f the SELECT mus
ca40: 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65  t be expanded be
ca50: 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63 61 6e  fore.  ** we can
ca60: 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63 68 65   do the size che
ca70: 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74 68 65  ck, so defer the
ca80: 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e 74 69   size check unti
ca90: 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
caa0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45  n..  */.  if( pE
cab0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  xpr->op!=TK_SELE
cac0: 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e  CT && pColumns->
cad0: 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65 33 45  nId!=(n=sqlite3E
cae0: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45  xprVectorSize(pE
caf0: 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  xpr)) ){.    sql
cb00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
cb10: 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73  rse, "%d columns
cb20: 20 61 73 73 69 67 6e 65 64 20 25 64 20 76 61 6c   assigned %d val
cb30: 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ues",.          
cb40: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d            pColum
cb50: 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20  ns->nId, n);.   
cb60: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
cb70: 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a  end_error;.  }..
cb80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
cb90: 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29  lumns->nId; i++)
cba0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 75 62  {.    Expr *pSub
cbb0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
cbc0: 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64  prForVectorField
cbd0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
cbe0: 69 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  i);.    pList = 
cbf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
cc00: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c  ppend(pParse, pL
cc10: 69 73 74 2c 20 70 53 75 62 45 78 70 72 29 3b 0a  ist, pSubExpr);.
cc20: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
cc30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cc40: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 69 46 69  List->nExpr==iFi
cc50: 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20 20 20 20  rst+i+1 );.     
cc60: 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d   pList->a[pList-
cc70: 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
cc80: 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d  = pColumns->a[i]
cc90: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  .zName;.      pC
cca0: 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  olumns->a[i].zNa
ccb0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  me = 0;.    }.  
ccc0: 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  }..  if( !db->ma
ccd0: 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 70 45  llocFailed && pE
cce0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
ccf0: 43 54 20 26 26 20 41 4c 57 41 59 53 28 70 4c 69  CT && ALWAYS(pLi
cd00: 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 45 78  st!=0) ){.    Ex
cd10: 70 72 20 2a 70 46 69 72 73 74 20 3d 20 70 4c 69  pr *pFirst = pLi
cd20: 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45  st->a[iFirst].pE
cd30: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
cd40: 20 70 46 69 72 73 74 21 3d 30 20 29 3b 0a 20 20   pFirst!=0 );.  
cd50: 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74    assert( pFirst
cd60: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
cd70: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a  COLUMN );.     .
cd80: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
cd90: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
cda0: 74 20 69 6e 20 70 52 69 67 68 74 20 73 6f 20 69  t in pRight so i
cdb0: 74 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  t will be delete
cdc0: 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 73 71  d when.    ** sq
cdd0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
cde0: 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ete() is called 
cdf0: 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 70  */.    pFirst->p
ce00: 52 69 67 68 74 20 3d 20 70 45 78 70 72 3b 0a 20  Right = pExpr;. 
ce10: 20 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 0a 20     pExpr = 0;.. 
ce20: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
ce30: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4c  he size of the L
ce40: 48 53 20 69 6e 20 69 54 61 62 6c 65 20 73 6f 20  HS in iTable so 
ce50: 74 68 61 74 20 77 65 20 63 61 6e 20 63 68 65 63  that we can chec
ce60: 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  k that.    ** th
ce70: 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20 73 69  e RHS and LHS si
ce80: 7a 65 73 20 6d 61 74 63 68 20 64 75 72 69 6e 67  zes match during
ce90: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
cea0: 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72 73 74 2d  . */.    pFirst-
ceb0: 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d  >iTable = pColum
cec0: 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65  ns->nId;.  }..ve
ced0: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
cee0: 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  r:.  sqlite3Expr
cef0: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
cf00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69  );.  sqlite3IdLi
cf10: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  stDelete(db, pCo
cf20: 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74 75 72 6e  lumns);.  return
cf30: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
cf40: 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72   Set the sort or
cf50: 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74  der for the last
cf60: 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20   element on the 
cf70: 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a  given ExprList..
cf80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
cf90: 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72  xprListSetSortOr
cfa0: 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  der(ExprList *p,
cfb0: 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29   int iSortOrder)
cfc0: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
cfd0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
cfe0: 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46   SQLITE_SO_UNDEF
cff0: 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45  INED<0 && SQLITE
d000: 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51  _SO_ASC>=0 && SQ
d010: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29  LITE_SO_DESC>0 )
d020: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
d030: 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  Expr>0 );.  if( 
d040: 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a  iSortOrder<0 ){.
d050: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
d060: 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [p->nExpr-1].sor
d070: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
d080: 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74  O_ASC );.    ret
d090: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b  urn;.  }.  p->a[
d0a0: 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  p->nExpr-1].sort
d0b0: 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72  Order = (u8)iSor
d0c0: 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tOrder;.}../*.**
d0d0: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
d0e0: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d  t.a[].zName elem
d0f0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
d100: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
d110: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
d120: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
d130: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
d140: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
d150: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
d160: 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75    But pName shou
d170: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
d180: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
d190: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
d1a0: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
d1b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d1c0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
d1d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d1e0: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
d1f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d200: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
d210: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d220: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d230: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
d240: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
d250: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
d260: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
d270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
d280: 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  e to be added */
d290: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
d2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
d2b0: 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ue to cause the 
d2c0: 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f  name to be dequo
d2d0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ted */.){.  asse
d2e0: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
d2f0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
d300: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
d310: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
d320: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
d330: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
d340: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
d350: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
d360: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
d370: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
d380: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
d390: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
d3a0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
d3b0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
d3c0: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
d3d0: 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  b, pName->z, pNa
d3e0: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
d3f0: 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74 65  dequote ) sqlite
d400: 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e  3Dequote(pItem->
d410: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zName);.  }.}../
d420: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
d430: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
d440: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
d450: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
d460: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
d470: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
d480: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
d490: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
d4a0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
d4b0: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
d4c0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
d4d0: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
d4e0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
d4f0: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
d500: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
d510: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
d520: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
d530: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
d540: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
d550: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
d560: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d570: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
d580: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
d590: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
d5a0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
d5b0: 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a   */.  ExprSpan *
d5c0: 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a  pSpan         /*
d5d0: 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20   The span to be 
d5e0: 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  added */.){.  sq
d5f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
d600: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
d610: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
d620: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
d630: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
d640: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
d650: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
d660: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
d670: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
d680: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
d690: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
d6a0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
d6b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
d6c0: 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70  Item->pExpr==pSp
d6d0: 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  an->pExpr );.   
d6e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d6f0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
d700: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
d710: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
d720: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
d730: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d760: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
d770: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
d780: 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start));.  }.}..
d790: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
d7a0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
d7b0: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
d7c0: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
d7d0: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
d7e0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
d7f0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
d800: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
d810: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
d820: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d830: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
d840: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
d850: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
d860: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
d870: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
d880: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
d890: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
d8a0: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
d8b0: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
d8c0: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
d8d0: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
d8e0: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
d8f0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
d900: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
d910: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d920: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
d930: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
d940: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
d950: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
d960: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
d970: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
d980: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
d990: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70  OINLINE void exp
d9a0: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71  rListDeleteNN(sq
d9b0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
d9c0: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
d9d0: 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nt i = pList->nE
d9e0: 78 70 72 3b 0a 20 20 73 74 72 75 63 74 20 45 78  xpr;.  struct Ex
d9f0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
da00: 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e 61 3b 0a  em =  pList->a;.
da10: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
da20: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 64 6f  >nExpr>0 );.  do
da30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
da40: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
da50: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73  m->pExpr);.    s
da60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
da70: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
da80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
da90: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
daa0: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2b 2b  an);.    pItem++
dab0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d 69 3e  ;.  }while( --i>
dac0: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  0 );.  sqlite3Db
dad0: 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74  FreeNN(db, pList
dae0: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
daf0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
db00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
db10: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
db20: 20 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70   if( pList ) exp
db30: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62  rListDeleteNN(db
db40: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
db50: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69  ** Return the bi
db60: 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20  twise-OR of all 
db70: 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64  Expr.flags field
db80: 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a  s in the given.*
db90: 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75  * ExprList..*/.u
dba0: 33 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  32 sqlite3ExprLi
dbb0: 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78  stFlags(const Ex
dbc0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
dbd0: 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d    int i;.  u32 m
dbe0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 0;.  if( pLis
dbf0: 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
dc00: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
dc10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45  ; i++){.       E
dc20: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69  xpr *pExpr = pLi
dc30: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
dc40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
dc50: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
dc60: 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c    m |= pExpr->fl
dc70: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ags;.    }.  }. 
dc80: 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a   return m;.}../*
dc90: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
dca0: 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61  es are Walker ca
dcb0: 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20  llbacks used to 
dcc0: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
dcd0: 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74  s to.** see if t
dce0: 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e  hey are "constan
dcf0: 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69  t" for some defi
dd00: 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61  nition of consta
dd10: 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b  nt.  The.** Walk
dd20: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64  er.eCode value d
dd30: 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79  etermines the ty
dd40: 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22  pe of "constant"
dd50: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a   we are looking.
dd60: 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ** for..**.** Th
dd70: 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ese callback rou
dd80: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
dd90: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
dda0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
ddb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ddc0: 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  IsConstant()    
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
dde0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a  alker->eCode==1.
ddf0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
de00: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
de10: 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20  oin()           
de20: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
de30: 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  2.**     sqlite3
de40: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
de50: 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20  ant()           
de60: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
de70: 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ==3.**     sqlit
de80: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
de90: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20  OrFunction()    
dea0: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
deb0: 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a  de==4 or 5.**.**
dec0: 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74   In all cases, t
ded0: 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74  he callbacks set
dee0: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20   Walker.eCode=0 
def0: 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65  and abort if the
df00: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
df10: 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62  s found to not b
df20: 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a  e a constant..**
df30: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
df40: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
df50: 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65  unction() is use
df60: 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  d for evaluating
df70: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
df80: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
df90: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
dfa0: 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76  e Walker.eCode v
dfb0: 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70  alue is 5 when p
dfc0: 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69  arsing.** an exi
dfd0: 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64  sting schema and
dfe0: 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69   4 when processi
dff0: 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65  ng a new stateme
e000: 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20  nt.  A bound.** 
e010: 70 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73  parameter raises
e020: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65   an error for ne
e030: 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75  w statements, bu
e040: 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f  t is silently co
e050: 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55  nverted.** to NU
e060: 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  LL for existing 
e070: 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61  schemas.  This a
e080: 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73  llows sqlite_mas
e090: 74 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20  ter tables that 
e0a0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f  .** contain a bo
e0b0: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65  und parameter be
e0c0: 63 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20  cause they were 
e0d0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64  generated by old
e0e0: 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  er versions.** o
e0f0: 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70  f SQLite to be p
e100: 61 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76  arsed by newer v
e110: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
e120: 65 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e  e without raisin
e130: 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  g a.** malformed
e140: 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a   schema error..*
e150: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
e160: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
e170: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
e180: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a   Expr *pExpr){..
e190: 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d    /* If pWalker-
e1a0: 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e  >eCode is 2 then
e1b0: 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65   any term of the
e1c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
e1d0: 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a   comes from.  **
e1e0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
e1f0: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65   clauses of a le
e200: 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69  ft join disquali
e210: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
e220: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
e230: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
e240: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
e250: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
e260: 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72  ==2 && ExprHasPr
e270: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
e280: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
e290: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
e2a0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
e2b0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
e2c0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
e2d0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ->op ){.    /* C
e2e0: 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e  onsider function
e2f0: 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74  s to be constant
e300: 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72   if all their ar
e310: 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73  guments are cons
e320: 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  tant.    ** and 
e330: 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e  either pWalker->
e340: 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72  eCode==4 or 5 or
e350: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61   the function ha
e360: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c  s the.    ** SQL
e370: 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66  ITE_FUNC_CONST f
e380: 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65  lag. */.    case
e390: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
e3a0: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
e3b0: 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70  >eCode>=4 || Exp
e3c0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
e3d0: 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29  pr,EP_ConstFunc)
e3e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e3f0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
e400: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e410: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
e420: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
e430: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e440: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
e450: 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20  case TK_ID:.    
e460: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a  case TK_COLUMN:.
e470: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
e480: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
e490: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
e4a0: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
e4b0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e4c0: 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ID );.      test
e4d0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
e4e0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
e4f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
e500: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
e510: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
e520: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
e530: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
e540: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66  LUMN );.      if
e550: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
e560: 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54  ==3 && pExpr->iT
e570: 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
e580: 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  .iCur ){.       
e590: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
e5a0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
e5b0: 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  e{.        pWalk
e5c0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
e5d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
e5e0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
e5f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
e600: 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28  IABLE:.      if(
e610: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
e620: 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =5 ){.        /*
e630: 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72   Silently conver
e640: 74 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  t bound paramete
e650: 72 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  rs that appear i
e660: 6e 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a  nside of CREATE.
e670: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65          ** state
e680: 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c  ments into a NUL
e690: 4c 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74  L when parsing t
e6a0: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
e6b0: 65 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20  ent text out.   
e6c0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73       ** of the s
e6d0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
e6e0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45  le */.        pE
e6f0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
e700: 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
e710: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
e720: 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  e==4 ){.        
e730: 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d  /* A bound param
e740: 65 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45  eter in a CREATE
e750: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
e760: 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a  originates from.
e770: 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
e780: 65 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75  e3_prepare() cau
e790: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ses an error */.
e7a0: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
e7b0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
e7c0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
e7d0: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
e7e0: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
e7f0: 75 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75  ugh */.    defau
e800: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
e810: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
e820: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
e830: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
e840: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
e850: 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  w */.      testc
e860: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
e870: 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20  TK_EXISTS ); /* 
e880: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
e890: 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c  tant will disall
e8a0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
e8b0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
e8c0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e  .  }.}.static in
e8d0: 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  t selectNodeIsCo
e8e0: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
e8f0: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
e900: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
e910: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
e920: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
e930: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72  ->eCode = 0;.  r
e940: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
e950: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
e960: 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a  prIsConst(Expr *
e970: 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c  p, int initFlag,
e980: 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61   int iCur){.  Wa
e990: 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
e9a0: 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
e9b0: 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20  ));.  w.eCode = 
e9c0: 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45  initFlag;.  w.xE
e9d0: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
e9e0: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
e9f0: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
ea00: 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f  lback = selectNo
ea10: 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
ea20: 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  w.u.iCur = iCur;
ea30: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
ea40: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
ea50: 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
ea60: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
ea70: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
ea80: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
ea90: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
eaa0: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
eab0: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76   and 0 if it inv
eac0: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
ead0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
eae0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
eaf0: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
eb00: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
eb10: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
eb20: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
eb30: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
eb40: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
eb50: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
eb60: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
eb70: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
eb80: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
eb90: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
eba0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
ebb0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
ebc0: 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  p, 1, 0);.}../*.
ebd0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
ebe0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
ebf0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
ec00: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ec10: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
ec20: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
ec30: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
ec40: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
ec50: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
ec60: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
ec70: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
ec80: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
ec90: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
eca0: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
ecb0: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
ecc0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
ecd0: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
ece0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
ecf0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
ed00: 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 2, 0);.}../*.*
ed10: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
ed20: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
ed30: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
ed40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
ed50: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
ed60: 20 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20   any single row 
ed70: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  of the table wit
ed80: 68 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20  h cursor iCur.  
ed90: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
eda0: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
edb0: 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72  n must not refer
edc0: 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65   to any non-dete
edd0: 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69  rministic functi
ede0: 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61  on nor any.** ta
edf0: 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69  ble other than i
ee00: 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Cur..*/.int sqli
ee10: 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
ee20: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20  nstant(Expr *p, 
ee30: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74  int iCur){.  ret
ee40: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
ee50: 70 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a  p, 3, iCur);.}..
ee60: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61  ./*.** sqlite3Wa
ee70: 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63  lkExpr() callbac
ee80: 6b 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65  k used by sqlite
ee90: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
eea0: 72 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73  rGroupBy()..*/.s
eeb0: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
eec0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  deIsConstantOrGr
eed0: 6f 75 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57  oupBy(Walker *pW
eee0: 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
eef0: 70 72 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  pr){.  ExprList 
ef00: 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c  *pGroupBy = pWal
ef10: 6b 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b  ker->u.pGroupBy;
ef20: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
ef30: 43 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69  Check if pExpr i
ef40: 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61  s identical to a
ef50: 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  ny GROUP BY term
ef60: 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65  . If so, conside
ef70: 72 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61  r.  ** it consta
ef80: 6e 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  nt.  */.  for(i=
ef90: 30 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; i<pGroupBy->n
efa0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
efb0: 45 78 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70  Expr *p = pGroup
efc0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
efd0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
efe0: 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72  xprCompare(pExpr
eff0: 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20  , p, -1)<2 ){.  
f000: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
f010: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
f020: 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72 2d  CollSeq(pWalker-
f030: 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  >pParse, p);.   
f040: 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
f050: 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  || sqlite3_stric
f060: 6d 70 28 22 42 49 4e 41 52 59 22 2c 20 70 43 6f  mp("BINARY", pCo
f070: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ll->zName)==0 ){
f080: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f090: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
f0a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
f0b0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78 70  /* Check if pExp
f0c0: 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  r is a sub-selec
f0d0: 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64  t. If so, consid
f0e0: 65 72 20 69 74 20 76 61 72 69 61 62 6c 65 2e 20  er it variable. 
f0f0: 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  */.  if( ExprHas
f100: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f110: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
f120: 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
f130: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ode = 0;.    ret
f140: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
f150: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 65 78 70   }..  return exp
f160: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
f170: 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b  pWalker, pExpr);
f180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74  .}../*.** Walk t
f190: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
f1a0: 65 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ee passed as the
f1b0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
f1c0: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
f1d0: 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65  .** if the expre
f1e0: 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20 65  ssion consists e
f1f0: 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74  ntirely of const
f200: 61 6e 74 73 20 6f 72 20 63 6f 70 69 65 73 20 6f  ants or copies o
f210: 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20 70  f terms .** in p
f220: 47 72 6f 75 70 42 79 20 74 68 61 74 20 73 6f 72  GroupBy that sor
f230: 74 20 77 69 74 68 20 74 68 65 20 42 49 4e 41 52  t with the BINAR
f240: 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  Y collation sequ
f250: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ence..**.** This
f260: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
f270: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
f280: 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48   a term of the H
f290: 41 56 49 4e 47 20 63 6c 61 75 73 65 20 63 61 6e  AVING clause can
f2a0: 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64 20  .** be promoted 
f2b0: 69 6e 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  into the WHERE c
f2c0: 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64 65 72  lause.  In order
f2d0: 20 66 6f 72 20 73 75 63 68 20 61 20 70 72 6f 6d   for such a prom
f2e0: 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a 2a  otion to work,.*
f2f0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
f300: 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
f310: 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 68   term must be th
f320: 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20 6d  e same for all m
f330: 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20 22  embers of.** a "
f340: 67 72 6f 75 70 22 2e 20 20 54 68 65 20 72 65 71  group".  The req
f350: 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68  uirement that th
f360: 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20  e GROUP BY term 
f370: 6d 75 73 74 20 62 65 20 42 49 4e 41 52 59 0a 2a  must be BINARY.*
f380: 2a 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 6e  * assumes that n
f390: 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e  o other collatin
f3a0: 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  g sequence will 
f3b0: 68 61 76 65 20 61 20 66 69 6e 65 72 2d 67 72 61  have a finer-gra
f3c0: 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e 67  ined.** grouping
f3d0: 20 74 68 61 6e 20 62 69 6e 61 72 79 2e 20 20 49   than binary.  I
f3e0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 28 41  n other words (A
f3f0: 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72  =B COLLATE binar
f400: 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41 3d  y) implies.** A=
f410: 42 20 69 6e 20 65 76 65 72 79 20 6f 74 68 65 72  B in every other
f420: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
f430: 6e 63 65 2e 20 20 54 68 65 20 72 65 71 75 69 72  nce.  The requir
f440: 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 0a 2a  ement that the.*
f450: 2a 20 47 52 4f 55 50 20 42 59 20 62 65 20 42 49  * GROUP BY be BI
f460: 4e 41 52 59 20 69 73 20 73 74 72 69 63 74 65 72  NARY is stricter
f470: 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e   than necessary.
f480: 20 20 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f 20    It would also 
f490: 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d 6f  work.** to promo
f4a0: 74 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  te HAVING clause
f4b0: 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 73  s that use the s
f4c0: 61 6d 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ame alternative 
f4d0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
f4e0: 75 65 6e 63 65 20 61 73 20 74 68 65 20 47 52 4f  uence as the GRO
f4f0: 55 50 20 42 59 20 74 65 72 6d 2c 20 62 75 74 20  UP BY term, but 
f500: 74 68 61 74 20 69 73 20 6d 75 63 68 20 68 61 72  that is much har
f510: 64 65 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a 2a  der to check,.**
f520: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
f530: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
f540: 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61   are uncommon, a
f550: 6e 64 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20  nd this is only 
f560: 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69  an.** optimizati
f570: 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b 65 20 74  on, so we take t
f580: 68 65 20 65 61 73 79 20 77 61 79 20 6f 75 74 20  he easy way out 
f590: 61 6e 64 20 73 69 6d 70 6c 79 20 72 65 71 75 69  and simply requi
f5a0: 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50 20  re the.** GROUP 
f5b0: 42 59 20 74 6f 20 75 73 65 20 74 68 65 20 42 49  BY to use the BI
f5c0: 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20 73  NARY collating s
f5d0: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74 20  equence..*/.int 
f5e0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
f5f0: 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 50  stantOrGroupBy(P
f600: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
f610: 70 72 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20  pr *p, ExprList 
f620: 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20 20 57 61  *pGroupBy){.  Wa
f630: 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
f640: 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
f650: 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20  ));.  w.eCode = 
f660: 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  1;.  w.xExprCall
f670: 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49  back = exprNodeI
f680: 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
f690: 42 79 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70  By;.  w.u.pGroup
f6a0: 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
f6b0: 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
f6c0: 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
f6d0: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
f6e0: 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
f6f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
f700: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
f710: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
f720: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
f730: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
f740: 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f  .** or a functio
f750: 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73  n call with cons
f760: 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
f770: 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66   Return and 0 if
f780: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e   there.** are an
f790: 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  y variables..**.
f7a0: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
f7b0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
f7c0: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
f7d0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
f7e0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
f7f0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
f800: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
f810: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
f820: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
f830: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
f840: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
f850: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
f860: 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38  tion(Expr *p, u8
f870: 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65   isInit){.  asse
f880: 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  rt( isInit==0 ||
f890: 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20   isInit==1 );.  
f8a0: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
f8b0: 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20  st(p, 4+isInit, 
f8c0: 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  0);.}..#ifdef SQ
f8d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
f8e0: 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57  OR_HINTS./*.** W
f8f0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
f900: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
f910: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
f920: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ion contains a.*
f930: 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f  * subquery of so
f940: 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e  me kind.  Return
f950: 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20   0 if there are 
f960: 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  no subqueries..*
f970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
f980: 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72  rContainsSubquer
f990: 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61  y(Expr *p){.  Wa
f9a0: 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
f9b0: 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
f9c0: 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20  ));.  w.eCode = 
f9d0: 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  1;.  w.xExprCall
f9e0: 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
f9f0: 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
fa00: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
fa10: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
fa20: 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65  nstant;.  sqlite
fa30: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
fa40: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
fa50: 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  de==0;.}.#endif.
fa60: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
fa70: 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73  pression p codes
fa80: 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
fa90: 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
faa0: 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
fab0: 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
fac0: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
fad0: 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
fae0: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
faf0: 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
fb00: 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
fb10: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
fb20: 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
fb30: 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
fb40: 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
fb50: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
fb60: 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
fb70: 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
fb80: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
fb90: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
fba0: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
fbb0: 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72  pValue){.  int r
fbc0: 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d  c = 0;.  if( p==
fbd0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
fbe0: 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  * Can only happe
fbf0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 4f  n following on O
fc00: 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61  OM */..  /* If a
fc10: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
fc20: 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72  an integer liter
fc30: 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e 20  al that fits in 
fc40: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a  a signed 32-bit.
fc50: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68    ** integer, th
fc60: 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  en the EP_IntVal
fc70: 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76  ue flag will hav
fc80: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
fc90: 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  et */.  assert( 
fca0: 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  p->op!=TK_INTEGE
fcb0: 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26  R || (p->flags &
fcc0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30   EP_IntValue)!=0
fcd0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
fce0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
fcf0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29  ->u.zToken, &rc)
fd00: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ==0 );..  if( p-
fd10: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
fd20: 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61  alue ){.    *pVa
fd30: 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75  lue = p->u.iValu
fd40: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e;.    return 1;
fd50: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
fd60: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
fd70: 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
fd80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45     rc = sqlite3E
fd90: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
fda0: 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a  pLeft, pValue);.
fdb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fdc0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
fdd0: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
fde0: 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  nt v;.      if( 
fdf0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
fe00: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  eger(p->pLeft, &
fe10: 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  v) ){.        as
fe20: 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34  sert( v!=(-21474
fe30: 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20  83647-1) );.    
fe40: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
fe50: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
fe60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fe70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fe80: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
fe90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
fea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
feb0: 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65  n FALSE if there
fec0: 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
fed0: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
fee0: 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a  n can be NULL..*
fef0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
ff00: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20  ession might be 
ff10: 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65  NULL or if the e
ff20: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f  xpression is too
ff30: 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74   complex.** to t
ff40: 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e  ell return TRUE.
ff50: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
ff60: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73  utine is used as
ff70: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
ff80: 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e  , to skip OP_IsN
ff90: 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77  ull opcodes.** w
ffa0: 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  hen we know that
ffb0: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
ffc0: 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  be NULL.  Hence,
ffd0: 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
ffe0: 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  e.** (returning 
fff0: 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63  TRUE when in fac
10000 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
10010 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55   can never be NU
10020 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  LL) might.** be 
10030 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61  a small performa
10040 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f  nce hit but is o
10050 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73  therwise harmles
10060 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  s.  On the other
10070 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73  .** hand, a fals
10080 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75  e negative (retu
10090 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e  rning FALSE when
100a0 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c   the result coul
100b0 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69  d be NULL).** wi
100c0 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
100d0 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74   in an incorrect
100e0 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65   answer.  So whe
100f0 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75  n in doubt, retu
10100 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69  rn.** TRUE..*/.i
10110 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  nt sqlite3ExprCa
10120 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78  nBeNull(const Ex
10130 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b  pr *p){.  u8 op;
10140 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
10150 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
10160 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
10170 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
10180 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
10190 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
101a0 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
101b0 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
101c0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
101d0 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
101e0 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
101f0 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
10200 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
10210 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
10220 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
10230 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  LUMN:.      asse
10240 72 74 28 20 70 2d 3e 70 54 61 62 21 3d 30 20 29  rt( p->pTab!=0 )
10250 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 45  ;.      return E
10260 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
10270 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20  , EP_CanBeNull) 
10280 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
10290 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  (p->iColumn>=0 &
102a0 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  & p->pTab->aCol[
102b0 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  p->iColumn].notN
102c0 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66  ull==0);.    def
102d0 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
102e0 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
102f0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
10300 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
10310 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73  ession is a cons
10320 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64  tant which would
10330 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64   be.** unchanged
10340 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   by OP_Affinity 
10350 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74  with the affinit
10360 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73  y given in the s
10370 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
10380 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
10390 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
103a0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
103b0 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  e OP_Affinity op
103c0 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  eration.** can b
103d0 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e  e omitted.  When
103e0 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e   in doubt return
103f0 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65   FALSE.  A false
10400 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20   negative.** is 
10410 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c  harmless.  A fal
10420 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77  se positive, how
10430 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74  ever, can result
10440 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a   in the wrong.**
10450 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20   answer..*/.int 
10460 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
10470 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
10480 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20  (const Expr *p, 
10490 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20  char aff){.  u8 
104a0 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53  op;.  if( aff==S
104b0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
104c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69   return 1;.  whi
104d0 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
104e0 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LUS || p->op==TK
104f0 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70  _UMINUS ){ p = p
10500 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20  ->pLeft; }.  op 
10510 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  = p->op;.  if( o
10520 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
10530 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20   op = p->op2;.  
10540 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
10550 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
10560 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
10570 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
10580 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
10590 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
105a0 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
105b0 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
105c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
105d0 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
105e0 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  AL || aff==SQLIT
105f0 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
10600 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
10610 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
10620 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
10630 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
10640 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
10650 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65  BLOB: {.      re
10660 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
10670 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
10680 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
10690 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29  ( p->iTable>=0 )
106a0 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62  ;  /* p cannot b
106b0 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43  e part of a CHEC
106c0 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  K constraint */.
106d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e        return p->
106e0 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20  iColumn<0.      
106f0 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
10700 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
10710 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
10720 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20  FF_NUMERIC);.   
10730 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
10740 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
10750 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
10760 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
10770 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   if the given st
10780 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64  ring is a row-id
10790 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f   column name..*/
107a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f  .int sqlite3IsRo
107b0 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  wid(const char *
107c0 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  z){.  if( sqlite
107d0 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f  3StrICmp(z, "_RO
107e0 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75  WID_")==0 ) retu
107f0 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
10800 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52  te3StrICmp(z, "R
10810 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  OWID")==0 ) retu
10820 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
10830 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f  te3StrICmp(z, "O
10840 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
10850 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
10860 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74  }../*.** pX is t
10870 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e 20  he RHS of an IN 
10880 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 70 58  operator.  If pX
10890 20 69 73 20 61 20 53 45 4c 45 43 54 20 73 74 61   is a SELECT sta
108a0 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20  tement .** that 
108b0 63 61 6e 20 62 65 20 73 69 6d 70 6c 69 66 69 65  can be simplifie
108c0 64 20 74 6f 20 61 20 64 69 72 65 63 74 20 74 61  d to a direct ta
108d0 62 6c 65 20 61 63 63 65 73 73 2c 20 74 68 65 6e  ble access, then
108e0 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   return.** a poi
108f0 6e 74 65 72 20 74 6f 20 74 68 65 20 53 45 4c 45  nter to the SELE
10900 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  CT statement.  I
10910 66 20 70 58 20 69 73 20 6e 6f 74 20 61 20 53 45  f pX is not a SE
10920 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a  LECT statement,.
10930 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 53 45 4c  ** or if the SEL
10940 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6e 65  ECT statement ne
10950 65 64 73 20 74 6f 20 62 65 20 6d 61 6e 69 66 65  eds to be manife
10960 73 74 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e  sted into a tran
10970 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20  sient.** table, 
10980 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c  then return NULL
10990 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
109a0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
109b0 59 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74 20  Y.static Select 
109c0 2a 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49  *isCandidateForI
109d0 6e 4f 70 74 28 45 78 70 72 20 2a 70 58 29 7b 0a  nOpt(Expr *pX){.
109e0 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53    Select *p;.  S
109f0 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
10a00 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10a10 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
10a20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
10a30 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
10a40 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
10a50 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  t) ) return 0;  
10a60 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71 75 65 72  /* Not a subquer
10a70 79 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48  y */.  if( ExprH
10a80 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
10a90 50 5f 56 61 72 53 65 6c 65 63 74 29 20 20 29 20  P_VarSelect)  ) 
10aa0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f  return 0;  /* Co
10ab0 72 72 65 6c 61 74 65 64 20 73 75 62 71 20 2a 2f  rrelated subq */
10ac0 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65  .  p = pX->x.pSe
10ad0 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  lect;.  if( p->p
10ae0 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30  Prior ) return 0
10af0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10b00 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  * Not a compound
10b10 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
10b20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28   p->selFlags & (
10b30 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
10b40 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20  ggregate) ){.   
10b50 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
10b60 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
10b70 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
10b80 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
10b90 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ct );.    testca
10ba0 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
10bb0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
10bc0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
10bd0 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a  SF_Aggregate );.
10be0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
10bf0 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79   No DISTINCT key
10c00 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72  word and no aggr
10c10 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
10c20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  */.  }.  assert(
10c30 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
10c40 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
10c50 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20  /* Has no GROUP 
10c60 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
10c70 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  f( p->pLimit ) r
10c80 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
10c90 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
10ca0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a  LIMIT clause */.
10cb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
10cc0 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  fset==0 );      
10cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c           /* No L
10ce0 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46  IMIT means no OF
10cf0 46 53 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  FSET */.  if( p-
10d00 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
10d10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10d20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45   /* Has no WHERE
10d30 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72   clause */.  pSr
10d40 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
10d50 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
10d60 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53  ;.  if( pSrc->nS
10d70 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
10d80 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
10d90 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f  ngle term in FRO
10da0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  M clause */.  if
10db0 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ( pSrc->a[0].pSe
10dc0 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
10dd0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20       /* FROM is 
10de0 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f  not a subquery o
10df0 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62  r view */.  pTab
10e00 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54   = pSrc->a[0].pT
10e10 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ab;.  assert( pT
10e20 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab!=0 );.  asser
10e30 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  t( pTab->pSelect
10e40 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
10e50 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
10e60 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a   is not a view *
10e70 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
10e80 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
10e90 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52   0;        /* FR
10ea0 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20  OM clause not a 
10eb0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
10ec0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
10ed0 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28  EList;.  assert(
10ee0 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
10ef0 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65  /* All SELECT re
10f00 73 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f  sults must be co
10f10 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28  lumns. */.  for(
10f20 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
10f30 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
10f40 45 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c  Expr *pRes = pEL
10f50 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
10f60 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f  .    if( pRes->o
10f70 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
10f80 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73  eturn 0;.    ass
10f90 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c  ert( pRes->iTabl
10fa0 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43  e==pSrc->a[0].iC
10fb0 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74  ursor );  /* Not
10fc0 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
10fd0 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20  bquery */.  }.  
10fe0 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64  return p;.}.#end
10ff0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11000 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
11010 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11020 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
11030 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
11040 74 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20  that checks the 
11050 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
11060 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20   of index table 
11070 69 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a  iCur to see if.*
11080 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  * it contains an
11090 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20  y NULL entries. 
110a0 20 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73   Cause the regis
110b0 74 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c  ter at regHasNul
110c0 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74  l to be set.** t
110d0 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  o a non-NULL val
110e0 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  ue if iCur conta
110f0 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43  ins no NULLs.  C
11100 61 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65  ause register re
11110 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62  gHasNull.** to b
11120 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  e set to NULL if
11130 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f   iCur contains o
11140 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
11150 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  values..*/.stati
11160 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
11170 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62  tHasNullFlag(Vdb
11180 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20  e *v, int iCur, 
11190 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b  int regHasNull){
111a0 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20  .  int addr1;.  
111b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
111c0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
111d0 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b   0, regHasNull);
111e0 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
111f0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
11200 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29  OP_Rewind, iCur)
11210 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
11220 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11230 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
11240 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65  umn, iCur, 0, re
11250 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c  gHasNull);.  sql
11260 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
11270 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  (v, OPFLAG_TYPEO
11280 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d  FARG);.  VdbeCom
11290 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f  ment((v, "first_
112a0 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69  entry_in(%d)", i
112b0 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cur));.  sqlite3
112c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
112d0 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66  addr1);.}.#endif
112e0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
112f0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
11300 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
11310 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  nt is an IN oper
11320 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74  ator with a list
11330 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79   (not a subquery
11340 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67  ) on the .** rig
11350 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52  ht-hand side.  R
11360 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
11370 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74  at list is const
11380 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ant..*/.static i
11390 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49  nt sqlite3InRhsI
113a0 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
113b0 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c  pIn){.  Expr *pL
113c0 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  HS;.  int res;. 
113d0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
113e0 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45  sProperty(pIn, E
113f0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
11400 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c    pLHS = pIn->pL
11410 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66  eft;.  pIn->pLef
11420 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73  t = 0;.  res = s
11430 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
11440 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e  tant(pIn);.  pIn
11450 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a  ->pLeft = pLHS;.
11460 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
11470 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
11480 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
11490 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
114a0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
114b0 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
114c0 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61  or..** The pX pa
114d0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
114e0 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65  xpression on the
114f0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
11500 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a  perator, which.*
11510 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65  * might be eithe
11520 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  r a list of expr
11530 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62  essions or a sub
11540 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
11550 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
11560 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20  tine is to find 
11570 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72  or create a b-tr
11580 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63  ee object that c
11590 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69  an.** be used ei
115a0 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72  ther to test for
115b0 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74   membership in t
115c0 68 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f  he RHS set or to
115d0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
115e0 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  .** all members 
115f0 6f 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20  of the RHS set, 
11600 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61  skipping duplica
11610 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72  tes..**.** A cur
11620 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  sor is opened on
11630 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
11640 63 74 20 74 68 61 74 20 69 73 20 74 68 65 20 52  ct that is the R
11650 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
11660 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d  rator.** and pX-
11670 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  >iTable is set t
11680 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
11690 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  hat cursor..**.*
116a0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
116b0 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
116c0 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20  ction indicates 
116d0 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c  the b-tree type,
116e0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
116f0 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
11700 57 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63  WID      - The c
11710 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
11720 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
11730 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
11740 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d  DEX_INDEX_ASC  -
11750 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
11760 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63  opened on an asc
11770 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a  ending index..**
11780 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
11790 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72  X_DESC - The cur
117a0 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
117b0 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
117c0 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  ndex..**   IN_IN
117d0 44 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d  DEX_EPH        -
117e0 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
117f0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63  opened on a spec
11800 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e  ially created an
11810 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70               pop
11830 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c  ulated epheremal
11840 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
11850 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20  INDEX_NOOP      
11860 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73   - No cursor was
11870 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65   allocated.  The
11880 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73   IN operator mus
11890 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  t be.**         
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118b0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
118c0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d   sequence of com
118d0 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  parisons..**.** 
118e0 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72  An existing b-tr
118f0 65 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  ee might be used
11900 20 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72   if the RHS expr
11910 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73  ession pX is a s
11920 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72  imple.** subquer
11930 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a  y such as:.**.**
11940 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
11950 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e  umn1>, <column2>
11960 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e  ... FROM <table>
11970 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48  .**.** If the RH
11980 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
11990 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f  ator is a list o
119a0 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  r a more complex
119b0 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a   subquery, then.
119c0 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ** an ephemeral 
119d0 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64  table might need
119e0 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
119f0 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e   from the RHS an
11a00 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54  d then.** pX->iT
11a10 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69  able made to poi
11a20 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65  nt to the epheme
11a30 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61  ral table instea
11a40 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74  d of an.** exist
11a50 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ing table..**.**
11a60 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72   The inFlags par
11a70 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74  ameter must cont
11a80 61 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ain exactly one 
11a90 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49  of the bits.** I
11aa0 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
11ab0 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c  IP or IN_INDEX_L
11ac0 4f 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73  OOP.  If inFlags
11ad0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f   contains.** IN_
11ae0 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
11af0 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72  , then the gener
11b00 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20  ated table will 
11b10 62 65 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a  be used for a.**
11b20 20 66 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70   fast membership
11b30 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65   test.  When the
11b40 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62   IN_INDEX_LOOP b
11b50 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a  it is set, the.*
11b60 2a 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20  * IN index will 
11b70 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20  be used to loop 
11b80 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
11b90 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  of the RHS of th
11ba0 65 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72  e.** IN operator
11bb0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
11bc0 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73  INDEX_LOOP is us
11bd0 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
11be0 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
11bf0 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
11c00 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
11c10 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20  mbers) then the 
11c20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20  b-tree must not 
11c30 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74  contain duplicat
11c40 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65  es..** An ephere
11c50 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62  mal table must b
11c60 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68  e used unless th
11c70 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d  e selected colum
11c80 6e 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ns are guarantee
11c90 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75  d.** to be uniqu
11ca0 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75  e - either becau
11cb0 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45  se it is an INTE
11cc0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
11cd0 6f 72 20 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55  or due to.** a U
11ce0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
11cf0 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a   or index..**.**
11d00 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d   When IN_INDEX_M
11d10 45 4d 42 45 52 53 48 49 50 20 69 73 20 75 73 65  EMBERSHIP is use
11d20 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65  d (and the b-tre
11d30 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
11d40 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20  ** for fast set 
11d50 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
11d60 29 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65  ) then an ephere
11d70 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a  mal table must .
11d80 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73  ** be used unles
11d90 73 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61  s <columns> is a
11da0 20 73 69 6e 67 6c 65 20 49 4e 54 45 47 45 52 20   single INTEGER 
11db0 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
11dc0 6d 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64  mn or an .** ind
11dd0 65 78 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  ex can be found 
11de0 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
11df0 65 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20  ed <columns> as 
11e00 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a  its left-most..*
11e10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49  *.** If the IN_I
11e20 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64  NDEX_NOOP_OK and
11e30 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
11e40 53 48 49 50 20 61 72 65 20 62 6f 74 68 20 73 65  SHIP are both se
11e50 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20  t and.** if the 
11e60 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
11e70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
11e80 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79   (not a subquery
11e90 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72  ) then this.** r
11ea0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63  outine might dec
11eb0 69 64 65 20 74 68 61 74 20 63 72 65 61 74 69 6e  ide that creatin
11ec0 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62  g an ephemeral b
11ed0 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72  -tree for member
11ee0 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ship.** testing 
11ef0 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65  is too expensive
11f00 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49   and return IN_I
11f10 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74  NDEX_NOOP.  In t
11f20 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a  hat case, the.**
11f30 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
11f40 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e   should implemen
11f50 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  t the IN operato
11f60 72 20 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e  r using a sequen
11f70 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e  ce.** of Eq or N
11f80 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
11f90 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57  rations..**.** W
11fa0 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69  hen the b-tree i
11fb0 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  s being used for
11fc0 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
11fd0 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  s, the calling f
11fe0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74  unction.** might
11ff0 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68   need to know wh
12000 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
12010 20 52 48 53 20 73 69 64 65 20 6f 66 20 74 68 65   RHS side of the
12020 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
12030 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e  contains a NULL.
12040 20 20 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c    If prRhsHasNul
12050 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20  l is not a NULL 
12060 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20  pointer and .** 
12070 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  if there is any 
12080 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
12090 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74  (...) might cont
120a0 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ain a NULL value
120b0 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20   at.** runtime, 
120c0 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20  then a register 
120d0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
120e0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
120f0 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20  mber written.** 
12100 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  to *prRhsHasNull
12110 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
12120 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
12130 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20   (...) contains 
12140 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c  a.** NULL value,
12150 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e   then *prRhsHasN
12160 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68  ull is left unch
12170 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
12180 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
12190 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20  located and its 
121a0 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  location stored 
121b0 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  in *prRhsHasNull
121c0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61  , then.** the va
121d0 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65 67 69  lue in that regi
121e0 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c  ster will be NUL
121f0 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20  L if the b-tree 
12200 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
12210 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  more.** NULL val
12220 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c  ues, and it will
12230 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c   be some non-NUL
12240 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 62  L value if the b
12250 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e  -tree contains n
12260 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  o.** NULL values
12270 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61  ..**.** If the a
12280 69 4d 61 70 20 70 61 72 61 6d 65 74 65 72 20 69  iMap parameter i
12290 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d  s not NULL, it m
122a0 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ust point to an 
122b0 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67  array containing
122c0 0a 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20  .** one element 
122d0 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
122e0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
122f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12300 20 6f 6e 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f   on the RHS.** o
12310 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70  f the IN(...) op
12320 65 72 61 74 6f 72 2e 20 54 68 65 20 69 27 74 68  erator. The i'th
12330 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 61 72   entry of the ar
12340 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ray is populated
12350 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66   with the.** off
12360 73 65 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  set of the index
12370 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74   column that mat
12380 63 68 65 73 20 74 68 65 20 69 27 74 68 20 63 6f  ches the i'th co
12390 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79  lumn returned by
123a0 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20   the.** SELECT. 
123b0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
123c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
123d0 6e 64 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65  nd selected inde
123e0 78 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  x are:.**.**   (
123f0 3f 2c 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43  ?,?,?) IN (SELEC
12400 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74  T a, b, c FROM t
12410 31 29 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  1).**   CREATE I
12420 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 2c  NDEX i1 ON t1(b,
12430 20 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68   c, a);.**.** th
12440 65 6e 20 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f  en aiMap[] is po
12450 70 75 6c 61 74 65 64 20 77 69 74 68 20 7b 32 2c  pulated with {2,
12460 20 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64   0, 1}..*/.#ifnd
12470 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
12480 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
12490 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a  te3FindInIndex(.
124a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
124c0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
124d0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 2c 20 20  */.  Expr *pX,  
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124f0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
12500 64 20 73 69 64 65 20 28 52 48 53 29 20 6f 66 20  d side (RHS) of 
12510 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
12520 2a 2f 0a 20 20 75 33 32 20 69 6e 46 6c 61 67 73  */.  u32 inFlags
12530 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12540 2f 2a 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  /* IN_INDEX_LOOP
12550 2c 20 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 61  , _MEMBERSHIP, a
12560 6e 64 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a  nd/or _NOOP_OK *
12570 2f 0a 20 20 69 6e 74 20 2a 70 72 52 68 73 48 61  /.  int *prRhsHa
12580 73 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 2f  sNull,         /
12590 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
125a0 6e 67 20 4e 55 4c 4c 20 73 74 61 74 75 73 2e 20  ng NULL status. 
125b0 20 53 65 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20   See notes */.  
125c0 69 6e 74 20 2a 61 69 4d 61 70 20 20 20 20 20 20  int *aiMap      
125d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
125e0 70 70 69 6e 67 20 66 72 6f 6d 20 49 6e 64 65 78  pping from Index
125f0 20 66 69 65 6c 64 73 20 74 6f 20 52 48 53 20 66   fields to RHS f
12600 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  ields */.){.  Se
12610 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20  lect *p;        
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12630 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f      /* SELECT to
12640 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e   the right of IN
12650 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
12660 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20  nt eType = 0;   
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12680 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
12690 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e  RHS table. IN_IN
126a0 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69  DEX_* */.  int i
126b0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
126c0 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  ab++;           
126d0 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68   /* Cursor of th
126e0 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20  e RHS table */. 
126f0 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75   int mustBeUniqu
12700 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12710 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
12720 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e  f RHS must be un
12730 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ique */.  Vdbe *
12740 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
12750 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  be(pParse);     
12760 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69  /* Virtual machi
12770 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ne being coded *
12780 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d  /..  assert( pX-
12790 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
127a0 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28  mustBeUnique = (
127b0 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44  inFlags & IN_IND
127c0 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20  EX_LOOP)!=0;..  
127d0 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66  /* If the RHS of
127e0 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70   this IN(...) op
127f0 65 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45  erator is a SELE
12800 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61  CT, and if it ma
12810 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74  tters .  ** whet
12820 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53  her or not the S
12830 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e  ELECT result con
12840 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65  tains NULL value
12850 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65 72  s, check whether
12860 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c  .  ** or not NUL
12870 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f  L is actually po
12880 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e  ssible (it may n
12890 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70  ot be, for examp
128a0 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f  le, due .  ** to
128b0 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
128c0 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68  aints in the sch
128d0 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c  ema). If no NULL
128e0 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73   values are poss
128f0 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70  ible,.  ** set p
12900 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30  rRhsHasNull to 0
12910 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69   before continui
12920 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72  ng.  */.  if( pr
12930 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70  RhsHasNull && (p
12940 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  X->flags & EP_xI
12950 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
12960 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c  int i;.    ExprL
12970 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58  ist *pEList = pX
12980 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
12990 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ist;.    for(i=0
129a0 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
129b0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
129c0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  f( sqlite3ExprCa
129d0 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e  nBeNull(pEList->
129e0 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72  a[i].pExpr) ) br
129f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
12a00 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45  f( i==pEList->nE
12a10 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52  xpr ){.      prR
12a20 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20  hsHasNull = 0;. 
12a30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
12a40 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
12a50 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
12a60 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65   or index can be
12a70 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61   used to.  ** sa
12a80 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79 2e  tisfy the query.
12a90 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65 72    This is prefer
12aa0 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69  able to generati
12ab0 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65  ng a new .  ** e
12ac0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20  phemeral table. 
12ad0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
12ae0 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20  ->nErr==0 && (p 
12af0 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  = isCandidateFor
12b00 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b  InOpt(pX))!=0 ){
12b10 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
12b20 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
12b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
12b40 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12b50 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  on */.    Table 
12b60 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b80 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65   /* Table <table
12b90 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44  >. */.    i16 iD
12ba0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bc0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78   /* Database idx
12bd0 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20   for pTab */.   
12be0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
12bf0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
12c00 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
12c10 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20  EList->nExpr;.. 
12c20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
12c30 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20  List!=0 );      
12c40 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73         /* Becaus
12c50 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65  e of isCandidate
12c60 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20  ForInOpt(p) */. 
12c70 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
12c80 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
12c90 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73  !=0 ); /* Becaus
12ca0 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65  e of isCandidate
12cb0 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20  ForInOpt(p) */. 
12cc0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53     assert( p->pS
12cd0 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  rc!=0 );        
12ce0 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73         /* Becaus
12cf0 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65  e of isCandidate
12d00 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20  ForInOpt(p) */. 
12d10 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72     pTab = p->pSr
12d20 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20  c->a[0].pTab;.. 
12d30 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50     /* Code an OP
12d40 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  _Transaction and
12d50 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f   OP_TableLock fo
12d60 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  r <table>. */.  
12d70 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
12d80 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
12d90 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
12da0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
12db0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
12dc0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
12dd0 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
12de0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
12df0 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
12e00 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61  ->zName);..    a
12e10 73 73 65 72 74 28 76 29 3b 20 20 2f 2a 20 73 71  ssert(v);  /* sq
12e20 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20 68  lite3GetVdbe() h
12e30 61 73 20 61 6c 77 61 79 73 20 62 65 65 6e 20 70  as always been p
12e40 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
12e50 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 78 70   */.    if( nExp
12e60 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e  r==1 && pEList->
12e70 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[0].pExpr->iCol
12e80 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f  umn<0 ){.      /
12e90 2a 20 54 68 65 20 22 78 20 49 4e 20 28 53 45 4c  * The "x IN (SEL
12ea0 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
12eb0 61 62 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a 20  able)" case */. 
12ec0 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
12ed0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12ee0 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a  p0(v, OP_Once);.
12ef0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
12f00 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71  ge(v);..      sq
12f10 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
12f20 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
12f30 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
12f40 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70  ead);.      eTyp
12f50 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
12f60 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ID;..      sqlit
12f70 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12f80 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65  , iAddr);.    }e
12f90 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
12fa0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fc0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
12fd0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
12fe0 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
12ff0 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  1;.      int i;.
13000 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
13010 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
13020 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
13030 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65  sed to perform e
13040 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ach .      ** co
13050 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20  mparison is the 
13060 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69  same as the affi
13070 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c  nity of each col
13080 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20  umn in table.   
13090 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53     ** on the RHS
130a0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
130b0 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c  tor.  If it not,
130c0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
130d0 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
130e0 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66  use any index of
130f0 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20   the RHS table. 
13100 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
13110 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66  0; i<nExpr && af
13120 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b  finity_ok; i++){
13130 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
13140 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63  Lhs = sqlite3Vec
13150 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
13160 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pX->pLeft, i);. 
13170 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
13180 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
13190 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
131a0 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61         char idxa
131b0 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c  ff = sqlite3Tabl
131c0 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  eColumnAffinity(
131d0 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52  pTab,iCol); /* R
131e0 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  HS table */.    
131f0 20 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20      char cmpaff 
13200 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
13210 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69  Affinity(pLhs, i
13220 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  dxaff);.        
13230 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66  testcase( cmpaff
13240 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
13250 42 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  B );.        tes
13260 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53  tcase( cmpaff==S
13270 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
13280 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  ;.        switch
13290 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20  ( cmpaff ){.    
132a0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
132b0 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20  E_AFF_BLOB:.    
132c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
132d0 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
132e0 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20  LITE_AFF_TEXT:. 
132f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
13300 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
13310 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75  nity() only retu
13320 72 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20  rns TEXT if one 
13330 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20  side or the.    
13340 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
13350 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79   has no affinity
13360 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73   and the other s
13370 69 64 65 20 69 73 20 54 45 58 54 2e 20 20 48 65  ide is TEXT.  He
13380 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nce,.           
13390 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   ** the only way
133a0 20 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62   for cmpaff to b
133b0 65 20 54 45 58 54 20 69 73 20 66 6f 72 20 69 64  e TEXT is for id
133c0 78 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a  xaff to be TEXT.
133d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
133e0 6e 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20  nd for the term 
133f0 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
13400 65 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20  e IN to have no 
13410 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
13420 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
13430 20 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f   idxaff==SQLITE_
13440 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
13450 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13460 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
13470 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66  :.            af
13480 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69  finity_ok = sqli
13490 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
134a0 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20  nity(idxaff);.  
134b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
134c0 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 69 6e  .      if( affin
134d0 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20  ity_ok ){.      
134e0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
134f0 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65  an existing inde
13500 78 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b  x that will work
13510 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65   for this IN ope
13520 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
13530 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
13540 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20  pIndex; pIdx && 
13550 65 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70  eType==0; pIdx=p
13560 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
13570 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63         Bitmask c
13580 6f 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20  olUsed;      /* 
13590 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  Columns of the i
135a0 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20 20  ndex used */.   
135b0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
135c0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Col;         /* 
135d0 4d 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75 72  Mask for the cur
135e0 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  rent column */. 
135f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
13600 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72  x->nColumn<nExpr
13610 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
13620 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
13630 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53  m nColumn is BMS
13640 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73  -2, not BMS-1, s
13650 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 6f  o that we can co
13660 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20 20 20  mpute.          
13670 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70 72  ** BITMASK(nExpr
13680 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66 6c  ) without overfl
13690 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  owing */.       
136a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64     testcase( pId
136b0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d  x->nColumn==BMS-
136c0 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  2 );.          t
136d0 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e  estcase( pIdx->n
136e0 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b  Column==BMS-1 );
136f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
13700 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d  Idx->nColumn>=BM
13710 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  S-1 ) continue;.
13720 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 75            if( mu
13730 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20 20  stBeUnique ){.  
13740 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
13750 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70  dx->nKeyCol>nExp
13760 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  r.             |
13770 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  |(pIdx->nColumn>
13780 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e 69 71  nExpr && !IsUniq
13790 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a 20  ueIndex(pIdx)). 
137a0 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
137b0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
137c0 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 69  inue;  /* This i
137d0 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69 71  ndex is not uniq
137e0 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20 52  ue over the IN R
137f0 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  HS columns */.  
13800 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13810 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
13820 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20 30       colUsed = 0
13830 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f  ;   /* Columns o
13840 66 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f 20  f index used so 
13850 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  far */.         
13860 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
13870 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
13880 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
13890 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
138a0 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
138b0 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
138c0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 68         Expr *pRh
138d0 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s = pEList->a[i]
138e0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
138f0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65      CollSeq *pRe
13900 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  q = sqlite3Binar
13910 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
13920 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52  pParse, pLhs, pR
13930 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  hs);.           
13940 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20   int j;.  .     
13950 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13960 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e  Req!=0 || pRhs->
13970 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49  iColumn==XN_ROWI
13980 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  D || pParse->nEr
13990 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
139a0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70   for(j=0; j<nExp
139b0 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
139c0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
139d0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52  >aiColumn[j]!=pR
139e0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  hs->iColumn ) co
139f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
13a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
13a10 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b  dx->azColl[j] );
13a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
13a30 66 28 20 70 52 65 71 21 3d 30 20 26 26 20 73 71  f( pReq!=0 && sq
13a40 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65  lite3StrICmp(pRe
13a50 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e  q->zName, pIdx->
13a60 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b  azColl[j])!=0 ){
13a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13a80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13a90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13aa0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
13ac0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
13ad0 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a  =nExpr ) break;.
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c              mCol
13af0 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20   = MASKBIT(j);. 
13b00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d             if( m
13b10 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29 20  Col & colUsed ) 
13b20 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63  break; /* Each c
13b30 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20  olumn used only 
13b40 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  once */.        
13b50 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d      colUsed |= m
13b60 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
13b70 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d   if( aiMap ) aiM
13b80 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20  ap[i] = j;.     
13b90 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
13ba0 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
13bb0 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21  Expr || colUsed!
13bc0 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29  =(MASKBIT(nExpr)
13bd0 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  -1) );.         
13be0 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d   if( colUsed==(M
13bf0 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
13c00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13c10 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
13c20 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
13c30 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78 20  means the index 
13c40 70 49 64 78 20 69 73 20 75 73 61 62 6c 65 20 2a  pIdx is usable *
13c50 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
13c60 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
13c70 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
13c80 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
13c90 65 72 61 67 65 28 76 29 3b 0a 23 69 66 6e 64 65  erage(v);.#ifnde
13ca0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
13cb0 50 4c 41 49 4e 0a 20 20 20 20 20 20 20 20 20 20  PLAIN.          
13cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13cd0 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
13ce0 6e 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  n, 0, 0, 0,.    
13cf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13d00 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 55 53  3MPrintf(db, "US
13d10 49 4e 47 20 49 4e 44 45 58 20 25 73 20 46 4f 52  ING INDEX %s FOR
13d20 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70 49   IN-OPERATOR",pI
13d30 64 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20  dx->zName),.    
13d40 20 20 20 20 20 20 20 20 20 20 50 34 5f 44 59 4e            P4_DYN
13d50 41 4d 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  AMIC);.#endif.  
13d60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13d70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
13d80 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62  P_OpenRead, iTab
13d90 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
13da0 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
13db0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
13dc0 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
13dd0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pIdx);.         
13de0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
13df0 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a  v, "%s", pIdx->z
13e00 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
13e10 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49      assert( IN_I
13e20 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
13e30 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  == IN_INDEX_INDE
13e40 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20  X_ASC+1 );.     
13e50 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
13e60 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
13e70 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  C + pIdx->aSortO
13e80 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20  rder[0];.  .    
13e90 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52 68          if( prRh
13ea0 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64  sHasNull ){.#ifd
13eb0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
13ec0 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
13ed0 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
13ee0 69 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e  i64 mask = (1<<n
13ef0 45 78 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20  Expr)-1;.       
13f00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13f10 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
13f20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
13f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f40 20 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28     iTab, 0, 0, (
13f50 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e  u8*)&mask, P4_IN
13f60 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  T64);.#endif.   
13f70 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
13f80 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
13f90 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
13fa0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 78           if( nEx
13fb0 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr==1 ){.       
13fc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13fd0 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
13fe0 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61  , iTab, *prRhsHa
13ff0 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  sNull);.        
14000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14010 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14020 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
14030 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
14040 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14050 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f       } /* End lo
14060 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65 73 20  op over indexes 
14070 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e  */.      } /* En
14080 64 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f  d if( affinity_o
14090 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20  k ) */.    } /* 
140a0 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f  End if not an ro
140b0 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d  wid index */.  }
140c0 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70 74 20   /* End attempt 
140d0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e  to optimize usin
140e0 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  g an index */.. 
140f0 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
14100 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
14110 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
14120 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
14130 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
14140 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
14150 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
14160 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
14170 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
14180 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
14190 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
141a0 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73   RHS is not cons
141b0 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20  tant or has two 
141c0 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a  or fewer terms,.
141d0 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20    ** then it is 
141e0 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69  not worth creati
141f0 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
14200 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74  table to evaluat
14210 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70  e.  ** the IN op
14220 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e  erator so return
14230 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a   IN_INDEX_NOOP..
14240 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
14250 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61  ==0.   && (inFla
14260 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  gs & IN_INDEX_NO
14270 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78  OP_OK).   && !Ex
14280 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
14290 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a  , EP_xIsSelect).
142a0 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
142b0 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70  nRhsIsConstant(p
142c0 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73  X) || pX->x.pLis
142d0 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29  t->nExpr<=2).  )
142e0 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  {.    eType = IN
142f0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d  _INDEX_NOOP;.  }
14300 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
14310 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
14320 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
14330 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
14340 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
14350 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
14360 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
14370 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
14380 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
14390 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
143a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
143b0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
143c0 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
143d0 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
143e0 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
143f0 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
14400 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
14410 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
14420 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
14430 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
14440 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20  yLoop = 0;.     
14450 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
14460 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
14470 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
14480 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
14490 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65  ){.        eType
144a0 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
144b0 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
144c0 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
144d0 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
144e0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
144f0 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
14500 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14510 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
14520 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
14530 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
14540 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
14550 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
14560 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
14570 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75  yLoop = savedNQu
14580 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  eryLoop;.  }else
14590 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65  {.    pX->iTable
145a0 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20   = iTab;.  }..  
145b0 69 66 28 20 61 69 4d 61 70 20 26 26 20 65 54 79  if( aiMap && eTy
145c0 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe!=IN_INDEX_IND
145d0 45 58 5f 41 53 43 20 26 26 20 65 54 79 70 65 21  EX_ASC && eType!
145e0 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
145f0 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20  DESC ){.    int 
14600 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71  i, n;.    n = sq
14610 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
14620 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  ize(pX->pLeft);.
14630 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
14640 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20  ; i++) aiMap[i] 
14650 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
14660 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
14670 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
14680 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
14690 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
146a0 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f  Expr is an (?, ?
146b0 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70  ...) IN(...) exp
146c0 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a  ression. This .*
146d0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
146e0 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
146f0 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
14700 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  d string contain
14710 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69  ing .** the affi
14720 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65  nities to be use
14730 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  d for each colum
14740 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  n of the compari
14750 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  son..**.** It is
14760 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
14770 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
14780 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  r to ensure that
14790 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
147a0 20 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74   string is event
147b0 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
147c0 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
147d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
147e0 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74  r *exprINAffinit
147f0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
14800 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
14810 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
14820 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
14830 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
14840 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
14850 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74  pLeft);.  Select
14860 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78   *pSelect = (pEx
14870 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pr->flags & EP_x
14880 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70  IsSelect) ? pExp
14890 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30  r->x.pSelect : 0
148a0 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a  ;.  char *zRet;.
148b0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
148c0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
148d0 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44   zRet = sqlite3D
148e0 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61 72 73  bMallocRaw(pPars
148f0 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a  e->db, nVal+1);.
14900 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20    if( zRet ){.  
14910 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
14920 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b  (i=0; i<nVal; i+
14930 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
14940 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  pA = sqlite3Vect
14950 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
14960 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
14970 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33  char a = sqlite3
14980 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 41 29  ExprAffinity(pA)
14990 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  ;.      if( pSel
149a0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ect ){.        z
149b0 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Ret[i] = sqlite3
149c0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
149d0 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
149e0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b  >a[i].pExpr, a);
149f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14a00 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20        zRet[i] = 
14a10 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  a;.      }.    }
14a20 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20  .    zRet[nVal] 
14a30 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65  = '\0';.  }.  re
14a40 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e  turn zRet;.}.#en
14a50 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
14a60 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
14a70 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  Y./*.** Load the
14a80 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61   Parse object pa
14a90 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
14aa0 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  t argument with 
14ab0 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73  an error .** mes
14ac0 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  sage of the form
14ad0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73  :.**.**   "sub-s
14ae0 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20  elect returns N 
14af0 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
14b00 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64  ed M".*/   .void
14b10 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
14b20 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50  tError(Parse *pP
14b30 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61  arse, int nActua
14b40 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b  l, int nExpect){
14b50 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14b60 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63  Fmt = "sub-selec
14b70 74 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c  t returns %d col
14b80 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
14b90 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72  %d";.  sqlite3Er
14ba0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a  rorMsg(pParse, z
14bb0 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45  Fmt, nActual, nE
14bc0 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  xpect);.}.#endif
14bd0 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
14be0 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76 65  on pExpr is a ve
14bf0 63 74 6f 72 20 74 68 61 74 20 68 61 73 20 62 65  ctor that has be
14c00 65 6e 20 75 73 65 64 20 69 6e 20 61 20 63 6f 6e  en used in a con
14c10 74 65 78 74 20 77 68 65 72 65 0a 2a 2a 20 69 74  text where.** it
14c20 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65   is not permitte
14c30 64 2e 20 49 66 20 70 45 78 70 72 20 69 73 20 61  d. If pExpr is a
14c40 20 73 75 62 2d 73 65 6c 65 63 74 20 76 65 63 74   sub-select vect
14c50 6f 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  or, this routine
14c60 20 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65 20 50   .** loads the P
14c70 61 72 73 65 20 6f 62 6a 65 63 74 20 77 69 74 68  arse object with
14c80 20 61 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68   a message of th
14c90 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
14ca0 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75  "sub-select retu
14cb0 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20  rns N columns - 
14cc0 65 78 70 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a  expected 1".**.*
14cd0 2a 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 61  * Or, if it is a
14ce0 20 72 65 67 75 6c 61 72 20 73 63 61 6c 61 72 20   regular scalar 
14cf0 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  vector:.**.**   
14d00 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
14d10 65 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73  ed".*/   .void s
14d20 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f  qlite3VectorErro
14d30 72 4d 73 67 28 50 61 72 73 65 20 2a 70 50 61 72  rMsg(Parse *pPar
14d40 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
14d50 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
14d60 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
14d70 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
14d80 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
14d90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
14da0 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
14db0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70  arse, pExpr->x.p
14dc0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
14dd0 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c  nExpr, 1);.  }el
14de0 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
14df0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14e00 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
14e10 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
14e20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
14e30 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73  erate code for s
14e40 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73  calar subqueries
14e50 20 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75   used as a subqu
14e60 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ery expression, 
14e70 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e  EXISTS,.** or IN
14e80 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61   operators.  Exa
14e90 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
14ea0 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
14eb0 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73  b)          -- s
14ec0 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45  ubquery.**     E
14ed0 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20  XISTS (SELECT a 
14ee0 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49  FROM b)   -- EXI
14ef0 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20  STS subquery.** 
14f00 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31      x IN (4,5,11
14f10 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  )              -
14f20 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
14f30 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74  th list on right
14f40 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20  -hand side.**   
14f50 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61    x IN (SELECT a
14f60 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20   FROM b)     -- 
14f70 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
14f80 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
14f90 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65   right.**.** The
14fa0 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
14fb0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65   describes the e
14fc0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
14fd0 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a  ontains the IN.*
14fe0 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75  * operator or su
14ff0 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  bquery..**.** If
15000 20 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77   parameter isRow
15010 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  id is non-zero, 
15020 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
15030 70 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74  pExpr is guarant
15040 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20  eed.** to be of 
15050 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64  the form "<rowid
15060 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c  > IN (?, ?, ?)",
15070 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69   where <rowid> i
15080 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  s a reference.**
15090 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72   to some integer
150a0 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61   key column of a
150b0 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49   table B-Tree. I
150c0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65  n this case, use
150d0 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d   an.** intkey B-
150e0 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68  Tree to store th
150f0 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29  e set of IN(...)
15100 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20   values instead 
15110 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
15120 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c  (slower) variabl
15130 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d  e length keys B-
15140 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  Tree..**.** If r
15150 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e  MayHaveNull is n
15160 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65  on-zero, that me
15170 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65  ans that the ope
15180 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a  ration is an IN.
15190 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54  ** (not a SELECT
151a0 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20   or EXISTS) and 
151b0 74 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67  that the RHS mig
151c0 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  ht contains NULL
151d0 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72  s..** All this r
151e0 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69  outine does is i
151f0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65  nitialize the re
15200 67 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20  gister given by 
15210 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20  rMayHaveNull.** 
15220 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e  to NULL.  Callin
15230 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  g routines will 
15240 74 61 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61  take care of cha
15250 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73  nging this regis
15260 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20  ter.** value to 
15270 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20  non-NULL if the 
15280 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65  RHS is NULL-free
15290 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45  ..**.** For a SE
152a0 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f  LECT or EXISTS o
152b0 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20  perator, return 
152c0 74 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61  the register tha
152d0 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72  t holds the.** r
152e0 65 73 75 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75  esult.  For a mu
152f0 6c 74 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43  lti-column SELEC
15300 54 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  T, the result is
15310 20 73 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e   stored in a con
15320 74 69 67 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79  tiguous.** array
15330 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 6e   of registers an
15340 64 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  d the return val
15350 75 65 20 69 73 20 74 68 65 20 72 65 67 69 73 74  ue is the regist
15360 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d  er of the left-m
15370 6f 73 74 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  ost.** result co
15380 6c 75 6d 6e 2e 20 20 52 65 74 75 72 6e 20 30 20  lumn.  Return 0 
15390 66 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  for IN operators
153a0 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
153b0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64  occurs..*/.#ifnd
153c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
153d0 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
153e0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
153f0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15400 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
15410 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
15420 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
15430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15440 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f  he IN, SELECT, o
15450 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
15460 72 20 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e  r */.  int rHasN
15470 75 6c 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f  ullFlag,       /
15480 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
15490 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
154a0 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52  NULLs exist in R
154b0 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  HS */.  int isRo
154c0 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
154d0 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20  /* If true, LHS 
154e0 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  of IN operator i
154f0 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a  s a rowid */.){.
15500 20 20 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d    int jmpIfDynam
15510 69 63 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  ic = -1;        
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15530 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61   One-time test a
15540 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ddress */.  int 
15550 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  rReg = 0;       
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
15580 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e  storing resultin
15590 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  g */.  Vdbe *v =
155a0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
155b0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e  pParse);.  if( N
155c0 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
155d0 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
155e0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
155f0 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  arse);..  /* The
15600 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74   evaluation of t
15610 68 65 20 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c  he IN/EXISTS/SEL
15620 45 43 54 20 6d 75 73 74 20 62 65 20 72 65 70 65  ECT must be repe
15630 61 74 65 64 20 65 76 65 72 79 20 74 69 6d 65 20  ated every time 
15640 69 74 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75  it.  ** is encou
15650 6e 74 65 72 65 64 20 69 66 20 61 6e 79 20 6f 66  ntered if any of
15660 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
15670 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  s true:.  **.  *
15680 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
15690 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
156a0 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
156b0 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20  uery.  **    *  
156c0 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
156d0 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73  ide is an expres
156e0 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
156f0 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20  ning variables. 
15700 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65   **    *  We are
15710 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65   inside a trigge
15720 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61  r.  **.  ** If a
15730 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
15740 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  are false, then 
15750 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20  we can run this 
15760 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20  code just once. 
15770 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73   ** save the res
15780 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20  ults, and reuse 
15790 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20  the same result 
157a0 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  on subsequent in
157b0 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  vocations..  */.
157c0 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
157d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
157e0 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20  _VarSelect) ){. 
157f0 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20     jmpIfDynamic 
15800 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15810 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
15820 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15830 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
15840 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
15850 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  IN.  if( pParse-
15860 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
15870 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
15880 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
15890 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43  Parse->db, "EXEC
158a0 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52  UTE %s%s SUBQUER
158b0 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 6a  Y %d",.        j
158c0 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22  mpIfDynamic>=0?"
158d0 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c  ":"CORRELATED ",
158e0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
158f0 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22  op==TK_IN?"LIST"
15900 3a 22 53 43 41 4c 41 52 22 2c 0a 20 20 20 20 20  :"SCALAR",.     
15910 20 20 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74     pParse->iNext
15920 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a  SelectId.    );.
15930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15940 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
15950 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
15960 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
15970 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
15980 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
15990 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
159a0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
159b0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
159c0 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
159d0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
159e0 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
159f0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
15a00 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
15a10 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
15a20 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c  >pLeft; /* the L
15a30 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
15a40 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b  rator */.      K
15a50 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
15a60 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65   = 0;      /* Ke
15a70 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  y information */
15a80 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b  .      int nVal;
15a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15aa0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65     /* Size of ve
15ab0 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20  ctor pLeft */.  
15ac0 20 20 20 20 0a 20 20 20 20 20 20 6e 56 61 6c 20      .      nVal 
15ad0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
15ae0 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
15af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69        assert( !i
15b00 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d  sRowid || nVal==
15b10 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  1 );..      /* W
15b20 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
15b30 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
15b40 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
15b50 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
15b60 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
15b70 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
15b80 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e  he same way.  An
15b90 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
15ba0 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69   is .      ** fi
15bb0 6c 6c 65 64 20 77 69 74 68 20 69 6e 64 65 78 20  lled with index 
15bc0 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e  keys representin
15bd0 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  g the results fr
15be0 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  om the .      **
15bf0 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c   SELECT or the <
15c00 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20  exprlist>..     
15c10 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
15c20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69  the 'x' expressi
15c30 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
15c40 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c  alue, or the SEL
15c50 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  ECT....      ** 
15c60 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
15c70 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
15c80 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
15c90 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20  ity of that.    
15ca0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75    ** column is u
15cb0 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
15cc0 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
15cd0 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
15ce0 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
15cf0 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
15d00 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
15d10 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
15d20 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a   is used.      *
15d30 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75  * if either colu
15d40 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f  mn has NUMERIC o
15d50 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69  r INTEGER affini
15d60 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20  ty. If neither. 
15d70 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20       ** 'x' nor 
15d80 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  the SELECT... st
15d90 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
15da0 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
15db0 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20  c affinity.     
15dc0 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20   ** is used..   
15dd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
15de0 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
15df0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
15e00 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
15e10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15e20 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
15e30 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
15e40 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73 52 6f 77  ->iTable, (isRow
15e50 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20  id?0:nVal));.   
15e60 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73     pKeyInfo = is
15e70 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69  Rowid ? 0 : sqli
15e80 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
15e90 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c  pParse->db, nVal
15ea0 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 1);..      if(
15eb0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
15ec0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
15ed0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
15ee0 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
15ef0 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
15f00 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
15f10 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
15f20 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
15f30 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
15f40 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
15f50 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
15f60 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
15f70 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70  allocated and op
15f80 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20  ened above..    
15f90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53      */.        S
15fa0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d  elect *pSelect =
15fb0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
15fc0 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  t;.        ExprL
15fd0 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53  ist *pEList = pS
15fe0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a  elect->pEList;..
15ff0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16000 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  !isRowid );.    
16010 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48      /* If the LH
16020 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68 65  S and RHS of the
16030 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f 20   IN operator do 
16040 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74 0a  not match, that.
16050 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72          ** error
16060 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
16070 63 61 75 67 68 74 20 6c 6f 6e 67 20 62 65 66 6f  caught long befo
16080 72 65 20 77 65 20 72 65 61 63 68 20 74 68 69 73  re we reach this
16090 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20   point. */.     
160a0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 45     if( ALWAYS(pE
160b0 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56 61  List->nExpr==nVa
160c0 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
160d0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
160e0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
160f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16100 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
16110 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74  t(&dest, SRT_Set
16120 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
16130 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 73 74  ;.          dest
16140 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70 72  .zAffSdst = expr
16150 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  INAffinity(pPars
16160 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
16170 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c       pSelect->iL
16180 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
16190 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
161a0 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
161b0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  & SF_Distinct );
161c0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
161d0 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30  ase( pKeyInfo==0
161e0 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79   ); /* Caused by
161f0 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b   OOM in sqlite3K
16200 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f  eyInfoAlloc() */
16210 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
16220 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
16230 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
16240 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
16250 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16260 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65  e(pParse->db, de
16270 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20  st.zAffSdst);.  
16280 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16290 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
162a0 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  eyInfo);.       
162b0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
162c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
162d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
162e0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64  ee(pParse->db, d
162f0 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20  est.zAffSdst);. 
16300 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16310 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20   pKeyInfo!=0 ); 
16320 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73  /* OOM will caus
16330 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c  e exit after sql
16340 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a  ite3Select() */.
16350 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
16360 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
16370 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16380 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
16390 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
163a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
163b0 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
163c0 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20  pKeyInfo) );.   
163d0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
163e0 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVal; i++){.  
163f0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
16400 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  p = sqlite3Vecto
16410 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c  rFieldSubexpr(pL
16420 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  eft, i);.       
16430 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
16440 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
16450 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
16460 6c 6c 53 65 71 28 0a 20 20 20 20 20 20 20 20 20  llSeq(.         
16470 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
16480 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
16490 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20  Expr.           
164a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
164b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
164c0 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
164d0 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21  (pExpr->x.pList!
164e0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =0) ){.        /
164f0 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
16500 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
16510 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
16520 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20      ** For each 
16530 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
16540 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
16550 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
16560 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
16570 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
16580 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
16590 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
165a0 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
165b0 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
165c0 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
165d0 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
165e0 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
165f0 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
16600 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
16610 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
16620 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
16630 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61    */.        cha
16640 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
16650 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
16660 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66  ty of the LHS of
16670 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20   the IN */.     
16680 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
16690 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
166a0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
166b0 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75  st;.        stru
166c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
166d0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20   *pItem;.       
166e0 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
166f0 0a 0a 20 20 20 20 20 20 20 20 61 66 66 69 6e 69  ..        affini
16700 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
16710 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
16720 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
16730 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
16740 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
16750 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
16760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16770 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
16780 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
16790 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
167a0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
167b0 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20  eyInfo) );.     
167c0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
167d0 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
167e0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
167f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
16800 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  t);.        }.. 
16810 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
16820 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
16830 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
16840 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ist>. */.       
16850 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
16860 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16870 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
16880 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
16890 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
168a0 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 20 73   if( isRowid ) s
168b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
168c0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
168d0 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  r2);.        for
168e0 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  (i=pList->nExpr,
168f0 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
16900 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
16910 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
16920 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d  xpr *pE2 = pItem
16930 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
16940 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73     int iValToIns
16950 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
16960 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
16970 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  n is not constan
16980 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  t then we will n
16990 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
169a0 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20   ** disable the 
169b0 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65  test that was ge
169c0 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68  nerated above th
169d0 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20  at makes sure.  
169e0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
169f0 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
16a00 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
16a10 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
16a20 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  tant.          *
16a30 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20  * expression we 
16a40 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68  need to rerun th
16a50 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d  is code each tim
16a60 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
16a70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d            if( jm
16a80 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26  pIfDynamic>=0 &&
16a90 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
16aa0 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16ac0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
16ad0 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  oop(v, jmpIfDyna
16ae0 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mic);.          
16af0 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d    jmpIfDynamic =
16b00 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
16b10 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
16b20 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
16b30 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
16b40 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
16b50 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
16b60 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
16b70 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  d && sqlite3Expr
16b80 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26  IsInteger(pE2, &
16b90 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20  iValToIns) ){.  
16ba0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16bb0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16bc0 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78  P_InsertInt, pEx
16bd0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
16be0 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20  iValToIns);.    
16bf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16c00 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71           r3 = sq
16c10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
16c20 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c  get(pParse, pE2,
16c30 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
16c40 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b    if( isRowid ){
16c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
16c60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16c70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
16c80 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
16c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16cb0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
16cc0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
16cd0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
16ce0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
16cf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16d00 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
16d10 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
16d20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  r2, r3);.       
16d30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16d40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16d50 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16d60 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
16d70 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
16d80 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
16d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16da0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
16db0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c  ange(pParse, r3,
16dc0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
16dd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16de0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
16df0 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e  xInsert, pExpr->
16e00 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 2c 20  iTable, r2, r3, 
16e10 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
16e20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
16e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16e40 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16e50 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
16e60 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16e70 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16e80 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
16e90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16ea0 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
16eb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16ec0 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
16ed0 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66   (void *)pKeyInf
16ee0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
16ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
16f00 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
16f10 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
16f20 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
16f30 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  CT:.    default:
16f40 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65   {.      /* Case
16f50 20 33 3a 20 20 20 20 28 53 45 4c 45 43 54 20 2e   3:    (SELECT .
16f60 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20  .. FROM ...).   
16f70 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20 20 20     **     or:   
16f80 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 2e   EXISTS(SELECT .
16f90 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20 20 20  .. FROM ...).   
16fa0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
16fb0 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e  or a SELECT, gen
16fc0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
16fd0 74 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72  t the values for
16fe0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   all columns of.
16ff0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72        ** the fir
17000 73 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61  st row into an a
17010 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
17020 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  s and return the
17030 20 69 6e 64 65 78 20 6f 66 0a 20 20 20 20 20 20   index of.      
17040 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67  ** the first reg
17050 69 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  ister..      **.
17060 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
17070 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77   is an EXISTS, w
17080 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20  rite an integer 
17090 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f  0 (not exists) o
170a0 72 20 31 20 28 65 78 69 73 74 73 29 0a 20 20 20  r 1 (exists).   
170b0 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67     ** into a reg
170c0 69 73 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e  ister and return
170d0 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e   that register n
170e0 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  umber..      **.
170f0 20 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f 74 68        ** In both
17100 20 63 61 73 65 73 2c 20 74 68 65 20 71 75 65 72   cases, the quer
17110 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64 20 77  y is augmented w
17120 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e 20 20  ith "LIMIT 1".  
17130 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20 70 72  Any .      ** pr
17140 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20  eexisting limit 
17150 69 73 20 64 69 73 63 61 72 64 65 64 20 69 6e 20  is discarded in 
17160 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77  place of the new
17170 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20 20 20   LIMIT 1..      
17180 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
17190 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20  *pSel;          
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
171b0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
171c0 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a  nt to encode */.
171d0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
171e0 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20   dest;          
171f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
17200 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ow to deal with 
17210 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a 2f  SELECT result */
17220 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65 67 3b  .      int nReg;
17230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17250 52 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  Registers to all
17260 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 20 20  ocate */..      
17270 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
17280 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
17290 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
172a0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
172b0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
172c0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
172d0 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20  p==TK_EXISTS || 
172e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
172f0 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73  LECT );.      as
17300 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
17310 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
17320 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 0a 20  xIsSelect) );.. 
17330 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70       pSel = pExp
17340 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
17350 20 20 20 20 6e 52 65 67 20 3d 20 70 45 78 70 72      nReg = pExpr
17360 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
17370 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e  ? pSel->pEList->
17380 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20 20 20 20  nExpr : 1;.     
17390 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
173a0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c  stInit(&dest, 0,
173b0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29   pParse->nMem+1)
173c0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
173d0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
173e0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
173f0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
17400 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
17410 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
17420 20 20 20 20 20 20 64 65 73 74 2e 69 53 64 73 74        dest.iSdst
17430 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
17440 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 6e 53  .        dest.nS
17450 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  dst = nReg;.    
17460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17470 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
17480 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
17490 6d 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2b  m, dest.iSDParm+
174a0 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20 20 20 20  nReg-1);.       
174b0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
174c0 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
174d0 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
174e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
174f0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
17500 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
17510 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17520 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
17530 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
17540 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
17550 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
17560 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
17570 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
17580 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
17590 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
175a0 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  pSel->pLimit);. 
175b0 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
175c0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
175d0 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
175e0 20 54 4b 5f 49 4e 54 45 47 45 52 2c 0a 20 20 20   TK_INTEGER,.   
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
17610 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
17620 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  [1], 0);.      p
17630 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  Sel->iLimit = 0;
17640 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c  .      pSel->sel
17650 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c  Flags &= ~SF_Mul
17660 74 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 69  tiValue;.      i
17670 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
17680 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26  (pParse, pSel, &
17690 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
176a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
176b0 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20   }.      rReg = 
176c0 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
176d0 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
176e0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
176f0 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
17700 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
17710 20 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75   }..  if( rHasNu
17720 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71  llFlag ){.    sq
17730 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
17740 6c 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54  lag(v, pExpr->iT
17750 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c  able, rHasNullFl
17760 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ag);.  }..  if( 
17770 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20  jmpIfDynamic>=0 
17780 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
17790 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
177a0 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d  pIfDynamic);.  }
177b0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
177c0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
177d0 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a  .  return rReg;.
177e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
177f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
17800 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
17810 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
17820 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e  Y./*.** Expr pIn
17830 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65   is an IN(...) e
17840 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20  xpression. This 
17850 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
17860 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62  that the .** sub
17870 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52  -select on the R
17880 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f  HS of the IN() o
17890 70 65 72 61 74 6f 72 20 68 61 73 20 74 68 65 20  perator has the 
178a0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a  same number of .
178b0 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68  ** columns as th
178c0 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20  e vector on the 
178d0 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  LHS. Or, if the 
178e0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20  RHS of the IN() 
178f0 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62  is not .** a sub
17900 2d 71 75 65 72 79 2c 20 74 68 61 74 20 74 68 65  -query, that the
17910 20 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f 72   LHS is a vector
17920 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69   of size 1..*/.i
17930 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  nt sqlite3ExprCh
17940 65 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61  eckIN(Parse *pPa
17950 72 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b  rse, Expr *pIn){
17960 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d  .  int nVector =
17970 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
17980 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66  orSize(pIn->pLef
17990 74 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e  t);.  if( (pIn->
179a0 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
179b0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28  lect) ){.    if(
179c0 20 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78   nVector!=pIn->x
179d0 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
179e0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
179f0 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
17a00 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
17a10 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  In->x.pSelect->p
17a20 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56  EList->nExpr, nV
17a30 65 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65  ector);.      re
17a40 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
17a50 7d 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f  }else if( nVecto
17a60 72 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  r!=1 ){.    sqli
17a70 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73  te3VectorErrorMs
17a80 67 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 70  g(pParse, pIn->p
17a90 4c 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72  Left);.    retur
17aa0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
17ab0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 0;.}.#endif..#
17ac0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17ad0 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
17ae0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17af0 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73  for an IN expres
17b00 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sion..**.**     
17b10 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e   x IN (SELECT ..
17b20 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  .).**      x IN 
17b30 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
17b40 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ..).**.** The le
17b50 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48  ft-hand side (LH
17b60 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 6f  S) is a scalar o
17b70 72 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73  r vector express
17b80 69 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69  ion.  The .** ri
17b90 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52  ght-hand side (R
17ba0 48 53 29 20 69 73 20 61 6e 20 61 72 72 61 79 20  HS) is an array 
17bb0 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
17bc0 73 63 61 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f  scalar values, o
17bd0 72 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e  r a.** subquery.
17be0 20 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20    If the RHS is 
17bf0 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 20  a subquery, the 
17c00 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
17c10 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a   columns must.**
17c20 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
17c30 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
17c40 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68  the vector on th
17c50 65 20 4c 48 53 2e 20 20 49 66 20 74 68 65 20 52  e LHS.  If the R
17c60 48 53 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20  HS is.** a list 
17c70 6f 66 20 76 61 6c 75 65 73 2c 20 74 68 65 20 4c  of values, the L
17c80 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 63 61  HS must be a sca
17c90 6c 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lar. .**.** The 
17ca0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74  IN operator is t
17cb0 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 76  rue if the LHS v
17cc0 61 6c 75 65 20 69 73 20 63 6f 6e 74 61 69 6e 65  alue is containe
17cd0 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
17ce0 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20  ..** The result 
17cf0 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
17d00 4c 48 53 20 69 73 20 64 65 66 69 6e 69 74 65 6c  LHS is definitel
17d10 79 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 48 53  y not in the RHS
17d20 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c  .  The .** resul
17d30 74 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  t is NULL if the
17d40 20 70 72 65 73 65 6e 63 65 20 6f 66 20 74 68 65   presence of the
17d50 20 4c 48 53 20 69 6e 20 74 68 65 20 52 48 53 20   LHS in the RHS 
17d60 63 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65  cannot be .** de
17d70 74 65 72 6d 69 6e 65 64 20 64 75 65 20 74 6f 20  termined due to 
17d80 4e 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  NULLs..**.** Thi
17d90 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
17da0 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75  tes code that ju
17db0 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c  mps to destIfFal
17dc0 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  se if the LHS is
17dd0 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e   not .** contain
17de0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
17df0 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55  S.  If due to NU
17e00 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  LLs we cannot de
17e10 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c  termine if the L
17e20 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e  HS.** is contain
17e30 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68  ed in the RHS th
17e40 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49  en jump to destI
17e50 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c  fNull.  If the L
17e60 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a  HS is contained.
17e70 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ** within the RH
17e80 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  S then fall thro
17e90 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74  ugh..**.** See t
17ea0 68 65 20 73 65 70 61 72 61 74 65 20 69 6e 2d 6f  he separate in-o
17eb0 70 65 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d  perator.md docum
17ec0 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e  entation file in
17ed0 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a   the canonical.*
17ee0 2a 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20  * SQLite source 
17ef0 74 72 65 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tree for additio
17f00 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
17f10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17f20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
17f30 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  N(.  Parse *pPar
17f40 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
17f50 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
17f60 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
17f70 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
17f80 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pr,          /* 
17f90 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f  The IN expressio
17fa0 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  n */.  int destI
17fb0 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20  fFalse,      /* 
17fc0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53  Jump here if LHS
17fd0 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
17fe0 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a  d in the RHS */.
17ff0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
18000 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
18010 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75  here if the resu
18020 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20  lts are unknown 
18030 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a  due to NULLs */.
18040 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73  ){.  int rRhsHas
18050 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65  Null = 0;  /* Re
18060 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74  gister that is t
18070 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61  rue if RHS conta
18080 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  ins NULL values 
18090 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20  */.  int eType; 
180a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
180b0 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f  pe of the RHS */
180c0 0a 20 20 69 6e 74 20 72 4c 68 73 3b 20 20 20 20  .  int rLhs;    
180d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
180e0 73 74 65 72 28 73 29 20 68 6f 6c 64 69 6e 67 20  ster(s) holding 
180f0 74 68 65 20 4c 48 53 20 76 61 6c 75 65 73 20 2a  the LHS values *
18100 2f 0a 20 20 69 6e 74 20 72 4c 68 73 4f 72 69 67  /.  int rLhsOrig
18110 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48 53  ;         /* LHS
18120 20 76 61 6c 75 65 73 20 70 72 69 6f 72 20 74 6f   values prior to
18130 20 72 65 6f 72 64 65 72 69 6e 67 20 62 79 20 61   reordering by a
18140 69 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65  iMap[] */.  Vdbe
18150 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
18160 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75    /* Statement u
18170 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
18180 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61  n */.  int *aiMa
18190 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  p = 0;       /* 
181a0 4d 61 70 20 66 72 6f 6d 20 76 65 63 74 6f 72 20  Map from vector 
181b0 66 69 65 6c 64 20 74 6f 20 69 6e 64 65 78 20 63  field to index c
181c0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
181d0 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20  *zAff = 0;      
181e0 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72   /* Affinity str
181f0 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  ing for comparis
18200 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65  ons */.  int nVe
18210 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f  ctor;          /
18220 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72  * Size of vector
18230 73 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70  s for this IN op
18240 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
18250 69 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20 20  iDummy;         
18260 20 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d    /* Dummy param
18270 65 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64 65  eter to exprCode
18280 56 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78  Vector() */.  Ex
18290 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
182a0 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f      /* The LHS o
182b0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
182c0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  r */.  int i;   
182d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
182e0 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
182f0 20 20 69 6e 74 20 64 65 73 74 53 74 65 70 32 3b    int destStep2;
18300 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
18310 20 74 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55   to jump when NU
18320 4c 4c 73 20 73 65 65 6e 20 69 6e 20 73 74 65 70  LLs seen in step
18330 20 32 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74   2 */.  int dest
18340 53 74 65 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a  Step6 = 0;    /*
18350 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 66   Start of code f
18360 6f 72 20 53 74 65 70 20 36 20 2a 2f 0a 20 20 69  or Step 6 */.  i
18370 6e 74 20 61 64 64 72 54 72 75 74 68 4f 70 3b 20  nt addrTruthOp; 
18380 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18390 6f 66 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64  of opcode that d
183a0 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 49 4e  etermines the IN
183b0 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   is true */.  in
183c0 74 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20  t destNotNull;  
183d0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
183e0 20 69 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   if a comparison
183f0 20 69 73 20 6e 6f 74 20 74 72 75 65 20 69 6e 20   is not true in 
18400 73 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20  step 6 */.  int 
18410 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
18420 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
18430 73 74 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a  step-6 loop */ .
18440 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72  .  pLeft = pExpr
18450 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 66 28 20 73  ->pLeft;.  if( s
18460 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49  qlite3ExprCheckI
18470 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  N(pParse, pExpr)
18480 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66   ) return;.  zAf
18490 66 20 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69  f = exprINAffini
184a0 74 79 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ty(pParse, pExpr
184b0 29 3b 0a 20 20 6e 56 65 63 74 6f 72 20 3d 20 73  );.  nVector = s
184c0 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
184d0 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  Size(pExpr->pLef
184e0 74 29 3b 0a 20 20 61 69 4d 61 70 20 3d 20 28 69  t);.  aiMap = (i
184f0 6e 74 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  nt*)sqlite3DbMal
18500 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 20 20 70  locZero(.      p
18510 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 65 63 74  Parse->db, nVect
18520 6f 72 2a 28 73 69 7a 65 6f 66 28 69 6e 74 29 20  or*(sizeof(int) 
18530 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 29 29 20  + sizeof(char)) 
18540 2b 20 31 0a 20 20 29 3b 0a 20 20 69 66 28 20 70  + 1.  );.  if( p
18550 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
18560 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
18570 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
18580 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f  _oom_error;..  /
18590 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d  * Attempt to com
185a0 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 41 66  pute the RHS. Af
185b0 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 69  ter this step, i
185c0 66 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  f anything other
185d0 20 74 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e   than.  ** IN_IN
185e0 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75  DEX_NOOP is retu
185f0 72 6e 65 64 2c 20 74 68 65 20 74 61 62 6c 65 20  rned, the table 
18600 6f 70 65 6e 65 64 20 69 74 68 20 63 75 72 73 6f  opened ith curso
18610 72 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  r pExpr->iTable 
18620 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  .  ** contains t
18630 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
18640 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 20  ake up the RHS. 
18650 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  If IN_INDEX_NOOP
18660 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20   is returned,.  
18670 2a 2a 20 74 68 65 20 52 48 53 20 68 61 73 20 6e  ** the RHS has n
18680 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65  ot yet been code
18690 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61  d.  */.  v = pPa
186a0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
186b0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
186c0 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63      /* OOM detec
186d0 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69  ted prior to thi
186e0 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56  s routine */.  V
186f0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
18700 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70  v, "begin IN exp
18710 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20  r"));.  eType = 
18720 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
18730 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ex(pParse, pExpr
18740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
18760 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
18770 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  IP | IN_INDEX_NO
18780 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20  OP_OK,.         
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187a0 20 20 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d      destIfFalse=
187b0 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20  =destIfNull ? 0 
187c0 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  : &rRhsHasNull, 
187d0 61 69 4d 61 70 29 3b 0a 0a 20 20 61 73 73 65 72  aiMap);..  asser
187e0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  t( pParse->nErr 
187f0 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c  || nVector==1 ||
18800 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
18810 5f 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20 65  _EPH.       || e
18820 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
18830 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79 70  NDEX_ASC || eTyp
18840 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e==IN_INDEX_INDE
18850 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69 66  X_DESC .  );.#if
18860 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
18870 0a 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68  .  /* Confirm th
18880 61 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61  at aiMap[] conta
18890 69 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74 65  ins nVector inte
188a0 67 65 72 20 76 61 6c 75 65 73 20 62 65 74 77 65  ger values betwe
188b0 65 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56  en 0 and.  ** nV
188c0 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f  ector-1. */.  fo
188d0 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
188e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
188f0 6a 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28  j, cnt;.    for(
18900 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74  cnt=j=0; j<nVect
18910 6f 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d  or; j++) if( aiM
18920 61 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b  ap[j]==i ) cnt++
18930 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6e  ;.    assert( cn
18940 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  t==1 );.  }.#end
18950 69 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68  if..  /* Code th
18960 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72  e LHS, the <expr
18970 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
18980 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65  N (...)". If the
18990 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a 20   LHS is a .  ** 
189a0 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74 20  vector, then it 
189b0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20  is stored in an 
189c0 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f 72  array of nVector
189d0 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
189e0 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e  ing .  ** at r1.
189f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74  .  **.  ** sqlit
18a00 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20  e3FindInIndex() 
18a10 6d 69 67 68 74 20 68 61 76 65 20 72 65 6f 72 64  might have reord
18a20 65 72 65 64 20 74 68 65 20 66 69 65 6c 64 73 20  ered the fields 
18a30 6f 66 20 74 68 65 20 4c 48 53 20 76 65 63 74 6f  of the LHS vecto
18a40 72 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74  r.  ** so that t
18a50 68 65 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  he fields are in
18a60 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20   the same order 
18a70 61 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69  as an existing i
18a80 6e 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a  ndex.   The.  **
18a90 20 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20 63   aiMap[] array c
18aa0 6f 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69 6e  ontains a mappin
18ab0 67 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69  g from the origi
18ac0 6e 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f 72  nal LHS field or
18ad0 64 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  der to.  ** the 
18ae0 66 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61 74  field order that
18af0 20 6d 61 74 63 68 65 73 20 74 68 65 20 52 48 53   matches the RHS
18b00 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 73   index..  */.  s
18b10 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
18b20 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72  ush(pParse);.  r
18b30 4c 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43 6f  LhsOrig = exprCo
18b40 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  deVector(pParse,
18b50 20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79 29   pLeft, &iDummy)
18b60 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
18b70 56 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70 5b  Vector && aiMap[
18b80 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a  i]==i; i++){} /*
18b90 20 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73 20   Are LHS fields 
18ba0 72 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20  reordered? */.  
18bb0 69 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29  if( i==nVector )
18bc0 7b 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69 65  {.    /* LHS fie
18bd0 6c 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f 72  lds are not reor
18be0 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68  dered */.    rLh
18bf0 73 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20  s = rLhsOrig;.  
18c00 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65  }else{.    /* Ne
18c10 65 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74 68  ed to reorder th
18c20 65 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63 63  e LHS fields acc
18c30 6f 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70 20  ording to aiMap 
18c40 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73 71  */.    rLhs = sq
18c50 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
18c60 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f  e(pParse, nVecto
18c70 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  r);.    for(i=0;
18c80 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
18c90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
18ca0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
18cb0 43 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69  Copy, rLhsOrig+i
18cc0 2c 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c  , rLhs+aiMap[i],
18cd0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
18ce0 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46    /* If sqlite3F
18cf0 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64  indInIndex() did
18d00 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65   not find or cre
18d10 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61  ate an index tha
18d20 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62  t is.  ** suitab
18d30 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  le for evaluatin
18d40 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  g the IN operato
18d50 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65  r, then evaluate
18d60 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65   using a.  ** se
18d70 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72  quence of compar
18d80 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  isons..  **.  **
18d90 20 54 68 69 73 20 69 73 20 73 74 65 70 20 28 31   This is step (1
18da0 29 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72  ) in the in-oper
18db0 61 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65  ator.md optimize
18dc0 64 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a  d algorithm..  *
18dd0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49  /.  if( eType==I
18de0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a  N_INDEX_NOOP ){.
18df0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
18e00 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
18e10 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  List;.    CollSe
18e20 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
18e30 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
18e40 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
18e50 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62  ft);.    int lab
18e60 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  elOk = sqlite3Vd
18e70 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
18e80 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65 67 54      int r2, regT
18e90 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74 20 72  oFree;.    int r
18ea0 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  egCkNull = 0;.  
18eb0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 61 73    int ii;.    as
18ec0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
18ed0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
18ee0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
18ef0 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c     if( destIfNul
18f00 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l!=destIfFalse )
18f10 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75 6c  {.      regCkNul
18f20 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  l = sqlite3GetTe
18f30 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
18f40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18f50 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74  AddOp3(v, OP_Bit
18f60 41 6e 64 2c 20 72 4c 68 73 2c 20 72 4c 68 73 2c  And, rLhs, rLhs,
18f70 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20   regCkNull);.   
18f80 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
18f90 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
18fa0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ; ii++){.      r
18fb0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
18fc0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
18fd0 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78  pList->a[ii].pEx
18fe0 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65 29 3b  pr, &regToFree);
18ff0 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 43 6b  .      if( regCk
19000 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 45  Null && sqlite3E
19010 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69  xprCanBeNull(pLi
19020 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  st->a[ii].pExpr)
19030 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19040 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19050 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65 67 43   OP_BitAnd, regC
19060 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b  kNull, r2, regCk
19070 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
19080 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c 69 73       if( ii<pLis
19090 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65  t->nExpr-1 || de
190a0 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66  stIfNull!=destIf
190b0 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20  False ){.       
190c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
190d0 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 4c 68  p4(v, OP_Eq, rLh
190e0 73 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a  s, labelOk, r2,.
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19100 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
19110 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
19120 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  EQ);.        Vdb
19130 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
19140 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
19150 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
19160 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3d  overageIf(v, ii=
19170 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  =pList->nExpr-1)
19180 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19190 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
191a0 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20   zAff[0]);.     
191b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
191c0 61 73 73 65 72 74 28 20 64 65 73 74 49 66 4e 75  assert( destIfNu
191d0 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll==destIfFalse 
191e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
191f0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19200 4f 50 5f 4e 65 2c 20 72 4c 68 73 2c 20 64 65 73  OP_Ne, rLhs, des
19210 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20  tIfFalse, r2,.  
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19230 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
19240 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
19250 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
19260 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
19270 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
19280 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c  v, zAff[0] | SQL
19290 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
192a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
192b0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
192c0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
192d0 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  ToFree);.    }. 
192e0 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c     if( regCkNull
192f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19300 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19310 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e  P_IsNull, regCkN
19320 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  ull, destIfNull)
19330 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
19340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19350 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
19360 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a  IfFalse);.    }.
19370 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
19380 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
19390 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c  abelOk);.    sql
193a0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
193b0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b  eg(pParse, regCk
193c0 4e 75 6c 6c 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Null);.    goto 
193d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
193e0 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a  N_finished;.  }.
193f0 0a 20 20 2f 2a 20 53 74 65 70 20 32 3a 20 43 68  .  /* Step 2: Ch
19400 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
19410 65 20 4c 48 53 20 63 6f 6e 74 61 69 6e 73 20 61  e LHS contains a
19420 6e 79 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 2e  ny NULL columns.
19430 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 4c 48    If the.  ** LH
19440 53 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 4e  S does contain N
19450 55 4c 4c 73 20 74 68 65 6e 20 74 68 65 20 72 65  ULLs then the re
19460 73 75 6c 74 20 6d 75 73 74 20 62 65 20 65 69 74  sult must be eit
19470 68 65 72 20 46 41 4c 53 45 20 6f 72 20 4e 55 4c  her FALSE or NUL
19480 4c 2e 0a 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20  L..  ** We will 
19490 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 62 69  then skip the bi
194a0 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66 20 74  nary search of t
194b0 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69  he RHS..  */.  i
194c0 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  f( destIfNull==d
194d0 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
194e0 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65    destStep2 = de
194f0 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 65 6c  stIfFalse;.  }el
19500 73 65 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70  se{.    destStep
19510 32 20 3d 20 64 65 73 74 53 74 65 70 36 20 3d 20  2 = destStep6 = 
19520 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
19530 61 62 65 6c 28 76 29 3b 0a 20 20 7d 0a 20 20 66  abel(v);.  }.  f
19540 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
19550 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
19560 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65  r *p = sqlite3Ve
19570 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
19580 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69  (pExpr->pLeft, i
19590 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
195a0 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
195b0 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  p) ){.      sqli
195c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
195d0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73   OP_IsNull, rLhs
195e0 2b 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a  +i, destStep2);.
195f0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
19600 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ge(v);.    }.  }
19610 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20  ..  /* Step 3.  
19620 54 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b  The LHS is now k
19630 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e  nown to be non-N
19640 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e  ULL.  Do the bin
19650 61 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20  ary search.  ** 
19660 6f 66 20 74 68 65 20 52 48 53 20 75 73 69 6e 67  of the RHS using
19670 20 74 68 65 20 4c 48 53 20 61 73 20 61 20 70 72   the LHS as a pr
19680 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20  obe.  If found, 
19690 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20  the result is.  
196a0 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  ** true..  */.  
196b0 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
196c0 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
196d0 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
196e0 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65  , the RHS is the
196f0 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20   ROWID of table 
19700 62 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65  b-tree and so we
19710 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f   also.    ** kno
19720 77 20 74 68 61 74 20 74 68 65 20 52 48 53 20 69  w that the RHS i
19730 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e  s non-NULL.  Hen
19740 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73  ce, we combine s
19750 74 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20  teps 3 and 4.   
19760 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c   ** into a singl
19770 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  e opcode. */.   
19780 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19790 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
197a0 69 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  id, pExpr->iTabl
197b0 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  e, destIfFalse, 
197c0 72 4c 68 73 29 3b 0a 20 20 20 20 56 64 62 65 43  rLhs);.    VdbeC
197d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
197e0 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20 73 71  addrTruthOp = sq
197f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
19800 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20 20 2f 2a  v, OP_Goto);  /*
19810 20 52 65 74 75 72 6e 20 54 72 75 65 20 2a 2f 0a   Return True */.
19820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
19830 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
19840 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72  , OP_Affinity, r
19850 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c  Lhs, nVector, 0,
19860 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b   zAff, nVector);
19870 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66 46  .    if( destIfF
19880 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
19890 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d   ){.      /* Com
198a0 62 69 6e 65 20 53 74 65 70 20 33 20 61 6e 64 20  bine Step 3 and 
198b0 53 74 65 70 20 35 20 69 6e 74 6f 20 61 20 73 69  Step 5 into a si
198c0 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  ngle opcode */. 
198d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
198e0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
198f0 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  NotFound, pExpr-
19900 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
19910 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  alse,.          
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19930 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b   rLhs, nVector);
19940 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19950 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 71 6c  ;.      goto sql
19960 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66  ite3ExprCodeIN_f
19970 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20  inished;.    }. 
19980 20 20 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53     /* Ordinary S
19990 74 65 70 20 33 2c 20 66 6f 72 20 74 68 65 20 63  tep 3, for the c
199a0 61 73 65 20 77 68 65 72 65 20 46 41 4c 53 45 20  ase where FALSE 
199b0 61 6e 64 20 4e 55 4c 4c 20 61 72 65 20 64 69 73  and NULL are dis
199c0 74 69 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64 64  tinct */.    add
199d0 72 54 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74  rTruthOp = sqlit
199e0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
199f0 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
19a00 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 0a 20  pr->iTable, 0,. 
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a30 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63 74       rLhs, nVect
19a40 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  or); VdbeCoverag
19a50 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(v);.  }..  /* 
19a60 53 74 65 70 20 34 2e 20 20 49 66 20 74 68 65 20  Step 4.  If the 
19a70 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20  RHS is known to 
19a80 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20  be non-NULL and 
19a90 77 65 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 0a  we did not find.
19aa0 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f 6e    ** an match on
19ab0 20 74 68 65 20 73 65 61 72 63 68 20 61 62 6f 76   the search abov
19ac0 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  e, then the resu
19ad0 6c 74 20 6d 75 73 74 20 62 65 20 46 41 4c 53 45  lt must be FALSE
19ae0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 52 68  ..  */.  if( rRh
19af0 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65 63  sHasNull && nVec
19b00 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71  tor==1 ){.    sq
19b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19b20 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72  v, OP_NotNull, r
19b30 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74  RhsHasNull, dest
19b40 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 56 64  IfFalse);.    Vd
19b50 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19b60 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35 2e   }..  /* Step 5.
19b70 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 63    If we do not c
19b80 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 64 69  are about the di
19b90 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
19ba0 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20 46   NULL and.  ** F
19bb0 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73 74 20  ALSE, then just 
19bc0 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a 20  return false. . 
19bd0 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66   */.  if( destIf
19be0 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
19bf0 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 47  l ) sqlite3VdbeG
19c00 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
19c10 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20  se);..  /* Step 
19c20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  6: Loop through 
19c30 72 6f 77 73 20 6f 66 20 74 68 65 20 52 48 53 2e  rows of the RHS.
19c40 20 20 43 6f 6d 70 61 72 65 20 65 61 63 68 20 72    Compare each r
19c50 6f 77 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a 20  ow to the LHS.. 
19c60 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70 61   ** If any compa
19c70 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74  rison is NULL, t
19c80 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
19c90 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c 0a  s NULL.  If all.
19ca0 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73    ** comparisons
19cb0 20 61 72 65 20 46 41 4c 53 45 20 74 68 65 6e 20   are FALSE then 
19cc0 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c 74  the final result
19cd0 20 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a 0a   is FALSE..  **.
19ce0 20 20 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c 61    ** For a scala
19cf0 72 20 4c 48 53 2c 20 69 74 20 69 73 20 73 75 66  r LHS, it is suf
19d00 66 69 63 69 65 6e 74 20 74 6f 20 63 68 65 63 6b  ficient to check
19d10 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20   just the first 
19d20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  row.  ** of the 
19d30 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  RHS..  */.  if( 
19d40 64 65 73 74 53 74 65 70 36 20 29 20 73 71 6c 69  destStep6 ) sqli
19d50 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
19d60 62 65 6c 28 76 2c 20 64 65 73 74 53 74 65 70 36  bel(v, destStep6
19d70 29 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  );.  addrTop = s
19d80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19d90 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
19da0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
19db0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 56 64  stIfFalse);.  Vd
19dc0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19dd0 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29   if( nVector>1 )
19de0 7b 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c  {.    destNotNul
19df0 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
19e00 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 7d  akeLabel(v);.  }
19e10 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72  else{.    /* For
19e20 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d   nVector==1, com
19e30 62 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e 64  bine steps 6 and
19e40 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65 6c   7 by immediatel
19e50 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  y returning.    
19e60 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20  ** FALSE if the 
19e70 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e  first comparison
19e80 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   is not NULL */.
19e90 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20      destNotNull 
19ea0 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  = destIfFalse;. 
19eb0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
19ec0 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
19ed0 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
19ee0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
19ef0 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71 6c      int r3 = sql
19f00 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
19f10 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d 20  Parse);.    p = 
19f20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
19f30 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
19f40 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d   i);.    pColl =
19f50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
19f60 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
19f70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19f80 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
19f90 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  mn, pExpr->iTabl
19fa0 65 2c 20 69 2c 20 72 33 29 3b 0a 20 20 20 20 73  e, i, r3);.    s
19fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19fc0 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73 2b  (v, OP_Ne, rLhs+
19fd0 69 2c 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 2c 20  i, destNotNull, 
19fe0 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r3,.            
19ff0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
1a000 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
1a010 45 51 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  EQ);.    VdbeCov
1a020 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1a030 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a040 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b  Reg(pParse, r3);
1a050 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1a060 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1a070 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75  oto, 0, destIfNu
1a080 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74  ll);.  if( nVect
1a090 6f 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  or>1 ){.    sqli
1a0a0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1a0b0 62 65 6c 28 76 2c 20 64 65 73 74 4e 6f 74 4e 75  bel(v, destNotNu
1a0c0 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1a0d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a0e0 5f 4e 65 78 74 2c 20 70 45 78 70 72 2d 3e 69 54  _Next, pExpr->iT
1a0f0 61 62 6c 65 2c 20 61 64 64 72 54 6f 70 2b 31 29  able, addrTop+1)
1a100 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
1a110 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  ge(v);..    /* S
1a120 74 65 70 20 37 3a 20 20 49 66 20 77 65 20 72 65  tep 7:  If we re
1a130 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
1a140 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1a150 20 72 65 73 75 6c 74 20 6d 75 73 74 0a 20 20 20   result must.   
1a160 20 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f   ** be false. */
1a170 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a180 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1a190 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73  o, 0, destIfFals
1a1a0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  e);.  }..  /* Ju
1a1b0 6d 70 73 20 68 65 72 65 20 69 6e 20 6f 72 64 65  mps here in orde
1a1c0 72 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65  r to return true
1a1d0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  . */.  sqlite3Vd
1a1e0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1a1f0 64 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c  drTruthOp);..sql
1a200 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66  ite3ExprCodeIN_f
1a210 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72  inished:.  if( r
1a220 4c 68 73 21 3d 72 4c 68 73 4f 72 69 67 20 29 20  Lhs!=rLhsOrig ) 
1a230 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a240 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 4c  mpReg(pParse, rL
1a250 68 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  hs);.  sqlite3Ex
1a260 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1a270 65 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  e);.  VdbeCommen
1a280 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78  t((v, "end IN ex
1a290 70 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78  pr"));.sqlite3Ex
1a2a0 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72  prCodeIN_oom_err
1a2b0 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
1a2c0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1a2d0 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  aiMap);.  sqlite
1a2e0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
1a2f0 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e  db, zAff);.}.#en
1a300 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1a310 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
1a320 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a330 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1a340 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  NT./*.** Generat
1a350 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
1a360 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
1a370 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  he floating poin
1a380 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72  t.** value descr
1a390 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31  ibed by z[0..n-1
1a3a0 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
1a3b0 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iMem..**.** The 
1a3c0 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20  z[] string will 
1a3d0 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20  probably not be 
1a3e0 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
1a3f0 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b    But the .** z[
1a400 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20  n] character is 
1a410 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1a420 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
1a430 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a  does not look.**
1a440 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e   like the contin
1a450 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75  uation of the nu
1a460 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
1a470 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64  void codeReal(Vd
1a480 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
1a490 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65  r *z, int negate
1a4a0 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
1a4b0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21  .  if( ALWAYS(z!
1a4c0 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  =0) ){.    doubl
1a4d0 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c  e value;.    sql
1a4e0 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c  ite3AtoF(z, &val
1a4f0 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ue, sqlite3Strle
1a500 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
1a510 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TF8);.    assert
1a520 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  ( !sqlite3IsNaN(
1a530 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65  value) ); /* The
1a540 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20   new AtoF never 
1a550 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20  returns NaN */. 
1a560 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61     if( negateFla
1a570 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
1a580 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ue;.    sqlite3V
1a590 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
1a5a0 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65   OP_Real, 0, iMe
1a5b0 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75  m, 0, (u8*)&valu
1a5c0 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d  e, P4_REAL);.  }
1a5d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1a5e0 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
1a5f0 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
1a600 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65  ill put the inte
1a610 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a  ger describe by.
1a620 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31  ** text z[0..n-1
1a630 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
1a640 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72  iMem..**.** Expr
1a650 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77  .u.zToken is alw
1a660 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72  ays UTF8 and zer
1a670 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f  o-terminated..*/
1a680 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
1a690 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a  eInteger(Parse *
1a6a0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1a6b0 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67  xpr, int negFlag
1a6c0 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56  , int iMem){.  V
1a6d0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1a6e0 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45  >pVdbe;.  if( pE
1a6f0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
1a700 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
1a710 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75  int i = pExpr->u
1a720 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73  .iValue;.    ass
1a730 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20  ert( i>=0 );.   
1a740 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69   if( negFlag ) i
1a750 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74   = -i;.    sqlit
1a760 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a770 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69  OP_Integer, i, i
1a780 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Mem);.  }else{. 
1a790 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36     int c;.    i6
1a7a0 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e  4 value;.    con
1a7b0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78  st char *z = pEx
1a7c0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1a7d0 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
1a7e0 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  ;.    c = sqlite
1a7f0 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
1a800 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69  , &value);.    i
1a810 66 28 20 63 3d 3d 31 20 7c 7c 20 28 63 3d 3d 32  f( c==1 || (c==2
1a820 20 26 26 20 21 6e 65 67 46 6c 61 67 29 20 7c 7c   && !negFlag) ||
1a830 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76 61 6c   (negFlag && val
1a840 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  ue==SMALLEST_INT
1a850 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  64)){.#ifdef SQL
1a860 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1a870 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71  G_POINT.      sq
1a880 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1a890 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64  arse, "oversized
1a8a0 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c   integer: %s%s",
1a8b0 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a   negFlag ? "-" :
1a8c0 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23   "", z);.#else.#
1a8d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a8e0 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20  IT_HEX_INTEGER. 
1a8f0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1a900 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22  _strnicmp(z,"0x"
1a910 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,2)==0 ){.      
1a920 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1a930 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c  g(pParse, "hex l
1a940 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20  iteral too big: 
1a950 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22  %s%s", negFlag?"
1a960 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20  -":"",z);.      
1a970 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
1a980 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64     {.        cod
1a990 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46  eReal(v, z, negF
1a9a0 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  lag, iMem);.    
1a9b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1a9c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
1a9d0 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65  negFlag ){ value
1a9e0 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45   = c==2 ? SMALLE
1a9f0 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75  ST_INT64 : -valu
1aa00 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74  e; }.      sqlit
1aa10 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1aa20 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
1aa30 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26   iMem, 0, (u8*)&
1aa40 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29  value, P4_INT64)
1aa50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1aa60 2a 0a 2a 2a 20 45 72 61 73 65 20 63 6f 6c 75 6d  *.** Erase colum
1aa70 6e 2d 63 61 63 68 65 20 65 6e 74 72 79 20 6e 75  n-cache entry nu
1aa80 6d 62 65 72 20 69 0a 2a 2f 0a 73 74 61 74 69 63  mber i.*/.static
1aa90 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72 79   void cacheEntry
1aaa0 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61  Clear(Parse *pPa
1aab0 72 73 65 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69  rse, int i){.  i
1aac0 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  f( pParse->aColC
1aad0 61 63 68 65 5b 69 5d 2e 74 65 6d 70 52 65 67 20  ache[i].tempReg 
1aae0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
1aaf0 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
1ab00 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
1ab10 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20  empReg) ){.     
1ab20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
1ab30 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
1ab40 65 67 2b 2b 5d 20 3d 20 70 50 61 72 73 65 2d 3e  eg++] = pParse->
1ab50 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65  aColCache[i].iRe
1ab60 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  g;.    }.  }.  p
1ab70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1ab80 2d 2d 3b 0a 20 20 69 66 28 20 69 3c 70 50 61 72  --;.  if( i<pPar
1ab90 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 7b  se->nColCache ){
1aba0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f  .    pParse->aCo
1abb0 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70 50 61 72  lCache[i] = pPar
1abc0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 70 50  se->aColCache[pP
1abd0 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d  arse->nColCache]
1abe0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
1abf0 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f  Record in the co
1ac00 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20  lumn cache that 
1ac10 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c  a particular col
1ac20 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61  umn from a.** pa
1ac30 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69  rticular table i
1ac40 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61  s stored in a pa
1ac50 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
1ac60 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
1ac70 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1ac80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ac90 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43  int iTab, int iC
1aca0 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  ol, int iReg){. 
1acb0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69   int i;.  int mi
1acc0 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c  nLru;.  int idxL
1acd0 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f  ru;.  struct yCo
1ace0 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a  lCache *p;..  /*
1acf0 20 55 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f 72   Unless an error
1ad00 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 72   has occurred, r
1ad10 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
1ad20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69 74  are always posit
1ad30 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ive. */.  assert
1ad40 28 20 69 52 65 67 3e 30 20 7c 7c 20 70 50 61 72  ( iReg>0 || pPar
1ad50 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72  se->nErr || pPar
1ad60 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1ad70 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74  iled );.  assert
1ad80 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43  ( iCol>=-1 && iC
1ad90 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20  ol<32768 );  /* 
1ada0 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75  Finite column nu
1adb0 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54  mbers */..  /* T
1adc0 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  he SQLITE_Column
1add0 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61 62  Cache flag disab
1ade0 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  les the column c
1adf0 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20 75  ache.  This is u
1ae00 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73  sed.  ** for tes
1ae10 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76  ting only - to v
1ae20 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69 74  erify that SQLit
1ae30 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74 68  e always gets th
1ae40 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
1ae50 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74 68  ** with and with
1ae60 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  out the column c
1ae70 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ache..  */.  if(
1ae80 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
1ae90 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
1aea0 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43  , SQLITE_ColumnC
1aeb0 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a  ache) ) return;.
1aec0 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c  .  /* First repl
1aed0 61 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ace any existing
1aee0 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   entry..  **.  *
1aef0 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
1af00 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  way the column c
1af10 61 63 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c  ache is currentl
1af20 79 20 75 73 65 64 2c 20 77 65 20 61 72 65 20 67  y used, we are g
1af30 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74  uaranteed.  ** t
1af40 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77  hat the object w
1af50 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64  ill never alread
1af60 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20  y be in cache.  
1af70 56 65 72 69 66 79 20 74 68 69 73 20 67 75 61 72  Verify this guar
1af80 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e  antee..  */.#ifn
1af90 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72  def NDEBUG.  for
1afa0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1afb0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61  aColCache; i<pPa
1afc0 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
1afd0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61  i++, p++){.    a
1afe0 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65  ssert( p->iTable
1aff0 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f  !=iTab || p->iCo
1b000 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20  lumn!=iCol );.  
1b010 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1b020 66 20 74 68 65 20 63 61 63 68 65 20 69 73 20 61  f the cache is a
1b030 6c 72 65 61 64 79 20 66 75 6c 6c 2c 20 64 65 6c  lready full, del
1b040 65 74 65 20 74 68 65 20 6c 65 61 73 74 20 72 65  ete the least re
1b050 63 65 6e 74 6c 79 20 75 73 65 64 20 65 6e 74 72  cently used entr
1b060 79 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73  y */.  if( pPars
1b070 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3e 3d 53 51  e->nColCache>=SQ
1b080 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 20  LITE_N_COLCACHE 
1b090 29 7b 0a 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20  ){.    minLru = 
1b0a0 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20  0x7fffffff;.    
1b0b0 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 20  idxLru = -1;.   
1b0c0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1b0d0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1b0e0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
1b0f0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
1b100 20 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c       if( p->lru<
1b110 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20  minLru ){.      
1b120 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20    idxLru = i;.  
1b130 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70        minLru = p
1b140 2d 3e 6c 72 75 3b 0a 20 20 20 20 20 20 7d 0a 20  ->lru;.      }. 
1b150 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 26 70 50     }.    p = &pP
1b160 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1b170 69 64 78 4c 72 75 5d 3b 0a 20 20 7d 65 6c 73 65  idxLru];.  }else
1b180 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  {.    p = &pPars
1b190 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 70 50 61  e->aColCache[pPa
1b1a0 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b  rse->nColCache++
1b1b0 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  ];.  }..  /* Add
1b1c0 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 74   the new entry t
1b1d0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1b1e0 20 63 61 63 68 65 20 2a 2f 0a 20 20 70 2d 3e 69   cache */.  p->i
1b1f0 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
1b200 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 70  iCacheLevel;.  p
1b210 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
1b220 0a 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  .  p->iColumn = 
1b230 69 43 6f 6c 3b 0a 20 20 70 2d 3e 69 52 65 67 20  iCol;.  p->iReg 
1b240 3d 20 69 52 65 67 3b 0a 20 20 70 2d 3e 74 65 6d  = iReg;.  p->tem
1b250 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 6c  pReg = 0;.  p->l
1b260 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
1b270 63 68 65 43 6e 74 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  cheCnt++;.}../*.
1b280 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
1b290 20 72 65 67 69 73 74 65 72 73 20 62 65 74 77 65   registers betwe
1b2a0 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52  en iReg..iReg+nR
1b2b0 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f  eg-1 are being o
1b2c0 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50  verwritten..** P
1b2d0 75 72 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f  urge the range o
1b2e0 66 20 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d  f registers from
1b2f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
1b300 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1b310 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1b320 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1b330 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
1b340 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  Reg){.  int i = 
1b350 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 70 50  0;.  while( i<pP
1b360 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20  arse->nColCache 
1b370 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43  ){.    struct yC
1b380 6f 6c 43 61 63 68 65 20 2a 70 20 3d 20 26 70 50  olCache *p = &pP
1b390 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
1b3a0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  i];.    if( p->i
1b3b0 52 65 67 20 3e 3d 20 69 52 65 67 20 26 26 20 70  Reg >= iReg && p
1b3c0 2d 3e 69 52 65 67 20 3c 20 69 52 65 67 2b 6e 52  ->iReg < iReg+nR
1b3d0 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  eg ){.      cach
1b3e0 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
1b3f0 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73  se, i);.    }els
1b400 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  e{.      i++;.  
1b410 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1b420 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75   Remember the cu
1b430 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63  rrent column cac
1b440 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79  he context.  Any
1b450 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64 64   new entries add
1b460 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74  ed.** added to t
1b470 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
1b480 61 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20  after this call 
1b490 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e  are removed when
1b4a0 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
1b4b0 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73  nding pop occurs
1b4c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b4d0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 50  3ExprCachePush(P
1b4e0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1b4f0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1b500 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53  evel++;.#ifdef S
1b510 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1b520 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
1b530 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
1b540 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
1b550 20 20 20 70 72 69 6e 74 66 28 22 50 55 53 48 20     printf("PUSH 
1b560 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65  to %d\n", pParse
1b570 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a  ->iCacheLevel);.
1b580 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
1b590 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20  .** Remove from 
1b5a0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1b5b0 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61   any entries tha
1b5c0 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69 6e  t were added sin
1b5d0 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72  ce the.** the pr
1b5e0 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33 45 78  evious sqlite3Ex
1b5f0 70 72 43 61 63 68 65 50 75 73 68 20 6f 70 65 72  prCachePush oper
1b600 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ation.  In other
1b610 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 0a   words, restore.
1b620 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  ** the cache to 
1b630 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
1b640 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20 6d 6f   in prior the mo
1b650 73 74 20 72 65 63 65 6e 74 20 50 75 73 68 2e 0a  st recent Push..
1b660 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1b670 78 70 72 43 61 63 68 65 50 6f 70 28 50 61 72 73  xprCachePop(Pars
1b680 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
1b690 74 20 69 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  t i = 0;.  asser
1b6a0 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  t( pParse->iCach
1b6b0 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70  eLevel>=1 );.  p
1b6c0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1b6d0 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c  el--;.#ifdef SQL
1b6e0 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1b6f0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
1b700 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
1b710 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
1b720 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20 74 6f   printf("POP  to
1b730 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e   %d\n", pParse->
1b740 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20  iCacheLevel);.  
1b750 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c 65  }.#endif.  while
1b760 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ( i<pParse->nCol
1b770 43 61 63 68 65 20 29 7b 0a 20 20 20 20 69 66 28  Cache ){.    if(
1b780 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
1b790 68 65 5b 69 5d 2e 69 4c 65 76 65 6c 3e 70 50 61  he[i].iLevel>pPa
1b7a0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1b7b0 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
1b7c0 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
1b7d0 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , i);.    }else{
1b7e0 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
1b7f0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
1b800 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c  hen a cached col
1b810 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d  umn is reused, m
1b820 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74  ake sure that it
1b830 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a  s register is.**
1b840 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c   no longer avail
1b850 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72  able as a temp r
1b860 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74  egister.  ticket
1b870 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61   #3879:  that sa
1b880 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d  me.** register m
1b890 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63  ight be in the c
1b8a0 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65  ache in multiple
1b8b0 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73   places, so be s
1b8c0 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68  ure to.** get th
1b8d0 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  em all..*/.stati
1b8e0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
1b8f0 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
1b900 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
1b910 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
1b920 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
1b930 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
1b940 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
1b950 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70  ->aColCache; i<p
1b960 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
1b970 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
1b980 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
1b990 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74  eg ){.      p->t
1b9a0 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
1b9b0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  }.  }.}../* Gene
1b9c0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
1b9d0 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65  ill load into re
1b9e0 67 69 73 74 65 72 20 72 65 67 4f 75 74 20 61 20  gister regOut a 
1b9f0 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a  value that is.**
1ba00 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
1ba10 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20   the iIdxCol-th 
1ba20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
1ba30 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pIdx..*/.void sq
1ba40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61  lite3ExprCodeLoa
1ba50 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20  dIndexColumn(.  
1ba60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1ba70 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1ba80 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
1ba90 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54  x *pIdx,    /* T
1baa0 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63  he index whose c
1bab0 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c  olumn is to be l
1bac0 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  oaded */.  int i
1bad0 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75  TabCur,    /* Cu
1bae0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
1baf0 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a   a table row */.
1bb00 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20    int iIdxCol,  
1bb10 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1bb20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
1bb30 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69  be loaded */.  i
1bb40 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f  nt regOut      /
1bb50 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65  * Store the inde
1bb60 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  x column value i
1bb70 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
1bb80 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62  */.){.  i16 iTab
1bb90 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  Col = pIdx->aiCo
1bba0 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20  lumn[iIdxCol];. 
1bbb0 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e   if( iTabCol==XN
1bbc0 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73  _EXPR ){.    ass
1bbd0 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45  ert( pIdx->aColE
1bbe0 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  xpr );.    asser
1bbf0 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  t( pIdx->aColExp
1bc00 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c  r->nExpr>iIdxCol
1bc10 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
1bc20 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43  iSelfTab = iTabC
1bc30 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ur;.    sqlite3E
1bc40 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72  xprCodeCopy(pPar
1bc50 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  se, pIdx->aColEx
1bc60 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70  pr->a[iIdxCol].p
1bc70 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  Expr, regOut);. 
1bc80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1bc90 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1bca0 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72  lumnOfTable(pPar
1bcb0 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d  se->pVdbe, pIdx-
1bcc0 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72  >pTable, iTabCur
1bcd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcf0 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72        iTabCol, r
1bd00 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  egOut);.  }.}../
1bd10 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1bd20 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
1bd30 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
1bd40 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
1bd50 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
1bd60 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1bd70 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1bd80 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  e(.  Vdbe *v,   
1bd90 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
1bda0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1bdb0 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ion */.  Table *
1bdc0 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20  pTab,    /* The 
1bdd0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1bde0 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20   the value */.  
1bdf0 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
1be00 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75 72  /* The table cur
1be10 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20  sor.  Or the PK 
1be20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f  cursor for WITHO
1be30 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e  UT ROWID */.  in
1be40 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a  t iCol,       /*
1be50 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   Index of the co
1be60 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20  lumn to extract 
1be70 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
1be80 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
1be90 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  the value into t
1bea0 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1beb0 29 7b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ){.  if( pTab==0
1bec0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1bed0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1bee0 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c  Column, iTabCur,
1bef0 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
1bf00 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1bf10 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
1bf20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  iCol==pTab->iPKe
1bf30 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
1bf40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1bf50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c  _Rowid, iTabCur,
1bf60 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73   regOut);.  }els
1bf70 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
1bf80 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
1bf90 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
1bfa0 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e  P_Column;.    in
1bfb0 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  t x = iCol;.    
1bfc0 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
1bfd0 61 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61  ab) && !IsVirtua
1bfe0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
1bff0 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
1c000 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65  mnOfIndex(sqlite
1c010 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
1c020 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20  (pTab), iCol);. 
1c030 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1c040 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
1c050 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65  , iTabCur, x, re
1c060 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  gOut);.  }.  if(
1c070 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
1c080 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
1c090 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43  ault(v, pTab, iC
1c0a0 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
1c0b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1c0c0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1c0d0 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43  l extract the iC
1c0e0 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
1c0f0 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54  from.** table pT
1c100 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ab and store the
1c110 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
1c120 20 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a 2a   a register. .**
1c130 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69 73  .** An effort is
1c140 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74   made to store t
1c150 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
1c160 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
1c170 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  .  This.** is no
1c180 74 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f 72  t garanteeed for
1c190 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20 74   GetColumn() - t
1c1a0 68 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62 65  he result can be
1c1b0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61 6e   stored in.** an
1c1c0 79 20 72 65 67 69 73 74 65 72 2e 20 20 42 75 74  y register.  But
1c1d0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 67   the result is g
1c1e0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61 6e  uaranteed to lan
1c1f0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  d in register iR
1c200 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f 6c  eg.** for GetCol
1c210 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a  umnToReg()..**.*
1c220 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
1c230 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
1c240 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65  o pTab in iTable
1c250 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
1c260 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  ne.** is called.
1c270 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74    If iColumn<0 t
1c280 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65  hen code is gene
1c290 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
1c2a0 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
1c2b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1c2c0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a  rCodeGetColumn(.
1c2d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1c2e0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
1c2f0 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
1c300 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
1c310 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
1c320 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1c330 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
1c340 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
1c350 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
1c360 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
1c370 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
1c380 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
1c390 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
1c3a0 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
1c3b0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
1c3c0 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20    int iReg,     
1c3d0 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
1c3e0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38  lts here */.  u8
1c3f0 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f   p5            /
1c400 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f  * P5 value for O
1c410 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53  P_Column + FLAGS
1c420 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
1c430 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1c440 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
1c450 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
1c460 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  ;..  for(i=0, p=
1c470 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1c480 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e; i<pParse->nCo
1c490 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b  lCache; i++, p++
1c4a0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
1c4b0 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
1c4c0 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  p->iColumn==iCol
1c4d0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  umn ){.      p->
1c4e0 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
1c4f0 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20  acheCnt++;.     
1c500 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1c510 65 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61  ePinRegister(pPa
1c520 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20  rse, p->iReg);. 
1c530 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69       return p->i
1c540 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  Reg;.    }.  }  
1c550 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
1c560 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1c570 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1c580 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54  able(v, pTab, iT
1c590 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
1c5a0 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29  Reg);.  if( p5 )
1c5b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1c5c0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29  eChangeP5(v, p5)
1c5d0 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20  ;.  }else{   .  
1c5e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1c5f0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1c600 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
1c610 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65   iReg);.  }.  re
1c620 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69  turn iReg;.}.voi
1c630 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1c640 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28  eGetColumnToReg(
1c650 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1c660 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
1c670 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1c680 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1c690 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1c6a0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1c6b0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
1c6c0 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
1c6d0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
1c6e0 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
1c6f0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1c700 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
1c710 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
1c720 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
1c730 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
1c740 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20  .  int iReg     
1c750 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
1c760 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
1c770 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
1c780 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1c790 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  umn(pParse, pTab
1c7a0 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c  , iColumn, iTabl
1c7b0 65 2c 20 69 52 65 67 2c 20 30 29 3b 0a 20 20 69  e, iReg, 0);.  i
1c7c0 66 28 20 72 31 21 3d 69 52 65 67 20 29 20 73 71  f( r1!=iReg ) sq
1c7d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c7e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1c7f0 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 69 52 65  P_SCopy, r1, iRe
1c800 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c  g);.}.../*.** Cl
1c810 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
1c820 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  ache entries..*/
1c830 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1c840 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73  rCacheClear(Pars
1c850 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
1c860 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  t i;..#ifdef SQL
1c870 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1c880 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
1c890 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
1c8a0 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
1c8b0 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e   printf("CLEAR\n
1c8c0 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
1c8d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
1c8e0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
1c8f0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
1c900 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
1c910 5d 2e 74 65 6d 70 52 65 67 0a 20 20 20 20 20 26  ].tempReg.     &
1c920 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  & pParse->nTempR
1c930 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
1c940 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 0a 20  rse->aTempReg). 
1c950 20 20 20 29 7b 0a 20 20 20 20 20 20 20 70 50 61     ){.       pPa
1c960 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
1c970 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
1c980 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  ] = pParse->aCol
1c990 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20  Cache[i].iReg;. 
1c9a0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73     }.  }.  pPars
1c9b0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20 30  e->nColCache = 0
1c9c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  ;.}../*.** Recor
1c9d0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
1c9e0 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  an affinity chan
1c9f0 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  ge has occurred 
1ca00 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67  on iCount.** reg
1ca10 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
1ca20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a  with iStart..*/.
1ca30 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1ca40 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1ca50 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
1ca60 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69  e, int iStart, i
1ca70 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71  nt iCount){.  sq
1ca80 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
1ca90 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74  move(pParse, iSt
1caa0 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a  art, iCount);.}.
1cab0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1cac0 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e  code to move con
1cad0 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74  tent from regist
1cae0 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f  ers iFrom...iFro
1caf0 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72  m+nReg-1.** over
1cb00 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65   to iTo..iTo+nRe
1cb10 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f  g-1. Keep the co
1cb20 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f  lumn cache up-to
1cb30 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  -date..*/.void s
1cb40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
1cb50 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
1cb60 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
1cb70 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b   iTo, int nReg){
1cb80 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d  .  assert( iFrom
1cb90 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46  >=iTo+nReg || iF
1cba0 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b  rom+nReg<=iTo );
1cbb0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1cbc0 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
1cbd0 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
1cbe0 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a  om, iTo, nReg);.
1cbf0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1cc00 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
1cc10 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d   iFrom, nReg);.}
1cc20 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1cc30 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1cc40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f  efined(SQLITE_CO
1cc50 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a  VERAGE_TEST)./*.
1cc60 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1cc70 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69  f any register i
1cc80 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f  n the range iFro
1cc90 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76  m..iTo (inclusiv
1cca0 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73  e).** is used as
1ccb0 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c   part of the col
1ccc0 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  umn cache..**.**
1ccd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1cce0 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 73 73   used within ass
1ccf0 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61  ert() and testca
1cd00 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79  se() macros only
1cd10 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  .** and does not
1cd20 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72   appear in a nor
1cd30 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74  mal build..*/.st
1cd40 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43  atic int usedAsC
1cd50 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65  olumnCache(Parse
1cd60 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
1cd70 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
1cd80 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1cd90 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
1cda0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1cdb0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1cdc0 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1cdd0 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  he; i++, p++){. 
1cde0 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52     int r = p->iR
1cdf0 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69  eg;.    if( r>=i
1ce00 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29  From && r<=iTo )
1ce10 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a   return 1;    /*
1ce20 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20  NO_TEST*/.  }.  
1ce30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1ce40 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
1ce50 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56  UG || SQLITE_COV
1ce60 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a  ERAGE_TEST */...
1ce70 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1ce80 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
1ce90 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52  n node to a TK_R
1cea0 45 47 49 53 54 45 52 20 72 65 66 65 72 65 6e 63  EGISTER referenc
1ceb0 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  ing.** register 
1cec0 69 52 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65  iReg.  The calle
1ced0 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
1cee0 61 74 20 69 52 65 67 20 61 6c 72 65 61 64 79 20  at iReg already 
1cef0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
1cf00 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1cf10 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
1cf20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1cf30 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
1cf40 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65  Expr *p, int iRe
1cf50 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70  g){.  p->op2 = p
1cf60 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20  ->op;.  p->op = 
1cf70 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70  TK_REGISTER;.  p
1cf80 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b  ->iTable = iReg;
1cf90 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70  .  ExprClearProp
1cfa0 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29  erty(p, EP_Skip)
1cfb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c 75  ;.}../*.** Evalu
1cfc0 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
1cfd0 6e 20 28 65 69 74 68 65 72 20 61 20 76 65 63 74  n (either a vect
1cfe0 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72 20 65  or or a scalar e
1cff0 78 70 72 65 73 73 69 6f 6e 29 20 61 6e 64 20 73  xpression) and s
1d000 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65 73 75  tore.** the resu
1d010 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f 75  lt in continguou
1d020 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
1d030 73 74 65 72 73 2e 20 20 52 65 74 75 72 6e 20 74  sters.  Return t
1d040 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
1d050 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
1d060 72 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  r used to store 
1d070 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
1d080 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65  * If the returne
1d090 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  d result registe
1d0a0 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
1d0b0 20 73 63 61 6c 61 72 2c 20 74 68 65 6e 20 61 6c   scalar, then al
1d0c0 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74 68 61 74  so write.** that
1d0d0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
1d0e0 20 69 6e 74 6f 20 2a 70 69 46 72 65 65 61 62 6c   into *piFreeabl
1d0f0 65 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  e.  If the retur
1d100 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67 69 73  ned result regis
1d110 74 65 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20  ter.** is not a 
1d120 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 66 20  temporary or if 
1d130 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1d140 73 20 61 20 76 65 63 74 6f 72 20 73 65 74 20 2a  s a vector set *
1d150 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74 6f  piFreeable.** to
1d160 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
1d170 74 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  t exprCodeVector
1d180 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d190 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 69  Expr *p, int *pi
1d1a0 46 72 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e 74  Freeable){.  int
1d1b0 20 69 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20   iResult;.  int 
1d1c0 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  nResult = sqlite
1d1d0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
1d1e0 70 29 3b 0a 20 20 69 66 28 20 6e 52 65 73 75 6c  p);.  if( nResul
1d1f0 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 52 65 73  t==1 ){.    iRes
1d200 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ult = sqlite3Exp
1d210 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1d220 2c 20 70 2c 20 70 69 46 72 65 65 61 62 6c 65 29  , p, piFreeable)
1d230 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
1d240 70 69 46 72 65 65 61 62 6c 65 20 3d 20 30 3b 0a  piFreeable = 0;.
1d250 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
1d260 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 23 69 66 20  K_SELECT ){.#if 
1d270 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1d280 55 45 52 59 0a 20 20 20 20 20 20 69 52 65 73 75  UERY.      iResu
1d290 6c 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20  lt = 0;.#else.  
1d2a0 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71      iResult = sq
1d2b0 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
1d2c0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 30 2c  ct(pParse, p, 0,
1d2d0 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
1d2e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1d2f0 20 69 3b 0a 20 20 20 20 20 20 69 52 65 73 75 6c   i;.      iResul
1d300 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
1d310 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  +1;.      pParse
1d320 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
1d330 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  t;.      for(i=0
1d340 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b  ; i<nResult; i++
1d350 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1d360 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72  e3ExprCodeFactor
1d370 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  able(pParse, p->
1d380 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
1d390 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b  xpr, i+iResult);
1d3a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d3b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73   }.  return iRes
1d3c0 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ult;.}.../*.** G
1d3d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
1d3e0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
1d3f0 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
1d400 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
1d410 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
1d420 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
1d430 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
1d440 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
1d450 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
1d460 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
1d470 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
1d480 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
1d490 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
1d4a0 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
1d4b0 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
1d4c0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
1d4d0 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
1d4e0 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
1d4f0 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
1d500 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
1d510 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
1d520 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
1d530 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
1d540 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
1d550 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
1d560 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
1d570 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
1d580 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
1d590 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1d5a0 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
1d5b0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1d5c0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1d5d0 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
1d5e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
1d5f0 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
1d600 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1d610 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d630 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
1d640 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
1d650 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
1d660 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
1d670 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
1d680 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
1d690 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1d6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
1d6b0 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
1d6c0 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
1d6d0 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
1d6e0 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
1d6f0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1d700 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1d710 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1d720 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  */.  int r1, r2;
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d740 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
1d750 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
1d760 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20  Expr tempX;     
1d770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
1d780 70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  porary expressio
1d790 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n node */.  int 
1d7a0 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  p5 = 0;..  asser
1d7b0 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
1d7c0 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
1d7d0 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  Mem );.  if( v==
1d7e0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
1d7f0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1d800 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1d810 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1d820 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1d830 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
1d840 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
1d850 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
1d860 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
1d870 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1d880 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
1d890 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
1d8a0 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
1d8b0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1d8c0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1d8d0 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
1d8e0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
1d8f0 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
1d900 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
1d910 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
1d920 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
1d930 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
1d940 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d      return pCol-
1d950 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  >iMem;.      }el
1d960 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
1d970 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
1d980 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d990 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1d9a0 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
1d9b0 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54  fo->sortingIdxPT
1d9c0 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1d9f0 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
1da00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1da10 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
1da20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
1da30 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
1da40 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
1da50 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
1da60 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
1da70 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  : {.      int iT
1da80 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  ab = pExpr->iTab
1da90 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54  le;.      if( iT
1daa0 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ab<0 ){.        
1dab0 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  if( pParse->ckBa
1dac0 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  se>0 ){.        
1dad0 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
1dae0 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
1daf0 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69  s or inserting i
1db00 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65  nto partial inde
1db10 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  x */.          r
1db20 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 43 6f  eturn pExpr->iCo
1db30 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63  lumn + pParse->c
1db40 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 7d  kBase;.        }
1db50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1db60 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70  /* Coding an exp
1db70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
1db80 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  part of an index
1db90 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61   where column na
1dba0 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mes.          **
1dbb0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65   in the index re
1dbc0 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65  fer to the table
1dbd0 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e   to which the in
1dbe0 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  dex belongs */. 
1dbf0 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20           iTab = 
1dc00 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1dc10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1dc20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1dc30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1dc40 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1dc50 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20  , pExpr->pTab,. 
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1dc80 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
1dc90 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcb0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1dcc0 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20  ->op2);.    }.  
1dcd0 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
1dce0 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49  R: {.      codeI
1dcf0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
1dd00 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29  Expr, 0, target)
1dd10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1dd20 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66  arget;.    }.#if
1dd30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1dd40 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1dd50 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
1dd60 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
1dd70 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1dd80 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1dd90 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1dda0 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78   codeReal(v, pEx
1ddb0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
1ddc0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1ddd0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1dde0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1ddf0 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
1de00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1de10 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1de20 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1de30 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71  lue) );.      sq
1de40 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
1de50 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70  ing(v, target, p
1de60 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1de70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1de80 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rget;.    }.    
1de90 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
1dea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1deb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1dec0 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
1ded0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1dee0 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  get;.    }.#ifnd
1def0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
1df00 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
1df10 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
1df20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
1df30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1df40 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  ;.      char *zB
1df50 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lob;.      asser
1df60 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1df70 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1df80 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1df90 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1dfa0 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27  u.zToken[0]=='x'
1dfb0 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   || pExpr->u.zTo
1dfc0 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  ken[0]=='X' );. 
1dfd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1dfe0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d  pr->u.zToken[1]=
1dff0 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
1e000 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   = &pExpr->u.zTo
1e010 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20  ken[2];.      n 
1e020 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1e030 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  0(z) - 1;.      
1e040 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c  assert( z[n]=='\
1e050 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f  '' );.      zBlo
1e060 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f  b = sqlite3HexTo
1e070 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65  Blob(sqlite3Vdbe
1e080 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Db(v), z, n);.  
1e090 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e0a0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
1e0b0 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30  , n/2, target, 0
1e0c0 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41  , zBlob, P4_DYNA
1e0d0 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75  MIC);.      retu
1e0e0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1e0f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1e100 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
1e110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1e120 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1e130 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1e140 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
1e150 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1e160 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ken!=0 );.      
1e170 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1e180 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b  .zToken[0]!=0 );
1e190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e1a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56  beAddOp2(v, OP_V
1e1b0 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  ariable, pExpr->
1e1c0 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  iColumn, target)
1e1d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
1e1e0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d  r->u.zToken[1]!=
1e1f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
1e200 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
1e210 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61  ite3VListNumToNa
1e220 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  me(pParse->pVLis
1e230 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t, pExpr->iColum
1e240 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
1e250 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1e260 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73  ken[0]=='?' || s
1e270 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  trcmp(pExpr->u.z
1e280 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a  Token, z)==0 );.
1e290 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
1e2a0 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f  pVList[0] = 0; /
1e2b0 2a 20 49 6e 64 69 63 61 74 65 20 56 4c 69 73 74  * Indicate VList
1e2c0 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   may no longer b
1e2d0 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
1e2e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e2f0 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 63 68  eAppendP4(v, (ch
1e300 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54 49 43  ar*)z, P4_STATIC
1e310 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e320 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1e330 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1e340 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
1e350 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
1e360 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  ->iTable;.    }.
1e370 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e380 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73  MIT_CAST.    cas
1e390 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20  e TK_CAST: {.   
1e3a0 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
1e3b0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
1e3c0 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74   CAST(pLeft AS t
1e3d0 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69  oken) */.      i
1e3e0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
1e3f0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1e400 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1e410 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
1e420 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
1e430 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  get ){.        s
1e440 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e450 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  (v, OP_SCopy, in
1e460 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
1e470 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
1e480 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
1e490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e4a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74  ddOp2(v, OP_Cast
1e4b0 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74    sqlite3Affinit
1e4e0 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
1e4f0 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20  Token, 0));.    
1e500 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64    testcase( used
1e510 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
1e520 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52  arse, inReg, inR
1e530 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  eg) );.      sql
1e540 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
1e550 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
1e560 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20  se, inReg, 1);. 
1e570 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e 52 65       return inRe
1e580 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  g;.    }.#endif 
1e590 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
1e5a0 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
1e5b0 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
1e5c0 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20  TK_ISNOT:.      
1e5d0 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
1e5e0 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
1e5f0 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c  ;.      p5 = SQL
1e600 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
1e610 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67    /* fall-throug
1e620 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  h */.    case TK
1e630 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
1e640 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
1e650 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
1e660 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
1e670 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
1e680 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  _EQ: {.      Exp
1e690 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
1e6a0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69  ->pLeft;.      i
1e6b0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
1e6c0 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b  Vector(pLeft) ){
1e6d0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56 65 63  .        codeVec
1e6e0 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  torCompare(pPars
1e6f0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1e700 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20  , op, p5);.     
1e710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e720 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1e730 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e740 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65   pLeft, &regFree
1e750 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
1e760 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e770 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1e780 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1e790 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
1e7a0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1e7b0 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72  se, pLeft, pExpr
1e7c0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1e7d0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1e7e0 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
1e7f0 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20  STOREP2 | p5);. 
1e800 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1e810 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
1e820 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
1e830 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e840 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
1e850 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1e860 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
1e870 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
1e880 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e890 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
1e8a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1e8b0 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
1e8c0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
1e8d0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e8e0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
1e8f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1e900 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
1e910 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
1e920 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e930 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
1e940 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1e950 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
1e960 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
1e970 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e980 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
1e990 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1e9a0 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
1e9b0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
1e9c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e9d0 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
1e9e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1e9f0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1ea00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ea10 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1ea20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1ea30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ea40 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
1ea50 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
1ea60 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
1ea70 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
1ea80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
1ea90 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
1eaa0 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
1eab0 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
1eac0 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
1ead0 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
1eae0 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
1eaf0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
1eb00 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
1eb10 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
1eb20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41      assert( TK_A
1eb30 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20  ND==OP_And );   
1eb40 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1eb50 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  e( op==TK_AND );
1eb60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1eb70 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20  K_OR==OP_Or );  
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1eb90 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20  case( op==TK_OR 
1eba0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ebb0 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
1ebc0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65   );           te
1ebd0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50  stcase( op==TK_P
1ebe0 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73  LUS );.      ass
1ebf0 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
1ec00 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20  P_Subtract );   
1ec10 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ec20 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20  TK_MINUS );.    
1ec30 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d    assert( TK_REM
1ec40 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29  ==OP_Remainder )
1ec50 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1ec60 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20   op==TK_REM );. 
1ec70 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ec80 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e  BITAND==OP_BitAn
1ec90 64 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  d );      testca
1eca0 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e  se( op==TK_BITAN
1ecb0 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
1ecc0 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f  t( TK_BITOR==OP_
1ecd0 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20  BitOr );        
1ece0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ecf0 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20  _BITOR );.      
1ed00 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48  assert( TK_SLASH
1ed10 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20  ==OP_Divide );  
1ed20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1ed30 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20  p==TK_SLASH );. 
1ed40 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ed50 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  LSHIFT==OP_Shift
1ed60 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61  Left );   testca
1ed70 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46  se( op==TK_LSHIF
1ed80 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
1ed90 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
1eda0 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20  _ShiftRight );  
1edb0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1edc0 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _RSHIFT );.     
1edd0 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
1ede0 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
1edf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ee00 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b  op==TK_CONCAT );
1ee10 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1ee20 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ee30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ee40 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1ee50 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1ee60 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1ee70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1ee80 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1ee90 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
1eea0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
1eeb0 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  p, r2, r1, targe
1eec0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1eed0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1eee0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1eef0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1ef00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ef10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ef20 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
1ef30 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
1ef40 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
1ef50 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
1ef60 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
1ef70 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
1ef80 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63  GER ){.        c
1ef90 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
1efa0 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72  e, pLeft, 1, tar
1efb0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  get);.        re
1efc0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 69 66  turn target;.#if
1efd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1efe0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1eff0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1f000 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
1f010 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OAT ){.        a
1f020 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1f030 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1f040 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1f050 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
1f060 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  v, pLeft->u.zTok
1f070 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  en, 1, target);.
1f080 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1f090 61 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20  arget;.#endif.  
1f0a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f0b0 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b     tempX.op = TK
1f0c0 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
1f0d0 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20    tempX.flags = 
1f0e0 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54  EP_IntValue|EP_T
1f0f0 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20  okenOnly;.      
1f100 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65    tempX.u.iValue
1f110 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31   = 0;.        r1
1f120 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f130 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
1f140 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31  tempX, &regFree1
1f150 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
1f160 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f170 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f180 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1f190 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee2);.        sq
1f1a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1f1b0 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
1f1c0 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1f1d0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1f1e0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1f1f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f200 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f210 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
1f220 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1f230 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1f240 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f  ( TK_BITNOT==OP_
1f250 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74  BitNot );   test
1f260 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1f270 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  NOT );.      ass
1f280 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f  ert( TK_NOT==OP_
1f290 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74  Not );         t
1f2a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f2b0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
1f2c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f2d0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f2e0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1f2f0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
1f300 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1f310 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1f320 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f330 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29  , op, r1, inReg)
1f340 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f350 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1f360 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
1f370 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
1f380 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
1f390 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f3a0 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
1f3b0 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ll );   testcase
1f3c0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
1f3d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f3e0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
1f3f0 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63  NotNull ); testc
1f400 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
1f410 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
1f420 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f430 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
1f440 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1f450 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f460 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f470 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f480 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f490 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f4a0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1f4b0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
1f4c0 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
1f4d0 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
1f4e0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1f4f0 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
1f500 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1f510 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
1f520 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
1f530 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f540 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1f550 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
1f560 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1f570 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
1f580 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f590 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1f5a0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
1f5b0 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f    AggInfo *pInfo
1f5c0 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
1f5d0 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
1f5e0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
1f5f0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1f600 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1f610 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1f620 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f630 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1f640 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
1f650 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70  regate: %s()", p
1f660 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1f670 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f680 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 6e        return pIn
1f690 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
1f6a0 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20  >iAgg].iMem;.   
1f6b0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1f6c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f6d0 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
1f6e0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1f6f0 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20  pFarg;       /* 
1f700 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e  List of function
1f710 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1f720 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20      int nFarg;  
1f730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f740 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e  mber of function
1f750 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1f760 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
1f770 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  f;         /* Th
1f780 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  e function defin
1f790 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ition object */.
1f7a0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1f7b0 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
1f7c0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
1f7d0 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63  e */.      u32 c
1f7e0 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
1f7f0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
1f800 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1f810 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
1f820 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
1f830 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f840 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1f850 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  r */.      sqlit
1f860 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1f870 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  >db;  /* The dat
1f880 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1f890 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63   */.      u8 enc
1f8a0 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20   = ENC(db);     
1f8b0 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63   /* The text enc
1f8c0 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  oding used by th
1f8d0 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
1f8e0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
1f8f0 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41  oll = 0;    /* A
1f900 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1f910 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  nce */..      if
1f920 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
1f930 70 50 61 72 73 65 29 20 26 26 20 73 71 6c 69 74  pParse) && sqlit
1f940 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1f950 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29  NotJoin(pExpr) )
1f960 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  {.        /* SQL
1f970 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62   functions can b
1f980 65 20 65 78 70 65 6e 73 69 76 65 2e 20 53 6f 20  e expensive. So 
1f990 74 72 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73  try to move cons
1f9a0 74 61 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20  tant functions. 
1f9b0 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66         ** out of
1f9c0 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c   the inner loop,
1f9d0 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
1f9e0 61 6e 73 20 61 6e 20 65 78 74 72 61 20 4f 50 5f  ans an extra OP_
1f9f0 43 6f 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  Copy. */.       
1fa00 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
1fa10 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
1fa20 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29  arse, pExpr, -1)
1fa30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fa40 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1fa50 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1fa60 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1fa70 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1fa80 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1fa90 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
1faa0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  ){.        pFarg
1fab0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1fac0 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  e{.        pFarg
1fad0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1fae0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1faf0 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f   nFarg = pFarg ?
1fb00 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20   pFarg->nExpr : 
1fb10 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
1fb20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1fb30 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1fb40 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a  alue) );.      z
1fb50 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  Id = pExpr->u.zT
1fb60 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66  oken;.      pDef
1fb70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
1fb80 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20  nction(db, zId, 
1fb90 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
1fba0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1fbb0 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c  ABLE_UNKNOWN_SQL
1fbc0 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20  _FUNCTION.      
1fbd0 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70  if( pDef==0 && p
1fbe0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
1fbf0 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
1fc00 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
1fc10 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77  tion(db, "unknow
1fc20 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  n", nFarg, enc, 
1fc30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
1fc40 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  if.      if( pDe
1fc50 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46  f==0 || pDef->xF
1fc60 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20  inalize!=0 ){.  
1fc70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1fc80 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1fc90 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a  nknown function:
1fca0 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20   %s()", zId);.  
1fcb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fcc0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
1fcd0 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20  ttempt a direct 
1fce0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1fcf0 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43  f the built-in C
1fd00 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20  OALESCE() and.  
1fd10 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20      ** IFNULL() 
1fd20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  functions.  This
1fd30 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73   avoids unnecess
1fd40 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  ary evaluation o
1fd50 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d  f.      ** argum
1fd60 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66 69  ents past the fi
1fd70 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67  rst non-NULL arg
1fd80 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ument..      */.
1fd90 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
1fda0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
1fdb0 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45  TE_FUNC_COALESCE
1fdc0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1fdd0 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71  endCoalesce = sq
1fde0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1fdf0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61  el(v);.        a
1fe00 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20  ssert( nFarg>=2 
1fe10 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1fe20 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1fe30 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
1fe40 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
1fe50 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
1fe60 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
1fe70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fe80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1fe90 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74  _NotNull, target
1fea0 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
1feb0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
1fec0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1fed0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1fee0 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
1fef0 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a  se, target, 1);.
1ff00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ff10 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1ff20 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
1ff30 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1ff40 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  e(pParse, pFarg-
1ff50 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[i].pExpr, tar
1ff60 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  get);.          
1ff70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ff80 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1ff90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1ffa0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1ffb0 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61  eLabel(v, endCoa
1ffc0 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
1ffd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1ffe0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c        /* The UNL
1fff0 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e  IKELY() function
20000 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68   is a no-op.  Th
20010 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20  e result is the 
20020 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f  value.      ** o
20030 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
20040 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
20050 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
20060 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
20070 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20  E_FUNC_UNLIKELY 
20080 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
20090 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20  t( nFarg>=1 );. 
200a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
200b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
200c0 67 65 74 28 70 50 61 72 73 65 2c 20 70 46 61 72  get(pParse, pFar
200d0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74  g->a[0].pExpr, t
200e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
200f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
20100 45 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 68  EBUG.      /* Th
20110 65 20 41 46 46 49 4e 49 54 59 28 29 20 66 75 6e  e AFFINITY() fun
20120 63 74 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ction evaluates 
20130 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  to a string that
20140 20 64 65 73 63 72 69 62 65 73 0a 20 20 20 20 20   describes.     
20150 20 2a 2a 20 74 68 65 20 74 79 70 65 20 61 66 66   ** the type aff
20160 69 6e 69 74 79 20 6f 66 20 74 68 65 20 61 72 67  inity of the arg
20170 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20  ument.  This is 
20180 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
20190 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
201a0 20 53 51 4c 69 74 65 20 74 79 70 65 20 6c 6f 67   SQLite type log
201b0 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
201c0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
201d0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
201e0 46 55 4e 43 5f 41 46 46 49 4e 49 54 59 20 29 7b  FUNC_AFFINITY ){
201f0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
20200 68 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b  har *azAff[] = {
20210 20 22 62 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c   "blob", "text",
20220 20 22 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e 74   "numeric", "int
20230 65 67 65 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b  eger", "real" };
20240 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66  .        char af
20250 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  f;.        asser
20260 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20  t( nFarg==1 );. 
20270 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c         aff = sql
20280 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
20290 28 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78  (pFarg->a[0].pEx
202a0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pr);.        sql
202b0 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
202c0 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 0a 20  ng(v, target, . 
202d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202e0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66               aff
202f0 20 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c   ? azAff[aff-SQL
20300 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20  ITE_AFF_BLOB] : 
20310 22 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20 20  "none");.       
20320 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
20330 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
20340 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
20350 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
20360 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26        if( i<32 &
20370 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
20380 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61  onstant(pFarg->a
20390 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
203a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
203b0 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  ( i==31 );.     
203c0 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c       constMask |
203d0 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a  = MASKBIT32(i);.
203e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
203f0 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
20400 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
20410 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d  FUNC_NEEDCOLL)!=
20420 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20  0 && !pColl ){. 
20430 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
20440 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
20450 53 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72  Seq(pParse, pFar
20460 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  g->a[i].pExpr);.
20470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20480 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72  }.      if( pFar
20490 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  g ){.        if(
204a0 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20   constMask ){.  
204b0 20 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61          r1 = pPa
204c0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
204d0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
204e0 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20  Mem += nFarg;.  
204f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20500 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
20510 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
20520 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a  pParse, nFarg);.
20530 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
20540 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68     /* For length
20550 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20  () and typeof() 
20560 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61  functions with a
20570 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74   column argument
20580 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  ,.        ** set
20590 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65   the P5 paramete
205a0 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75  r to the OP_Colu
205b0 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46  mn opcode to OPF
205c0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20  LAG_LENGTHARG.  
205d0 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c        ** or OPFL
205e0 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73  AG_TYPEOFARG res
205f0 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76  pectively, to av
20600 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
20610 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  data.        ** 
20620 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20  loading..       
20630 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
20640 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
20650 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f   & (SQLITE_FUNC_
20660 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55  LENGTH|SQLITE_FU
20670 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29  NC_TYPEOF))!=0 )
20680 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  {.          u8 e
20690 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20  xprOp;.         
206a0 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d   assert( nFarg==
206b0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  1 );.          a
206c0 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b  ssert( pFarg->a[
206d0 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  0].pExpr!=0 );. 
206e0 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20           exprOp 
206f0 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  = pFarg->a[0].pE
20700 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20  xpr->op;.       
20710 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54     if( exprOp==T
20720 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72  K_COLUMN || expr
20730 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  Op==TK_AGG_COLUM
20740 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
20750 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
20760 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46  FUNC_LENGTH==OPF
20770 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b  LAG_LENGTHARG );
20780 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
20790 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
207a0 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f  _TYPEOF==OPFLAG_
207b0 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20  TYPEOFARG );.   
207c0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
207d0 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  e( pDef->funcFla
207e0 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47  gs & OPFLAG_LENG
207f0 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  THARG );.       
20800 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d       pFarg->a[0]
20810 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20  .pExpr->op2 = . 
20820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20830 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
20840 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   & (OPFLAG_LENGT
20850 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45  HARG|OPFLAG_TYPE
20860 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20  OFARG);.        
20870 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
20880 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20890 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
208a0 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b  se);     /* Tick
208b0 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
208c0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
208d0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
208e0 73 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  st(pParse, pFarg
208f0 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  , r1, 0,.       
20900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20910 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
20920 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f  ECEL_DUP|SQLITE_
20930 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20  ECEL_FACTOR);.  
20940 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20950 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
20960 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65  );      /* Ticke
20970 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a  t 2ea2425d34be *
20980 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
20990 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20         r1 = 0;. 
209a0 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
209b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
209c0 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a  ALTABLE.      /*
209d0 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f   Possibly overlo
209e0 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ad the function 
209f0 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  if the first arg
20a00 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a  ument is.      *
20a10 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * a virtual tabl
20a20 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20  e column..      
20a30 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
20a40 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
20a50 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47  (LIKE, GLOB, REG
20a60 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20  EXP, and MATCH) 
20a70 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  use the.      **
20a80 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
20a90 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c  , not the first,
20aa0 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
20ab0 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20   to test to.    
20ac0 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
20ad0 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  s a column in a 
20ae0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
20af0 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63  This is done bec
20b00 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  ause.      ** th
20b10 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f  e left operand o
20b20 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  f infix function
20b30 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77  s (the operand w
20b40 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20  e want to.      
20b50 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c  ** control overl
20b60 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20  oading) ends up 
20b70 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
20b80 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  gument to the.  
20b90 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
20ba0 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
20bb0 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65   "A glob B" is e
20bc0 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
20bd0 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41      ** "glob(B,A
20be0 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75  ).  We want to u
20bf0 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67  se the A in "A g
20c00 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20  lob B" to test. 
20c10 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63       ** for func
20c20 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67  tion overloading
20c30 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68  .  But we use th
20c40 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f  e B term in "glo
20c50 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a  b(B,A)"..      *
20c60 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  /.      if( nFar
20c70 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e  g>=2 && (pExpr->
20c80 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78  flags & EP_Infix
20c90 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
20ca0 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
20cb0 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
20cc0 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46  ion(db, pDef, nF
20cd0 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d  arg, pFarg->a[1]
20ce0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
20cf0 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30  else if( nFarg>0
20d00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
20d10 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
20d20 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
20d30 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
20d40 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
20d50 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  r);.      }.#end
20d60 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  if.      if( pDe
20d70 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
20d80 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
20d90 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  OLL ){.        i
20da0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
20db0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
20dc0 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l; .        sqli
20dd0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
20de0 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
20df0 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
20e00 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
20e10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20e20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20e30 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
20e40 30 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31  0, constMask, r1
20e50 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
20e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e70 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50    (char*)pDef, P
20e80 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
20e90 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
20ea0 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61  ngeP5(v, (u8)nFa
20eb0 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  rg);.      if( n
20ec0 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73  Farg && constMas
20ed0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
20ee0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
20ef0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
20f00 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  r1, nFarg);.    
20f10 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
20f20 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
20f30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20f40 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
20f50 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
20f60 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
20f70 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  CT: {.      int 
20f80 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74  nCol;.      test
20f90 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49  case( op==TK_EXI
20fa0 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
20fb0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45  tcase( op==TK_SE
20fc0 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66  LECT );.      if
20fd0 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
20fe0 26 26 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72  && (nCol = pExpr
20ff0 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
21000 69 73 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29  ist->nExpr)!=1 )
21010 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21020 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
21030 70 50 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29  pParse, nCol, 1)
21040 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21050 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
21060 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
21070 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
21080 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
21090 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
210a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
210b0 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b  SELECT_COLUMN: {
210c0 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
210d0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
210e0 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Left->iTable==0 
210f0 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
21100 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20  ->pLeft->iTable 
21110 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
21120 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
21130 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 2c 20  Expr->pLeft, 0, 
21140 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
21150 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
21160 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45  >iTable==0 || pE
21170 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
21180 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
21190 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
211a0 61 62 6c 65 0a 20 20 20 20 20 20 20 26 26 20 70  able.       && p
211b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 28 6e  Expr->iTable!=(n
211c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
211d0 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
211e0 70 4c 65 66 74 29 29 20 0a 20 20 20 20 20 20 29  pLeft)) .      )
211f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21200 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
21210 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73  , "%d columns as
21220 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73  signed %d values
21230 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21250 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
21260 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
21270 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
21280 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20  ->pLeft->iTable 
21290 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
212a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
212b0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
212c0 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
212d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
212e0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
212f0 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
21300 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
21310 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
21320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21330 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
21340 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
21350 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21360 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
21370 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
21380 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
21390 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
213a0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
213b0 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
213c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
213d0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
213e0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
213f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21400 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
21410 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  mm, target, 0);.
21420 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21430 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
21440 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
21450 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
21460 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  t;.    }.#endif 
21470 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
21480 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20  UBQUERY */...   
21490 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
214a0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
214b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
214c0 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
214d0 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
214e0 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
214f0 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
21500 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
21510 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
21520 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
21530 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
21540 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
21550 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
21560 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
21570 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
21580 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
21590 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
215a0 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
215b0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
215c0 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a   target, 0, 0);.
215d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
215e0 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
215f0 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20  ase TK_SPAN:.   
21600 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45   case TK_COLLATE
21610 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  : .    case TK_U
21620 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65  PLUS: {.      re
21630 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
21640 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
21650 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
21660 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a   target);.    }.
21670 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49  .    case TK_TRI
21680 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  GGER: {.      /*
21690 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69   If the opcode i
216a0 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68  s TK_TRIGGER, th
216b0 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
216c0 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  n is a reference
216d0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63  .      ** to a c
216e0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
216f0 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75  .* or old.* pseu
21700 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61  do-tables availa
21710 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
21720 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
21730 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45  . In this case E
21740 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65  xpr.iTable is se
21750 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20  t to 1 for the. 
21760 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73       ** new.* ps
21770 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30  eudo-table, or 0
21780 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70   for the old.* p
21790 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70  seudo-table. Exp
217a0 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  r.iColumn.      
217b0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
217c0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70   column of the p
217d0 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72  seudo-table to r
217e0 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f  ead, or to -1 to
217f0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74  .      ** read t
21800 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a  he rowid field..
21810 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21820 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
21830 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
21840 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61  using an OP_Para
21850 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31  m opcode. The p1
21860 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65  .      ** parame
21870 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
21880 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64  for an old.rowid
21890 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74   reference, or t
218a0 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a  o (i+1).      **
218b0 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e   to reference an
218c0 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20  other column of 
218d0 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
218e0 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20  -table, where . 
218f0 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65       ** i is the
21900 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   index of the co
21910 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e  lumn. For a new.
21920 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
21930 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   p1 is.      ** 
21940 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68  set to (n+1), wh
21950 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d  ere n is the num
21960 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
21970 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61  n each pseudo-ta
21980 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f  ble..      ** Fo
21990 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  r a reference to
219a0 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d   any other colum
219b0 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70  n in the new.* p
219c0 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a  seudo-table, p1.
219d0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
219e0 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72  to (n+2+i), wher
219f0 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73  e n and i are as
21a00 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75   defined previou
21a10 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a  sly. For.      *
21a20 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
21a30 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68  e table on which
21a40 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65   triggers are be
21a50 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20  ing fired is.   
21a60 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61     ** declared a
21a70 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
21a80 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
21a90 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
21aa0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21ab0 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72  Then p1 is inter
21ac0 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
21ad0 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
21ae0 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d    **   p1==0   -
21af0 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20  >    old.rowid  
21b00 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20     p1==3   ->   
21b10 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20   new.rowid.     
21b20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e   **   p1==1   ->
21b30 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20      old.a       
21b40 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20    p1==4   ->    
21b50 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20  new.a.      **  
21b60 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f   p1==2   ->    o
21b70 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d  ld.b         p1=
21b80 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62  =5   ->    new.b
21b90 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f         .      */
21ba0 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
21bb0 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
21bc0 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d  ;.      int p1 =
21bd0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a   pExpr->iTable *
21be0 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20   (pTab->nCol+1) 
21bf0 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f  + 1 + pExpr->iCo
21c00 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73  lumn;..      ass
21c10 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62  ert( pExpr->iTab
21c20 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e  le==0 || pExpr->
21c30 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
21c40 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
21c50 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26  ->iColumn>=-1 &&
21c60 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
21c70 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
21c80 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
21c90 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78  ->iPKey<0 || pEx
21ca0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61  pr->iColumn!=pTa
21cb0 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20  b->iPKey );.    
21cc0 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20    assert( p1>=0 
21cd0 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f  && p1<(pTab->nCo
21ce0 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20  l*2+2) );..     
21cf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21d00 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20  p2(v, OP_Param, 
21d10 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  p1, target);.   
21d20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
21d30 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64  v, "%s.%s -> $%d
21d40 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70  ",.        (pExp
21d50 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77  r->iTable ? "new
21d60 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20  " : "old"),.    
21d70 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c      (pExpr->iCol
21d80 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20  umn<0 ? "rowid" 
21d90 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61  : pExpr->pTab->a
21da0 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
21db0 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20  mn].zName),.    
21dc0 20 20 20 20 74 61 72 67 65 74 0a 20 20 20 20 20      target.     
21dd0 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   ));..#ifndef SQ
21de0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
21df0 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f  NG_POINT.      /
21e00 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
21e10 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74  has REAL affinit
21e20 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e  y, it may curren
21e30 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  tly be stored as
21e40 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74   an.      ** int
21e50 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61  eger. Use OP_Rea
21e60 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b  lAffinity to mak
21e70 65 20 73 75 72 65 20 69 74 20 69 73 20 72 65 61  e sure it is rea
21e80 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20 20 20  lly real..      
21e90 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
21ea0 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35  ENCE-OF: R-60985
21eb0 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20 77 69  -57662 SQLite wi
21ec0 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76  ll convert the v
21ed0 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20 20 20  alue back to.   
21ee0 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70     ** floating p
21ef0 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72 61 63  oint when extrac
21f00 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65  ting it from the
21f10 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20   record.  */.   
21f20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
21f30 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20  olumn>=0 .      
21f40 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   && pTab->aCol[p
21f50 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61  Expr->iColumn].a
21f60 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
21f70 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29  AFF_REAL.      )
21f80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21f90 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
21fa0 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
21fb0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
21fc0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
21fd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
21fe0 63 61 73 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20  case TK_VECTOR: 
21ff0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
22000 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
22010 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
22020 65 64 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ed");.      brea
22030 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
22040 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  se TK_IF_NULL_RO
22050 57 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  W: {.      int a
22060 64 64 72 49 4e 52 3b 0a 20 20 20 20 20 20 61 64  ddrINR;.      ad
22070 64 72 49 4e 52 20 3d 20 73 71 6c 69 74 65 33 56  drINR = sqlite3V
22080 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
22090 49 66 4e 75 6c 6c 52 6f 77 2c 20 70 45 78 70 72  IfNullRow, pExpr
220a0 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
220b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
220c0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
220d0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
220e0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
220f0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
22100 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
22110 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
22120 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
22130 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
22140 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
22150 2c 20 61 64 64 72 49 4e 52 29 3b 0a 20 20 20 20  , addrINR);.    
22160 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
22170 6e 67 65 50 33 28 76 2c 20 61 64 64 72 49 4e 52  ngeP3(v, addrINR
22180 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
22190 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
221a0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    /*.    ** Form
221b0 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   A:.    **   CAS
221c0 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e  E x WHEN e1 THEN
221d0 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
221e0 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
221f0 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
22200 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
22210 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20   Form B:.    ** 
22220 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54    CASE WHEN e1 T
22230 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
22240 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
22250 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
22260 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
22270 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61   ** Form A is ca
22280 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64  n be transformed
22290 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61   into the equiva
222a0 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66  lent form B as f
222b0 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20  ollows:.    **  
222c0 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20   CASE WHEN x=e1 
222d0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65  THEN r1 WHEN x=e
222e0 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20  2 THEN r2 ....  
222f0 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e    **        WHEN
22300 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c   x=eN THEN rN EL
22310 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
22320 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20      ** X (if it 
22330 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45  exists) is in pE
22340 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
22350 2a 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c  ** Y is in the l
22360 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70  ast element of p
22370 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66  Expr->x.pList if
22380 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
22390 3e 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a  >nExpr is.    **
223a0 20 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20   odd.  The Y is 
223b0 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  also optional.  
223c0 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
223d0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70   elements in x.p
223e0 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65  List.    ** is e
223f0 76 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f  ven, then Y is o
22400 6d 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22  mitted and the "
22410 6f 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c  otherwise" resul
22420 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  t is NULL..    *
22430 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72  * Ei is in pExpr
22440 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20  ->pList->a[i*2] 
22450 61 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d  and Ri is pExpr-
22460 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d  >pList->a[i*2+1]
22470 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22480 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  The result of th
22490 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
224a0 74 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66  the Ri for the f
224b0 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69  irst matching Ei
224c0 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74  ,.    ** or if t
224d0 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68  here is no match
224e0 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45  ing Ei, the ELSE
224f0 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74   term Y, or if t
22500 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  here is.    ** n
22510 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c  o ELSE term, NUL
22520 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  L..    */.    de
22530 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f  fault: assert( o
22540 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a  p==TK_CASE ); {.
22550 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62        int endLab
22560 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
22570 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20          /* GOTO 
22580 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66  label for end of
22590 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20   CASE stmt */.  
225a0 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65      int nextCase
225b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
225c0 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
225d0 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45  bel for next WHE
225e0 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  N clause */.    
225f0 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20    int nExpr;    
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22610 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72      /* 2x number
22620 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
22630 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
22640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
22660 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
22670 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
22680 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
22690 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
226a0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
226b0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
226c0 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65  ist_item *aListe
226d0 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f  lem;  /* Array o
226e0 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
226f0 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d        Expr opCom
22700 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  pare;           
22710 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
22720 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20  ==Ei expression 
22730 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
22740 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
22750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22760 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  e X expression *
22770 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54  /.      Expr *pT
22780 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
22790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d            /* X==
227a0 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a  Ei (form A) or j
227b0 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20  ust Ei (form B) 
227c0 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c  */.      VVA_ONL
227d0 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76  Y( int iCacheLev
227e0 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
227f0 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20  cheLevel; )..   
22800 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
22810 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
22820 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
22830 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
22840 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  st );.      asse
22850 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  rt(pExpr->x.pLis
22860 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20  t->nExpr > 0);. 
22870 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
22880 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
22890 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20      aListelem = 
228a0 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  pEList->a;.     
228b0 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
228c0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e  >nExpr;.      en
228d0 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  dLabel = sqlite3
228e0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
228f0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20  ;.      if( (pX 
22900 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  = pExpr->pLeft)!
22910 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
22920 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20  mpX = *pX;.     
22930 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
22940 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
22950 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f  ;.        exprTo
22960 52 65 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c  Register(&tempX,
22970 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
22980 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20  pParse, &tempX, 
22990 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20  &regFree1));.   
229a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
229b0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
229c0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 70        memset(&op
229d0 43 6f 6d 70 61 72 65 2c 20 30 2c 20 73 69 7a 65  Compare, 0, size
229e0 6f 66 28 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a  of(opCompare));.
229f0 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
22a00 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20  e.op = TK_EQ;.  
22a10 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
22a20 70 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a  pLeft = &tempX;.
22a30 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
22a40 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20  &opCompare;.    
22a50 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33      /* Ticket b3
22a60 35 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39  51d95f9cd5ef17e9
22a70 64 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31  d9dbae18f5ca8611
22a80 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20  190001:.        
22a90 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
22aa0 72 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67  regFree1 might g
22ab0 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f  et SCopy-ed into
22ac0 20 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74   the file result
22ad0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20  ..        ** So 
22ae0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
22af0 68 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69  he regFree1 regi
22b00 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73  ster is not reus
22b10 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20  ed for other.   
22b20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73       ** purposes
22b30 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76   and possibly ov
22b40 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20  erwritten.  */. 
22b50 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20         regFree1 
22b60 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
22b70 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
22b80 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20  xpr-1; i=i+2){. 
22b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
22ba0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
22bb0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
22bc0 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
22bd0 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d   assert( pTest!=
22be0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 );.          o
22bf0 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20  pCompare.pRight 
22c00 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
22c10 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
22c20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
22c30 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  Test = aListelem
22c40 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
22c50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78     }.        nex
22c60 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56  tCase = sqlite3V
22c70 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
22c80 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
22c90 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b  e( pTest->op==TK
22ca0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
22cb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
22cc0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
22cd0 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53  est, nextCase, S
22ce0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
22cf0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
22d00 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ase( aListelem[i
22d10 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  +1].pExpr->op==T
22d20 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
22d30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
22d40 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73  ode(pParse, aLis
22d50 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
22d60 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
22d70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
22d80 74 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  to(v, endLabel);
22d90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22da0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
22db0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
22dc0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
22dd0 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73  Label(v, nextCas
22de0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
22df0 20 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21    if( (nExpr&1)!
22e00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
22e10 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
22e20 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
22e30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
22e40 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ode(pParse, pELi
22e50 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70  st->a[nExpr-1].p
22e60 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
22e70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
22e80 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
22e90 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
22ea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22eb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22ec0 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
22ed0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22ee0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
22ef0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
22f00 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
22f10 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  r>0 .           
22f20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  || pParse->iCach
22f30 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65  eLevel==iCacheLe
22f40 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  vel );.      sql
22f50 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
22f60 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c  abel(v, endLabel
22f70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
22f80 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
22f90 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
22fa0 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
22fb0 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ISE: {.      ass
22fc0 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69  ert( pExpr->affi
22fd0 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  nity==OE_Rollbac
22fe0 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  k .           ||
22ff0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
23000 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20  ==OE_Abort.     
23010 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
23020 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69  affinity==OE_Fai
23030 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  l.           || 
23040 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
23050 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20  =OE_Ignore.     
23060 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
23070 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
23080 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
23090 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
230a0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
230c0 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
230d0 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
230e0 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
230f0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
23100 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
23110 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
23120 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
23130 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23140 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
23150 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
23160 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
23170 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
23180 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
23190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
231a0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
231b0 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
231c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
231d0 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20  dOp4(.          
231e0 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51    v, OP_Halt, SQ
231f0 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f  LITE_OK, OE_Igno
23200 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  re, 0, pExpr->u.
23210 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20  zToken,0);.     
23220 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
23230 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
23240 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23250 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
23260 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f  Parse, SQLITE_CO
23270 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
23280 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232a0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c  pExpr->affinity,
232b0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
232c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
232d0 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
232e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
232f0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
23300 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
23310 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
23320 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
23330 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
23340 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
23350 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  nReg;.}../*.** F
23360 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f  actor out the co
23370 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  de of the given 
23380 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e  expression to in
23390 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
233a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44  e..**.** If regD
233b0 65 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  est>=0 then the 
233c0 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73  result is always
233d0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20   stored in that 
233e0 72 65 67 69 73 74 65 72 20 61 6e 64 20 74 68 65  register and the
233f0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  .** result is no
23400 74 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20  t reusable.  If 
23410 72 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74  regDest<0 then t
23420 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66  his routine is f
23430 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65  ree to .** store
23440 20 74 68 65 20 76 61 6c 75 65 20 77 68 65 72 65   the value where
23450 65 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20  ever it wants.  
23460 54 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  The register whe
23470 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
23480 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  n .** is stored 
23490 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68  is returned.  Wh
234a0 65 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77  en regDest<0, tw
234b0 6f 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72  o identical expr
234c0 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20  essions will.** 
234d0 63 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65  code to the same
234e0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e   register..*/.in
234f0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
23500 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65  eAtInit(.  Parse
23510 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
23520 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
23530 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
23540 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ,      /* The ex
23550 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65  pression to code
23560 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69   when the VDBE i
23570 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20  nitializes */.  
23580 69 6e 74 20 72 65 67 44 65 73 74 20 20 20 20 20  int regDest     
23590 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76    /* Store the v
235a0 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
235b0 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
235c0 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73  prList *p;.  ass
235d0 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72  ert( ConstFactor
235e0 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20  Ok(pParse) );.  
235f0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  p = pParse->pCon
23600 73 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65  stExpr;.  if( re
23610 67 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a  gDest<0 && p ){.
23620 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
23630 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
23640 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
23650 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20  for(pItem=p->a, 
23660 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b  i=p->nExpr; i>0;
23670 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a   pItem++, i--){.
23680 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
23690 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c  >reusable && sql
236a0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
236b0 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78  pItem->pExpr,pEx
236c0 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  pr,-1)==0 ){.   
236d0 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65       return pIte
236e0 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52  m->u.iConstExprR
236f0 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  eg;.      }.    
23700 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20  }.  }.  pExpr = 
23710 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
23720 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
23730 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  , 0);.  p = sqli
23740 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
23750 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78  d(pParse, p, pEx
23760 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  pr);.  if( p ){.
23770 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
23780 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
23790 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70   = &p->a[p->nExp
237a0 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d  r-1];.     pItem
237b0 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67  ->reusable = reg
237c0 44 65 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28  Dest<0;.     if(
237d0 20 72 65 67 44 65 73 74 3c 30 20 29 20 72 65 67   regDest<0 ) reg
237e0 44 65 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Dest = ++pParse-
237f0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65  >nMem;.     pIte
23800 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52  m->u.iConstExprR
23810 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20  eg = regDest;.  
23820 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  }.  pParse->pCon
23830 73 74 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65  stExpr = p;.  re
23840 74 75 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a  turn regDest;.}.
23850 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
23860 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
23870 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   an expression a
23880 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
23890 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  ults.** into a r
238a0 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e  egister.  Return
238b0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
238c0 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72  mber where the r
238d0 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74  esults.** are st
238e0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
238f0 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61  he register is a
23900 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
23910 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20  ter that can be 
23920 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20  deallocated,.** 
23930 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e  then write its n
23940 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67  umber into *pReg
23950 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
23960 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
23970 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c  .** a temporary,
23980 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20   then set *pReg 
23990 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49  to zero..**.** I
239a0 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e  f pExpr is a con
239b0 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  stant, then this
239c0 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67   routine might g
239d0 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20  enerate this.** 
239e0 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65  code to fill the
239f0 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
23a00 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
23a10 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  section of the.*
23a20 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20  * VDBE program, 
23a30 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74  in order to fact
23a40 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65  or it out of the
23a50 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70   evaluation loop
23a60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23a70 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72  ExprCodeTemp(Par
23a80 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
23a90 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52   *pExpr, int *pR
23aa0 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20  eg){.  int r2;. 
23ab0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
23ac0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
23ad0 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f  pExpr);.  if( Co
23ae0 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
23af0 73 65 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d  se).   && pExpr-
23b00 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
23b10 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
23b20 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
23b30 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a  oin(pExpr).  ){.
23b40 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a      *pReg  = 0;.
23b50 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
23b60 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
23b70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31  Parse, pExpr, -1
23b80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23b90 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
23ba0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
23bb0 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c  e);.    r2 = sql
23bc0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
23bd0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
23be0 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72  , r1);.    if( r
23bf0 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a  2==r1 ){.      *
23c00 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d  pReg = r1;.    }
23c10 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
23c20 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
23c30 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
23c40 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a       *pReg = 0;.
23c50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
23c60 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn r2;.}../*.** 
23c70 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
23c80 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
23c90 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
23ca0 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
23cb0 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
23cc0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
23cd0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
23ce0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70  guaranteed to ap
23cf0 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73  pear.** in regis
23d00 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76  ter target..*/.v
23d10 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
23d20 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
23d30 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
23d40 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
23d50 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73  nt inReg;..  ass
23d60 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26  ert( target>0 &&
23d70 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d   target<=pParse-
23d80 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70  >nMem );.  if( p
23d90 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f  Expr && pExpr->o
23da0 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
23db0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
23dc0 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
23dd0 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20  pVdbe, OP_Copy, 
23de0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74  pExpr->iTable, t
23df0 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  arget);.  }else{
23e00 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c  .    inReg = sql
23e10 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
23e20 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
23e30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61  , target);.    a
23e40 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
23e50 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73  Vdbe!=0 || pPars
23e60 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
23e70 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69  led );.    if( i
23e80 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20  nReg!=target && 
23e90 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b  pParse->pVdbe ){
23ea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
23eb0 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
23ec0 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
23ed0 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
23ee0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
23ef0 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e  *.** Make a tran
23f00 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78  sient copy of ex
23f10 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
23f20 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20  nd then code it 
23f30 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
23f40 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69  ExprCode().  Thi
23f50 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
23f60 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65  just like sqlite
23f70 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65  3ExprCode().** e
23f80 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 69  xcept that the i
23f90 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20  nput expression 
23fa0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
23fb0 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   be unchanged..*
23fc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
23fd0 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65  prCodeCopy(Parse
23fe0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
23ff0 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
24000 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t){.  sqlite3 *d
24010 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
24020 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
24030 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
24040 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64  pr, 0);.  if( !d
24050 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24060 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ) sqlite3ExprCod
24070 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
24080 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69   target);.  sqli
24090 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
240a0 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
240b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
240c0 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
240d0 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
240e0 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
240f0 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
24100 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
24110 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
24120 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
24130 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
24140 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
24150 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
24160 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74  n is constant, t
24170 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
24180 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65  .** might choose
24190 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70   to code the exp
241a0 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69  ression at initi
241b0 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a  alization time..
241c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
241d0 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c  xprCodeFactorabl
241e0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
241f0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
24200 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28  t target){.  if(
24210 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74   pParse->okConst
24220 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65  Factor && sqlite
24230 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
24240 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71  pExpr) ){.    sq
24250 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
24260 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
24270 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65  r, target);.  }e
24280 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
24290 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
242a0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
242b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
242c0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
242d0 20 65 76 61 6c 75 61 74 65 73 20 74 68 65 20 67   evaluates the g
242e0 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
242f0 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73  and puts the res
24300 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ult.** in regist
24310 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  er target..**.**
24320 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70   Also make a cop
24330 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
24340 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ion results into
24350 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22   another "cache"
24360 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
24370 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72   modify the expr
24380 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  ession so that t
24390 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20  he next time it 
243a0 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a  is evaluated,.**
243b0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
243c0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63   copy of the cac
243d0 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  he register..**.
243e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
243f0 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72  is used for expr
24400 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
24410 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a   used multiple .
24420 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20  ** times.  They 
24430 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  are evaluated on
24440 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  ce and the resul
24450 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ts of the expres
24460 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73  sion.** are reus
24470 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
24480 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61  te3ExprCodeAndCa
24490 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
244a0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
244b0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
244c0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
244d0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d  >pVdbe;.  int iM
244e0 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  em;..  assert( t
244f0 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
24500 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
24510 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
24520 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24530 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24540 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20  target);.  iMem 
24550 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
24560 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
24570 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
24580 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b  , target, iMem);
24590 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  .  exprToRegiste
245a0 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a  r(pExpr, iMem);.
245b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
245c0 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
245d0 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
245e0 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
245f0 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
24600 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e  pression list in
24610 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  to a sequence of
24620 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
24630 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a  ning at target..
24640 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
24650 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
24660 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a  nts evaluated..*
24670 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
24680 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72  ECEL_DUP flag pr
24690 65 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d  events the argum
246a0 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a  ents from being.
246b0 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20  ** filled using 
246c0 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f  OP_SCopy.  OP_Co
246d0 70 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  py must be used 
246e0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  instead..**.** T
246f0 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  he SQLITE_ECEL_F
24700 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61  ACTOR argument a
24710 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61  llows constant a
24720 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a  rguments to be.*
24730 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69  * factored out i
24740 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  nto initializati
24750 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  on code..**.** T
24760 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  he SQLITE_ECEL_R
24770 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68  EF flag means th
24780 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  at expressions i
24790 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74 68 0a  n the list with.
247a0 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  ** ExprList.a[].
247b0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
247c0 30 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  0 have already b
247d0 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e  een evaluated an
247e0 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72  d stored.** in r
247f0 65 67 69 73 74 65 72 73 20 61 74 20 73 72 63 52  egisters at srcR
24800 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 76  eg, and so the v
24810 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f 70 69  alue can be copi
24820 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a  ed from there..*
24830 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
24840 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20  rCodeExprList(. 
24850 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
24860 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
24870 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
24880 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
24890 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
248a0 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65   list to be code
248b0 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65  d */.  int targe
248c0 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  t,        /* Whe
248d0 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75  re to write resu
248e0 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  lts */.  int src
248f0 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
24900 6f 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20  ource registers 
24910 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  if SQLITE_ECEL_R
24920 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73  EF */.  u8 flags
24930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
24940 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67  LITE_ECEL_* flag
24950 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  s */.){.  struct
24960 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
24970 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pItem;.  int i, 
24980 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f  j, n;.  u8 copyO
24990 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c  p = (flags & SQL
249a0 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20  ITE_ECEL_DUP) ? 
249b0 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f  OP_Copy : OP_SCo
249c0 70 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  py;.  Vdbe *v = 
249d0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
249e0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
249f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  0 );.  assert( t
24a00 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
24a10 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
24a20 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76  be!=0 );  /* Nev
24a30 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72  er gets this far
24a40 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
24a50 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
24a60 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61  ;.  if( !ConstFa
24a70 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
24a80 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
24a90 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20  E_ECEL_FACTOR;. 
24aa0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
24ab0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69  ->a, i=0; i<n; i
24ac0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
24ad0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
24ae0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
24af0 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53    if( (flags & S
24b00 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21  QLITE_ECEL_REF)!
24b10 3d 30 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d  =0 && (j = pItem
24b20 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
24b30 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l)>0 ){.      if
24b40 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
24b50 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b  _ECEL_OMITREF ){
24b60 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20  .        i--;.  
24b70 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
24b80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24ba0 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73  2(v, copyOp, j+s
24bb0 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b  rcReg-1, target+
24bc0 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
24bd0 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
24be0 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46   & SQLITE_ECEL_F
24bf0 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c  ACTOR)!=0 && sql
24c00 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
24c10 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  nt(pExpr) ){.   
24c20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
24c30 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
24c40 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
24c50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
24c60 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20      int inReg = 
24c70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
24c80 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
24c90 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
24ca0 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
24cb0 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20  =target+i ){.   
24cc0 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
24cd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
24ce0 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  pyOp==OP_Copy.  
24cf0 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73         && (pOp=s
24d00 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
24d10 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d  v, -1))->opcode=
24d20 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
24d30 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70    && pOp->p1+pOp
24d40 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20  ->p3+1==inReg.  
24d50 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
24d60 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72  2+pOp->p3+1==tar
24d70 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b  get+i.        ){
24d80 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
24d90 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  p3++;.        }e
24da0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
24db0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24dc0 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65  (v, copyOp, inRe
24dd0 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
24de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
24df0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24e00 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
24e10 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
24e20 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   a BETWEEN opera
24e30 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20  tor..**.**    x 
24e40 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
24e50 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
24e60 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
24e70 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20   .**.**    x>=y 
24e80 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43  AND x<=z.**.** C
24e90 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
24ea0 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
24eb0 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
24ec0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c  expression.** el
24ed0 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  imination of x..
24ee0 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49  **.** The xJumpI
24ef0 66 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65  f parameter dete
24f00 72 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a  rmines details:.
24f10 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20  **.**    NULL:  
24f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f30 20 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65   Store the boole
24f40 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  an result in reg
24f50 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c  [dest].**    sql
24f60 69 74 65 33 45 78 70 72 49 66 54 72 75 65 3a 20  ite3ExprIfTrue: 
24f70 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73       Jump to des
24f80 74 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20  t if true.**    
24f90 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
24fa0 73 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20  se:     Jump to 
24fb0 64 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a  dest if false.**
24fc0 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75  .** The jumpIfNu
24fd0 6c 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ll parameter is 
24fe0 69 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70  ignored if xJump
24ff0 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  If is NULL..*/.s
25000 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
25010 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61  odeBetween(.  Pa
25020 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
25030 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
25040 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
25050 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
25060 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
25070 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70   The BETWEEN exp
25080 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
25090 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
250a0 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
250b0 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f  on or storage lo
250c0 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  cation */.  void
250d0 20 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a   (*xJump)(Parse*
250e0 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c  ,Expr*,int,int),
250f0 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61   /* Action to ta
25100 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  ke */.  int jump
25110 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b  IfNull    /* Tak
25120 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
25130 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c  e BETWEEN is NUL
25140 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78  L */.){. Expr ex
25150 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68  prAnd;     /* Th
25160 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69  e AND operator i
25170 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a  n  x>=y AND x<=z
25180 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70    */.  Expr comp
25190 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  Left;    /* The 
251a0 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20   x>=y  term */. 
251b0 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
251c0 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20     /* The  x<=z 
251d0 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
251e0 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20  exprX;       /* 
251f0 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65  The  x  subexpre
25200 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ssion */.  int r
25210 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20  egFree1 = 0; /* 
25220 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
25230 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65  gister */...  me
25240 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20  mset(&compLeft, 
25250 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
25260 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70  ;.  memset(&comp
25270 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66  Right, 0, sizeof
25280 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65  (Expr));.  memse
25290 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73  t(&exprAnd, 0, s
252a0 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20  izeof(Expr));.. 
252b0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
252c0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
252d0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
252e0 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78  ;.  exprX = *pEx
252f0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70  pr->pLeft;.  exp
25300 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
25310 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66  ;.  exprAnd.pLef
25320 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
25330 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
25340 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
25350 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
25360 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  _GE;.  compLeft.
25370 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
25380 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
25390 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
253a0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
253b0 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
253c0 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69   TK_LE;.  compRi
253d0 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
253e0 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  rX;.  compRight.
253f0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
25400 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
25410 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  xpr;.  exprToReg
25420 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 65 78  ister(&exprX, ex
25430 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
25440 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65  rse, &exprX, &re
25450 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20  gFree1));.  if( 
25460 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75  xJump ){.    xJu
25470 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  mp(pParse, &expr
25480 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
25490 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  fNull);.  }else{
254a0 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  .    /* Mark the
254b0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62   expression is b
254c0 65 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e  eing from the ON
254d0 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
254e0 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a   of a join.    *
254f0 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 71  * so that the sq
25500 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
25510 67 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69  get() routine wi
25520 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
25530 6f 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74  o move.    ** it
25540 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e   into the Parse.
25550 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e  pConstExpr list.
25560 20 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20    We should use 
25570 61 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68  a new bit for th
25580 69 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63  is,.    ** for c
25590 6c 61 72 69 74 79 2c 20 62 75 74 20 77 65 20 61  larity, but we a
255a0 72 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69  re out of bits i
255b0 6e 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73  n the Expr.flags
255c0 20 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20   field so we.   
255d0 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73   ** have to reus
255e0 65 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  e the EP_FromJoi
255f0 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20  n bit.  Bummer. 
25600 2a 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61  */.    exprX.fla
25610 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69  gs |= EP_FromJoi
25620 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  n;.    sqlite3Ex
25630 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
25640 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
25650 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  est);.  }.  sqli
25660 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
25670 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
25680 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  e1);..  /* Ensur
25690 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20  e adequate test 
256a0 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65  coverage */.  te
256b0 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
256c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
256d0 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d    && jumpIfNull=
256e0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
256f0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
25700 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
25710 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
25720 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
25730 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
25740 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
25750 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
25760 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
25770 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
25780 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
25790 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
257a0 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
257b0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
257c0 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
257d0 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
257e0 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
257f0 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
25800 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
25810 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
25820 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
25830 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
25840 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
25850 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
25860 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
25870 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
25880 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
25890 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
258a0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
258b0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
258c0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
258d0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
258e0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
258f0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
25900 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xJump==0 );.}../
25910 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
25920 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
25930 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
25940 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
25950 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
25960 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
25970 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
25980 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
25990 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
259a0 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
259b0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
259c0 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
259d0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
259e0 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
259f0 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
25a00 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
25a10 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
25a20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
25a30 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53  IfNull flag is S
25a40 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
25a50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64  ..**.** This cod
25a60 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
25a70 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61   fact that certa
25a80 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  in token values 
25a90 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61  (ex: TK_EQ).** a
25aa0 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f  re the same as o
25ab0 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78  pcode values (ex
25ac0 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d  : OP_Eq) that im
25ad0 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72  plement the corr
25ae0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65  esponding.** ope
25af0 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c  ration.  Special
25b00 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62   comments in vdb
25b10 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70  e.c and the mkop
25b20 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
25b30 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20   in.** the make 
25b40 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68  process cause th
25b50 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c  ese values to al
25b60 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20  ign.  Assert()s 
25b70 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62  in the code.** b
25b80 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74  elow verify that
25b90 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65   the numbers are
25ba0 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74   aligned correct
25bb0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
25bc0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61  te3ExprIfTrue(Pa
25bd0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
25be0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
25bf0 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
25c00 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
25c10 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
25c20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
25c30 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
25c40 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
25c50 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
25c60 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
25c70 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
25c80 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
25c90 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
25ca0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
25cb0 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b  0) )     return;
25cc0 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f    /* Existence o
25cd0 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
25ce0 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
25cf0 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
25d00 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
25d10 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  No way this can 
25d20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d  happen */.  op =
25d30 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
25d40 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
25d50 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
25d60 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
25d70 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
25d80 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
25d90 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
25da0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
25db0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25dc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
25dd0 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
25de0 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
25df0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
25e00 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
25e10 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
25e20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
25e30 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
25e40 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
25e50 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
25e60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25e70 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
25e80 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d2);.      sqlit
25e90 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
25ea0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
25eb0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
25ec0 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
25ed0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
25ee0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
25ef0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25f00 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
25f10 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
25f20 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
25f30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25f40 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
25f50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25f60 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
25f70 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
25f80 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
25f90 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
25fa0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
25fb0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
25fc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
25fd0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
25fe0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
25ff0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26000 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26010 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26020 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
26030 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
26040 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26050 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
26060 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
26070 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73  ISNOT:.      tes
26080 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
26090 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
260a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  se( op==TK_ISNOT
260b0 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
260c0 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
260d0 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
260e0 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53    jumpIfNull = S
260f0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
26100 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
26110 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
26120 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
26130 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
26140 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
26150 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
26160 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
26170 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EQ: {.      if( 
26180 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
26190 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  tor(pExpr->pLeft
261a0 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74  ) ) goto default
261b0 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73  _expr;.      tes
261c0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
261d0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
261e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
261f0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
26200 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
26210 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
26220 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
26230 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
26240 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
26250 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
26260 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
26270 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
26280 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
26290 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
262a0 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
262b0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
262c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
262d0 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
262e0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
262f0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
26300 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
26310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
26320 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
26330 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
26340 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
26350 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
26360 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
26370 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
26380 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
26390 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
263a0 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
263b0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
263c0 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
263d0 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
263e0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
263f0 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
26400 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
26410 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
26420 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
26430 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
26440 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
26450 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
26460 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
26470 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
26480 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
26490 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
264a0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
264b0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
264c0 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
264d0 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  se(op==OP_Ne);. 
264e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
264f0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
26500 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
26510 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
26520 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
26530 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
26540 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
26550 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
26560 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26570 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
26580 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26590 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
265a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
265b0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
265c0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
265d0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
265e0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
265f0 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
26600 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
26610 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
26620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
26630 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
26640 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65  Null ); testcase
26650 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
26660 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
26670 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
26680 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
26690 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
266a0 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
266b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
266c0 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
266d0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
266e0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
266f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
26700 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
26710 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
26720 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26730 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
26740 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26750 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
26760 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
26770 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
26780 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
26790 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
267a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
267b0 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
267c0 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75  IfTrue, jumpIfNu
267d0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
267e0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
267f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
26800 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
26810 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
26820 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
26830 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
26840 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
26850 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a  t destIfNull = j
26860 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74  umpIfNull ? dest
26870 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   : destIfFalse;.
26880 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26890 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
268a0 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
268b0 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
268c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
268d0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
268e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
268f0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
26900 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
26910 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26920 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
26930 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
26940 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20  ault_expr:.     
26950 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
26960 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
26970 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26980 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
26990 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
269a0 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
269b0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
269c0 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* No-op */.  
269d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
269e0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
269f0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
26a00 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
26a10 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
26a20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
26a30 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
26a40 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
26a50 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
26a60 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
26a70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26a80 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
26a90 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
26aa0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
26ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26ac0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
26ad0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
26ae0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
26af0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
26b00 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
26b10 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
26b20 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
26b30 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
26b40 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
26b50 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
26b60 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
26b70 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
26b80 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
26b90 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
26ba0 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
26bb0 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
26bc0 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
26bd0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
26be0 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
26bf0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
26c00 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
26c10 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
26c20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
26c30 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
26c40 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
26c50 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
26c60 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
26c70 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
26c80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
26c90 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
26ca0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
26cb0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
26cc0 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
26cd0 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
26ce0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
26cf0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
26d00 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
26d10 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
26d20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
26d30 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
26d40 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
26d50 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
26d60 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26d70 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
26d80 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45  ) ) return; /* E
26d90 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
26da0 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
26db0 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  er */.  if( pExp
26dc0 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e  r==0 )    return
26dd0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
26de0 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
26df0 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
26e00 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
26e10 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
26e20 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
26e30 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
26e40 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
26e50 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
26e60 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
26e70 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
26e80 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
26e90 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
26ea0 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
26eb0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
26ed0 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
26ee0 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
26ef0 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
26f00 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
26f10 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
26f20 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
26f30 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
26f40 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
26f60 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
26f70 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
26f80 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
26f90 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
26fa0 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
26fb0 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
26fc0 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
26fd0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
26fe0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
26ff0 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
27000 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
27010 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
27020 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
27030 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
27040 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
27050 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
27060 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
27070 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
27080 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
27090 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
270a0 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
270b0 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
270c0 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
270d0 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
270e0 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
270f0 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
27100 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
27110 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
27120 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
27130 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27140 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
27150 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
27160 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
27170 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
27180 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
27190 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
271a0 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
271b0 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
271c0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
271d0 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
271e0 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
271f0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27200 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
27210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
27220 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
27230 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
27240 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27250 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
27260 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
27270 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
27280 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
27290 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
272a0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
272b0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
272c0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
272d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
272e0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
272f0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
27300 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
27310 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
27320 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
27330 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
27340 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
27350 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
27360 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27370 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
27380 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27390 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
273a0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
273b0 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
273c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
273d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
273e0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
273f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27400 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
27410 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
27420 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49   jumpIfNull^SQLI
27430 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
27440 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27450 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
27460 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
27470 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
27480 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
27490 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
274a0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
274b0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
274c0 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
274d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
274e0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
274f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27500 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
27510 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
27520 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
27530 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
27540 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
27550 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27560 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
27570 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
27580 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
27590 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
275a0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
275b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
275c0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
275d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
275e0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
275f0 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f  ISNOT );.      o
27600 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  p = (pExpr->op==
27610 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a  TK_IS) ? TK_NE :
27620 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75   TK_EQ;.      ju
27630 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54  mpIfNull = SQLIT
27640 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
27650 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
27660 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
27670 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
27680 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
27690 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
276a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
276b0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
276c0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
276d0 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
276e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20  pExpr->pLeft) ) 
276f0 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70  goto default_exp
27700 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  r;.      testcas
27710 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27720 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
27730 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
27740 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
27750 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
27760 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
27770 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27780 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27790 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
277a0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
277b0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
277c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
277d0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
277e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
277f0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
27800 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27810 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
27820 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
27830 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
27840 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27850 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
27860 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
27870 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
27880 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
27890 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
278a0 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
278b0 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
278c0 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
278d0 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
278e0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
278f0 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
27900 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
27910 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
27920 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
27930 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
27940 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
27950 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
27960 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
27970 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64  OP_Eq);.      Vd
27980 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27990 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
279a0 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
279b0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
279c0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
279d0 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
279e0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
279f0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
27a00 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
27a10 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
27a20 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
27a30 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
27a40 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
27a50 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
27a60 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
27a70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
27a80 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
27a90 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
27aa0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
27ab0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
27ac0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
27ad0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27ae0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
27af0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27b00 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
27b10 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
27b20 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72  TNULL: {.      r
27b30 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
27b40 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
27b50 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
27b60 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
27b70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27b80 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
27b90 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
27ba0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
27bb0 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72  L );   VdbeCover
27bc0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
27bd0 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  ISNULL);.      t
27be0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
27bf0 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65  NOTNULL );  Vdbe
27c00 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
27c10 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
27c20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
27c30 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
27c40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
27c50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
27c60 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
27c70 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27c80 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
27c90 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
27ca0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
27cb0 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49  st, sqlite3ExprI
27cc0 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75  fFalse, jumpIfNu
27cd0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
27ce0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
27cf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
27d00 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
27d10 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _IN: {.      if(
27d20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20   jumpIfNull ){. 
27d30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
27d40 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
27d50 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
27d60 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
27d70 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65  {.        int de
27d80 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
27d90 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
27da0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
27db0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
27dc0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
27dd0 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  t, destIfNull);.
27de0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27df0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
27e00 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
27e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
27e20 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
27e30 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
27e40 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70  .    default_exp
27e50 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65 78  r: .      if( ex
27e60 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
27e70 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
27e80 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
27e90 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
27ea0 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
27eb0 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
27ec0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  ){.        /* no
27ed0 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
27ee0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
27ef0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27f00 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
27f10 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
27f20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27f30 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
27f40 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
27f50 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
27f60 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
27f70 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
27f80 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
27f90 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
27fa0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
27fb0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
27fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
27fd0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
27fe0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
27ff0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
28000 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
28010 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
28020 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
28030 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65  );.}../*.** Like
28040 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
28050 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61  lse() except tha
28060 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65  t a copy is made
28070 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65   of pExpr before
28080 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74  .** code generat
28090 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f  ion, and that co
280a0 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66  py is deleted af
280b0 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ter code generat
280c0 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73  ion. This.** ens
280d0 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72  ures that the or
280e0 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20  iginal pExpr is 
280f0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
28100 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
28110 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a  FalseDup(Parse *
28120 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
28130 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e  xpr, int dest,in
28140 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
28150 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
28160 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
28170 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74  r *pCopy = sqlit
28180 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
28190 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  xpr, 0);.  if( d
281a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
281b0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
281c0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
281d0 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74  rse, pCopy, dest
281e0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
281f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
28200 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79  Delete(db, pCopy
28210 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  );.}.../*.** Do 
28220 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
28230 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
28240 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
28250 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a  rn 0 if the two.
28260 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
28270 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64  re completely id
28280 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e  entical.  Return
28290 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65   1 if they diffe
282a0 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43  r only.** by a C
282b0 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
282c0 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c  at the top level
282d0 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74  .  Return 2 if t
282e0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
282f0 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68  nces.** other th
28300 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  an the top-level
28310 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
28320 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  r..**.** If any 
28330 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
28340 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
28350 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
28360 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
28370 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
28380 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
28390 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
283a0 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
283b0 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Tab..**.** The p
283c0 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20  A side might be 
283d0 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
283e0 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  R.  If that is t
283f0 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69  he case and pB i
28400 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54  s.** not using T
28410 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69  K_REGISTER but i
28420 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69  s otherwise equi
28430 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69  valent, then sti
28440 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  ll return 0..**.
28450 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  ** Sometimes thi
28460 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
28470 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20  eturn 2 even if 
28480 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69  the two expressi
28490 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72  ons.** really ar
284a0 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49  e equivalent.  I
284b0 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76  f we cannot prov
284c0 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
284d0 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64  ssions are.** id
284e0 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75  entical, we retu
284f0 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20  rn 2 just to be 
28500 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69  safe.  So if thi
28510 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
28520 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75  urns 2, then you
28530 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b   do not really k
28540 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20  now for certain 
28550 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
28560 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
28570 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20  e same.  But if 
28580 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31  you get a 0 or 1
28590 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f   return, then yo
285a0 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65  u.** can be sure
285b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
285c0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
285d0 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68  In the places wh
285e0 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ere.** this rout
285f0 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20  ine is used, it 
28600 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f  does not hurt to
28610 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20   get an extra 2 
28620 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d  - that.** just m
28630 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73  ight result in s
28640 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ome slightly slo
28650 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72  wer code.  But r
28660 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69  eturning.** an i
28670 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20  ncorrect 0 or 1 
28680 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
28690 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  malfunction..*/.
286a0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
286b0 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c  ompare(Expr *pA,
286c0 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69   Expr *pB, int i
286d0 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62  Tab){.  u32 comb
286e0 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28  inedFlags;.  if(
286f0 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
28700 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
28710 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20  ==pA ? 0 : 2;.  
28720 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  }.  combinedFlag
28730 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20  s = pA->flags | 
28740 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28  pB->flags;.  if(
28750 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
28760 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
28770 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61      if( (pA->fla
28780 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f  gs&pB->flags&EP_
28790 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20  IntValue)!=0 && 
287a0 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42  pA->u.iValue==pB
287b0 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20  ->u.iValue ){.  
287c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
287d0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
287e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
287f0 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20  op!=pB->op ){.  
28800 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
28810 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
28820 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
28830 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54  A->pLeft, pB, iT
28840 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
28850 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
28860 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54     if( pB->op==T
28870 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
28880 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
28890 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69  pA, pB->pLeft, i
288a0 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
288b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
288c0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
288d0 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
288e0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  TK_COLUMN && pA-
288f0 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
28900 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b  MN && pA->u.zTok
28910 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  en ){.    if( pA
28920 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
28930 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  N ){.      if( s
28940 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 41  qlite3StrICmp(pA
28950 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
28960 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65  .zToken)!=0 ) re
28970 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73  turn 2;.    }els
28980 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d  e if( strcmp(pA-
28990 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
289a0 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
289b0 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f      return pA->o
289c0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20  p==TK_COLLATE ? 
289d0 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  1 : 2;.    }.  }
289e0 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
289f0 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
28a00 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
28a10 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
28a20 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c  turn 2;.  if( AL
28a30 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c  WAYS((combinedFl
28a40 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ags & EP_TokenOn
28a50 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69  ly)==0) ){.    i
28a60 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
28a70 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
28a80 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
28a90 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
28aa0 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
28ab0 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
28ac0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
28ad0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
28ae0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52  prCompare(pA->pR
28af0 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
28b00 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
28b10 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
28b20 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
28b30 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20  re(pA->x.pList, 
28b40 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pB->x.pList, iTa
28b50 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
28b60 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63     if( ALWAYS((c
28b70 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
28b80 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26  P_Reduced)==0) &
28b90 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52  & pA->op!=TK_STR
28ba0 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ING ){.      if(
28bb0 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42   pA->iColumn!=pB
28bc0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75  ->iColumn ) retu
28bd0 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 2;.      if( 
28be0 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e  pA->iTable!=pB->
28bf0 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26  iTable .       &
28c00 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69  & (pA->iTable!=i
28c10 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d  Tab || NEVER(pB-
28c20 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72  >iTable>=0)) ) r
28c30 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
28c40 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
28c50 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
28c60 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
28c70 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20  ects.  Return 0 
28c80 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
28c90 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f  tical and .** no
28ca0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64  n-zero if they d
28cb0 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
28cc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
28cd0 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
28ce0 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
28cf0 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
28d00 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
28d10 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
28d20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
28d30 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
28d40 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
28d50 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ab..**.** This r
28d60 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74  outine might ret
28d70 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72  urn non-zero for
28d80 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72   equivalent Expr
28d90 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f  Lists.  The.** o
28da0 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  nly consequence 
28db0 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64  will be disabled
28dc0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20   optimizations. 
28dd0 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
28de0 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20  e.** must never 
28df0 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
28e00 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
28e10 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65  ects are differe
28e20 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66  nt, or.** a malf
28e30 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  unction will res
28e40 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  ult..**.** Two N
28e50 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65  ULL pointers are
28e60 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
28e70 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
28e80 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a   a NULL pointer.
28e90 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72  ** always differ
28ea0 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c  s from a non-NUL
28eb0 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  L pointer..*/.in
28ec0 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  t sqlite3ExprLis
28ed0 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73  tCompare(ExprLis
28ee0 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20  t *pA, ExprList 
28ef0 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
28f00 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
28f10 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20  A==0 && pB==0 ) 
28f20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
28f30 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
28f40 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
28f50 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e   pA->nExpr!=pB->
28f60 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31  nExpr ) return 1
28f70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
28f80 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  A->nExpr; i++){.
28f90 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41      Expr *pExprA
28fa0 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pA->a[i].pExp
28fb0 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  r;.    Expr *pEx
28fc0 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70  prB = pB->a[i].p
28fd0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41  Expr;.    if( pA
28fe0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
28ff0 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  !=pB->a[i].sortO
29000 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b  rder ) return 1;
29010 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
29020 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
29030 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62  rA, pExprB, iTab
29040 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
29050 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
29060 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
29070 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29  te3ExprCompare()
29080 20 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20   except COLLATE 
29090 6f 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65  operators at the
290a0 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72   top-level.** ar
290b0 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e  e ignored..*/.in
290c0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
290d0 70 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70  pareSkip(Expr *p
290e0 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
290f0 20 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e   iTab){.  return
29100 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
29110 61 72 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  are(.           
29120 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69    sqlite3ExprSki
29130 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a 20 20  pCollate(pA),.  
29140 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
29150 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
29160 65 28 70 42 29 2c 0a 20 20 20 20 20 20 20 20 20  e(pB),.         
29170 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a      iTab);.}../*
29180 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
29190 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20  if we can prove 
291a0 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77  the pE2 will alw
291b0 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70  ays be true if p
291c0 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20  E1 is.** true.  
291d0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
291e0 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65  we cannot comple
291f0 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20  te the proof or 
29200 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20  if pE2 might.** 
29210 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70  be false.  Examp
29220 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  les:.**.**     p
29230 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70  E1: x==5       p
29240 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
29250 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
29260 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e  e.**     pE1: x>
29270 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  0        pE2: x=
29280 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
29290 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
292a0 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20      pE1: x=21   
292b0 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52      pE2: x=21 OR
292c0 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74   y=43     Result
292d0 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
292e0 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45  1: x!=123     pE
292f0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
29300 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
29310 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
29320 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49  ?1      pE2: x I
29330 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
29340 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
29350 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c    pE1: x IS NULL
29360 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
29370 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
29380 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31  false.**     pE1
29390 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32  : x IS ?2    pE2
293a0 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
293b0 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65     Reuslt: false
293c0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70  .**.** When comp
293d0 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20  aring TK_COLUMN 
293e0 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45  nodes between pE
293f0 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45  1 and pE2, if pE
29400 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54  2 has.** Expr.iT
29410 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75  able<0 then assu
29420 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65  me a table numbe
29430 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e  r given by iTab.
29440 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64  .**.** When in d
29450 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c  oubt, return fal
29460 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74  se.  Returning t
29470 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61  rue might give a
29480 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
29490 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65  improvement.  Re
294a0 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69  turning false mi
294b0 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66  ght cause a perf
294c0 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
294d0 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c  n, but.** it wil
294e0 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68  l always give th
294f0 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
29500 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c   and is hence al
29510 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e  ways safe..*/.in
29520 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  t sqlite3ExprImp
29530 6c 69 65 73 45 78 70 72 28 45 78 70 72 20 2a 70  liesExpr(Expr *p
29540 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69  E1, Expr *pE2, i
29550 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20  nt iTab){.  if( 
29560 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
29570 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61  re(pE1, pE2, iTa
29580 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  b)==0 ){.    ret
29590 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
295a0 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a   pE2->op==TK_OR.
295b0 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78     && (sqlite3Ex
295c0 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
295d0 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  1, pE2->pLeft, i
295e0 54 61 62 29 0a 20 20 20 20 20 20 20 20 20 20 20  Tab).           
295f0 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
29600 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c  ImpliesExpr(pE1,
29610 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54   pE2->pRight, iT
29620 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72  ab) ).  ){.    r
29630 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
29640 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e  f( pE2->op==TK_N
29650 4f 54 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f  OTNULL && pE1->o
29660 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20  p!=TK_ISNULL && 
29670 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 20 29  pE1->op!=TK_IS )
29680 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d  {.    Expr *pX =
29690 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
296a0 43 6f 6c 6c 61 74 65 28 70 45 31 2d 3e 70 4c 65  Collate(pE1->pLe
296b0 66 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ft);.    testcas
296c0 65 28 20 70 58 21 3d 70 45 31 2d 3e 70 4c 65 66  e( pX!=pE1->pLef
296d0 74 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  t );.    if( sql
296e0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
296f0 70 58 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20  pX, pE2->pLeft, 
29700 69 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72  iTab)==0 ) retur
29710 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
29720 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
29730 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
29740 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
29750 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
29760 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
29770 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
29780 69 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  if an expression
29790 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65   can be evaluate
297a0 64 20 62 79 20 72 65 66 65 72 65 6e 63 65 20 74  d by reference t
297b0 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  o the.** index o
297c0 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76  nly, without hav
297d0 69 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72  ing to do a sear
297e0 63 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ch for the corre
297f0 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c  sponding.** tabl
29800 65 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64  e entry.  The Id
29810 78 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c  xCover.pIdx fiel
29820 64 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20  d is the index. 
29830 20 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a   IdxCover.iCur.*
29840 2a 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  * is the cursor 
29850 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  for the table..*
29860 2f 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76 65  /.struct IdxCove
29870 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  r {.  Index *pId
29880 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  x;     /* The in
29890 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64  dex to be tested
298a0 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f   for coverage */
298b0 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
298c0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
298d0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
298e0 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  le corresponding
298f0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   to the index */
29900 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .};../*.** Check
29910 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
29920 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 73 20   are references 
29930 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  to columns in ta
29940 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d  ble .** pWalker-
29950 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43  >u.pIdxCover->iC
29960 75 72 20 63 61 6e 20 62 65 20 73 61 74 69 73 66  ur can be satisf
29970 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e  ied using the in
29980 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e  dex.** pWalker->
29990 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64  u.pIdxCover->pId
299a0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
299b0 20 65 78 70 72 49 64 78 43 6f 76 65 72 28 57 61   exprIdxCover(Wa
299c0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
299d0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
299e0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
299f0 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45  _COLUMN.   && pE
29a00 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
29a10 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
29a20 72 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71  r->iCur.   && sq
29a30 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
29a40 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  ex(pWalker->u.pI
29a50 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70  dxCover->pIdx, p
29a60 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30  Expr->iColumn)<0
29a70 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  .  ){.    pWalke
29a80 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20  r->eCode = 1;.  
29a90 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
29aa0 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rt;.  }.  return
29ab0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
29ac0 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
29ad0 65 20 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49  e if an index pI
29ae0 64 78 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68  dx on table with
29af0 20 63 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e   cursor iCur con
29b00 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68  tains will.** th
29b10 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
29b20 70 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  pr.  Return true
29b30 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f   if the index do
29b40 65 73 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20  es cover the.** 
29b50 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66  expression and f
29b60 61 6c 73 65 20 69 66 20 74 68 65 20 70 45 78 70  alse if the pExp
29b70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66  r expression ref
29b80 65 72 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f  erences table co
29b90 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72  lumns.** that ar
29ba0 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74  e not found in t
29bb0 68 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  he index pIdx..*
29bc0 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f  *.** An index co
29bd0 76 65 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73  vering an expres
29be0 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  sion means that 
29bf0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
29c00 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74  an be.** evaluat
29c10 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68  ed using only th
29c20 65 20 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68  e index and with
29c30 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f  out having to lo
29c40 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72  okup the.** corr
29c50 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
29c60 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  entry..*/.int sq
29c70 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64  lite3ExprCovered
29c80 42 79 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20  ByIndex(.  Expr 
29c90 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
29ca0 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
29cb0 65 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  e tested */.  in
29cc0 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
29cd0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
29ce0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63  number for the c
29cf0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
29d00 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  le */.  Index *p
29d10 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Idx         /* T
29d20 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69  he index that mi
29d30 67 68 74 20 62 65 20 75 73 65 64 20 66 6f 72 20  ght be used for 
29d40 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20  coverage */.){. 
29d50 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72   Walker w;.  str
29d60 75 63 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f  uct IdxCover xco
29d70 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  v;.  memset(&w, 
29d80 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
29d90 20 78 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75   xcov.iCur = iCu
29da0 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d  r;.  xcov.pIdx =
29db0 20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72   pIdx;.  w.xExpr
29dc0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49  Callback = exprI
29dd0 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70  dxCover;.  w.u.p
29de0 49 64 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76  IdxCover = &xcov
29df0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
29e00 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
29e10 20 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64    return !w.eCod
29e20 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  e;.}.../*.** An 
29e30 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
29e40 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
29e50 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
29e60 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
29e70 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72  * to count refer
29e80 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63  ences to table c
29e90 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72  olumns in the ar
29ea0 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a  guments of an .*
29eb0 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
29ec0 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74  tion, in order t
29ed0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a  o implement the.
29ee0 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
29ef0 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74  onThisSrc() rout
29f00 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ine..*/.struct S
29f10 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c  rcCount {.  SrcL
29f20 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  ist *pSrc;   /* 
29f30 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46  One particular F
29f40 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ROM clause in a 
29f50 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a  nested query */.
29f60 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20    int nThis;    
29f70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
29f80 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
29f90 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73  lumns in pSrcLis
29fa0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65  t */.  int nOthe
29fb0 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  r;      /* Numbe
29fc0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
29fd0 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74  to columns in ot
29fe0 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73  her FROM clauses
29ff0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
2a000 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
2a010 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2a020 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74  columns..*/.stat
2a030 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f  ic int exprSrcCo
2a040 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  unt(Walker *pWal
2a050 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2a060 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45  ){.  /* The NEVE
2a070 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  R() on the secon
2a080 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73  d term is becaus
2a090 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  e sqlite3Functio
2a0a0 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20  nUsesThisSrc(). 
2a0b0 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61   ** is always ca
2a0c0 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69  lled before sqli
2a0d0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2a0e0 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73  gregates() and s
2a0f0 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f  o the.  ** TK_CO
2a100 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79  LUMNs have not y
2a110 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  et been converte
2a120 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  d into TK_AGG_CO
2a130 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73  LUMN.  If.  ** s
2a140 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
2a150 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75  esThisSrc() is u
2a160 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  sed differently 
2a170 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  in the future, t
2a180 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20  he.  ** NEVER() 
2a190 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
2a1a0 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66  removed. */.  if
2a1b0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2a1c0 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28  COLUMN || NEVER(
2a1d0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2a1e0 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20  G_COLUMN) ){.   
2a1f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
2a200 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d  ct SrcCount *p =
2a210 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63   pWalker->u.pSrc
2a220 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69  Count;.    SrcLi
2a230 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
2a240 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63  rc;.    int nSrc
2a250 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e   = pSrc ? pSrc->
2a260 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f  nSrc : 0;.    fo
2a270 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69  r(i=0; i<nSrc; i
2a280 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
2a290 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
2a2a0 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
2a2b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
2a2c0 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29      if( i<nSrc )
2a2d0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73  {.      p->nThis
2a2e0 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
2a2f0 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b       p->nOther++
2a300 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2a310 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2a320 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  e;.}../*.** Dete
2a330 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20  rmine if any of 
2a340 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  the arguments to
2a350 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74   the pExpr Funct
2a360 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  ion reference.**
2a370 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75   pSrcList.  Retu
2a380 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20  rn true if they 
2a390 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e  do.  Also return
2a3a0 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e   true if the fun
2a3b0 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20  ction.** has no 
2a3c0 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73  arguments or has
2a3d0 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61   only constant a
2a3e0 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72  rguments.  Retur
2a3f0 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72  n false if pExpr
2a400 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63  .** references c
2a410 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63  olumns but not c
2a420 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73  olumns of tables
2a430 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69   found in pSrcLi
2a440 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
2a450 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
2a460 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70  isSrc(Expr *pExp
2a470 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  r, SrcList *pSrc
2a480 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  List){.  Walker 
2a490 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43  w;.  struct SrcC
2a4a0 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65  ount cnt;.  asse
2a4b0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
2a4c0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
2a4d0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
2a4e0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
2a4f0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
2a500 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a  = exprSrcCount;.
2a510 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20    w.u.pSrcCount 
2a520 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53  = &cnt;.  cnt.pS
2a530 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20  rc = pSrcList;. 
2a540 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a   cnt.nThis = 0;.
2a550 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30    cnt.nOther = 0
2a560 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2a570 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70  xprList(&w, pExp
2a580 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72  r->x.pList);.  r
2a590 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e  eturn cnt.nThis>
2a5a0 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d  0 || cnt.nOther=
2a5b0 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  =0;.}../*.** Add
2a5c0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
2a5d0 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
2a5e0 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52  aCol[] array.  R
2a5f0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
2a600 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
2a610 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
2a620 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
2a630 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
2a640 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a650 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
2a660 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
2a670 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
2a680 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
2a690 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41  >aCol = sqlite3A
2a6a0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
2a6b0 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20       db,.       
2a6c0 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20  pInfo->aCol,.   
2a6d0 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
2a6e0 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20  ->aCol[0]),.    
2a6f0 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
2a700 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  mn,.       &i.  
2a710 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
2a720 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
2a730 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
2a740 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
2a750 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
2a760 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
2a770 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
2a780 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
2a790 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
2a7a0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
2a7b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a7c0 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
2a7d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
2a7e0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
2a7f0 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
2a800 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
2a810 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
2a820 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
2a830 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
2a840 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
2a850 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
2a860 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
2a870 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  nc,.       &i.  
2a880 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
2a890 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
2a8a0 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c   is the xExprCal
2a8b0 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65  lback for a tree
2a8c0 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20   walker.  It is 
2a8d0 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  used to.** imple
2a8e0 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  ment sqlite3Expr
2a8f0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2a900 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
2a910 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2a920 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
2a930 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
2a940 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2a950 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
2a960 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61  gate(Walker *pWa
2a970 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
2a980 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  r){.  int i;.  N
2a990 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
2a9a0 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
2a9b0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
2a9c0 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
2a9d0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2a9e0 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
2a9f0 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20  List;.  AggInfo 
2aa00 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d  *pAggInfo = pNC-
2aa10 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77  >pAggInfo;..  sw
2aa20 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
2aa30 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
2aa40 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
2aa50 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
2aa60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2aa70 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2aa80 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
2aa90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2aaa0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
2aab0 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N );.      /* Ch
2aac0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
2aad0 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
2aae0 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
2aaf0 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
2ab00 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
2ab10 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
2ab20 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
2ab30 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74   ALWAYS(pSrcList
2ab40 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
2ab50 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2ab60 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
2ab70 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
2ab80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
2ab90 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
2aba0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2abb0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
2abc0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
2abd0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2abe0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2abf0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
2ac00 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
2ac10 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
2ac20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
2ac30 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
2ac40 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
2ac50 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
2ac60 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
2ac70 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20  eans that pExpr 
2ac80 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
2ac90 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
2aca0 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
2acb0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
2acc0 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
2acd0 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20  ry.  .          
2ace0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
2acf0 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72   ** Make an entr
2ad00 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
2ad10 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
2ad20 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20  ol[] if there.  
2ad30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
2ad40 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65  not an entry the
2ad50 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
2ad60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2ad70 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
2ad80 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
2ad90 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b   pAggInfo->aCol;
2ada0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2adb0 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f  (k=0; k<pAggInfo
2adc0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20  ->nColumn; k++, 
2add0 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
2ade0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
2adf0 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
2ae00 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2ae20 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
2ae30 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
2ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2ae50 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2ae60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2ae70 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
2ae80 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  ( (k>=pAggInfo->
2ae90 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20  nColumn).       
2aea0 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64        && (k = ad
2aeb0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
2aec0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
2aed0 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20  nfo))>=0 .      
2aee0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2aef0 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
2af00 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d  AggInfo->aCol[k]
2af10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2af20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78  pCol->pTab = pEx
2af30 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
2af40 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54          pCol->iT
2af50 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54  able = pExpr->iT
2af60 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
2af70 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
2af80 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
2af90 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
2afa0 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b    pCol->iMem = +
2afb0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2afd0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2afe0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
2aff0 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72       pCol->pExpr
2b000 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
2b010 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
2b020 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29  Info->pGroupBy )
2b030 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b040 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20    int j, n;.    
2b050 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
2b060 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67  List *pGB = pAgg
2b070 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a  Info->pGroupBy;.
2b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b090 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2b0a0 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47  item *pTerm = pG
2b0b0 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20  B->a;.          
2b0c0 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e        n = pGB->n
2b0d0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
2b0e0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2b0f0 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  <n; j++, pTerm++
2b100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2b110 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
2b120 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b140 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pE->op==TK_C
2b150 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61  OLUMN && pE->iTa
2b160 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
2b170 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
2b180 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e              pE->
2b190 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
2b1a0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
2b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2b1c0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2b1d0 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2b1f0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2b200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b230 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
2b240 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30  >iSorterColumn<0
2b250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b260 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
2b270 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e  rColumn = pAggIn
2b280 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  fo->nSortingColu
2b290 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  mn++;.          
2b2a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b2b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2b2c0 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20  /* There is now 
2b2d0 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78  an entry for pEx
2b2e0 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  pr in pAggInfo->
2b2f0 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20  aCol[] (either. 
2b300 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
2b310 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65  cause it was the
2b320 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63  re before or bec
2b330 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65  ause we just cre
2b340 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20  ated it)..      
2b350 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
2b360 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65   the pExpr to be
2b370 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   a TK_AGG_COLUMN
2b380 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68   referring to th
2b390 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
2b3a0 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  * pAggInfo->aCol
2b3b0 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20  [] entry..      
2b3c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2b3d0 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
2b3e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2b3f0 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
2b400 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2b410 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
2b420 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nfo;.           
2b430 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
2b440 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  AGG_COLUMN;.    
2b450 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2b460 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20  Agg = (i16)k;.  
2b470 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2b480 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  .          } /* 
2b490 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61  endif pExpr->iTa
2b4a0 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
2b4b0 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  sor */.        }
2b4c0 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* end loop ove
2b4d0 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  r pSrcList */.  
2b4e0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2b4f0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2b500 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
2b510 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
2b520 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e        if( (pNC->
2b530 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41  ncFlags & NC_InA
2b540 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20  ggFunc)==0.     
2b550 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61    && pWalker->wa
2b560 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72  lkerDepth==pExpr
2b570 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20  ->op2.      ){. 
2b580 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
2b590 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
2b5a0 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
2b5b0 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
2b5c0 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
2b5d0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
2b5e0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
2b5f0 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
2b600 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
2b610 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
2b620 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
2b630 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
2b640 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
2b650 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
2b660 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
2b670 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
2b680 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2b690 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70  Compare(pItem->p
2b6a0 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29  Expr, pExpr, -1)
2b6b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2b6c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b6d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2b6e0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
2b6f0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
2b700 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
2b710 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
2b720 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
2b730 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
2b740 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
2b750 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2b760 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
2b770 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
2b780 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
2b790 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64  foFunc(pParse->d
2b7a0 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  b, pAggInfo);.  
2b7b0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
2b7c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b7d0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2b7e0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2b7f0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2b800 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
2b810 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
2b820 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
2b830 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
2b840 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
2b850 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
2b860 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
2b870 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
2b880 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2b890 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2b8a0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
2b8b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
2b8c0 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
2b8d0 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
2b8e0 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
2b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b900 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
2b910 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2b920 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c       pExpr->x.pL
2b930 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ist ? pExpr->x.p
2b940 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
2b950 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
2b960 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2b970 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
2b980 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
2b990 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
2b9a0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
2b9b0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
2b9c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b9d0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2b9e0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
2b9f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2ba00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ba10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
2ba20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
2ba30 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
2ba40 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
2ba50 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
2ba60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
2ba70 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2ba80 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2ba90 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
2baa0 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
2bab0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2bac0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2bad0 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
2bae0 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
2baf0 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
2bb00 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
2bb10 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
2bb20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2bb30 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Prune;.      }el
2bb40 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
2bb50 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2bb60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2bb70 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
2bb80 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
2bb90 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
2bba0 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
2bbb0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2bbc0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2bbd0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2bbe0 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b  AMETER(pWalker);
2bbf0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2bc00 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  TER(pSelect);.  
2bc10 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2bc20 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  nue;.}../*.** An
2bc30 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20  alyze the pExpr 
2bc40 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
2bc50 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
2bc60 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
2bc70 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
2bc80 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
2bc90 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f  added to AggInfo
2bca0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43   object that pNC
2bcb0 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f  ->pAggInfo.** po
2bcc0 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69  ints to.  Additi
2bcd0 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65  onal entries are
2bce0 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67   made on the Agg
2bcf0 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a  Info object as.*
2bd00 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  * necessary..**.
2bd10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2bd20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2bd30 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
2bd40 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
2bd50 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
2bd60 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  by sqlite3Resolv
2bd70 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f  eExprNames()..*/
2bd80 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2bd90 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2bda0 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  es(NameContext *
2bdb0 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pNC, Expr *pExpr
2bdc0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
2bdd0 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
2bde0 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
2bdf0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61  ExprCallback = a
2be00 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b  nalyzeAggregate;
2be10 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2be20 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
2be30 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
2be40 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
2be50 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  C;.  assert( pNC
2be60 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
2be70 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2be80 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
2be90 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
2bea0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2beb0 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
2bec0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
2bed0 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
2bee0 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
2bef0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2bf00 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
2bf10 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
2bf20 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
2bf30 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
2bf40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2bf50 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2bf60 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  t(NameContext *p
2bf70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  NC, ExprList *pL
2bf80 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45  ist){.  struct E
2bf90 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
2bfa0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
2bfb0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
2bfc0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
2bfd0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
2bfe0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
2bff0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
2c000 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2c010 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
2c020 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
2c030 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2c040 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69  ** Allocate a si
2c050 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65  ngle new registe
2c060 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c  r for use to hol
2c070 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69  d some intermedi
2c080 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69  ate result..*/.i
2c090 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2c0a0 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
2c0b0 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
2c0c0 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29  e->nTempReg==0 )
2c0d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70  {.    return ++p
2c0e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
2c0f0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
2c100 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61  ->aTempReg[--pPa
2c110 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a  rse->nTempReg];.
2c120 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
2c130 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20  ate a register, 
2c140 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65  making available
2c150 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73   for reuse for s
2c160 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72  ome other.** pur
2c170 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  pose..**.** If a
2c180 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72   register is cur
2c190 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65  rently being use
2c1a0 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d by the column 
2c1b0 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  cache, then.** t
2c1c0 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  he deallocation 
2c1d0 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
2c1e0 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  l the column cac
2c1f0 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65  he line that use
2c200 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  s.** the registe
2c210 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e  r becomes stale.
2c220 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2c230 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
2c240 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2c250 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
2c260 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
2c270 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
2c280 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
2c290 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eg) ){.    int i
2c2a0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f  ;.    struct yCo
2c2b0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66  lCache *p;.    f
2c2c0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
2c2d0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70  ->aColCache; i<p
2c2e0 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
2c2f0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
2c300 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
2c310 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iReg ){.        
2c320 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a  p->tempReg = 1;.
2c330 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
2c340 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c350 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
2c360 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
2c370 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
2c380 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
2c390 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
2c3a0 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
2c3b0 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
2c3c0 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74  egisters..*/.int
2c3d0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2c3e0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
2c3f0 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  se, int nReg){. 
2c400 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28   int i, n;.  if(
2c410 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74 75 72   nReg==1 ) retur
2c420 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  n sqlite3GetTemp
2c430 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
2c440 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67   = pParse->iRang
2c450 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72  eReg;.  n = pPar
2c460 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20  se->nRangeReg;. 
2c470 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a   if( nReg<=n ){.
2c480 20 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65      assert( !use
2c490 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
2c4a0 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29  Parse, i, i+n-1)
2c4b0 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
2c4c0 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65  iRangeReg += nRe
2c4d0 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  g;.    pParse->n
2c4e0 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67  RangeReg -= nReg
2c4f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2c500 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
2c510 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
2c520 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d  Mem += nReg;.  }
2c530 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76  .  return i;.}.v
2c540 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
2c550 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  seTempRange(Pars
2c560 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
2c570 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
2c580 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b    if( nReg==1 ){
2c590 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
2c5a0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
2c5b0 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65  e, iReg);.    re
2c5c0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
2c5d0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
2c5e0 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ve(pParse, iReg,
2c5f0 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52   nReg);.  if( nR
2c600 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
2c610 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
2c620 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
2c630 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
2c640 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
2c650 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
2c660 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
2c670 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
2c680 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
2c690 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  le for reuse..*/
2c6a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65  .void sqlite3Cle
2c6b0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50  arTempRegCache(P
2c6c0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
2c6d0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2c6e0 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
2c6f0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
2c700 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74  }../*.** Validat
2c710 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72  e that no tempor
2c720 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c  ary register fal
2c730 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  ls within the ra
2c740 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74  nge of.** iFirst
2c750 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69  ..iLast, inclusi
2c760 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ve.  This routin
2c770 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66  e is only call f
2c780 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72  rom within asser
2c790 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
2c7a0 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
2c7b0 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71  ITE_DEBUG.int sq
2c7c0 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61  lite3NoTempsInRa
2c7d0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2c7e0 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69  e, int iFirst, i
2c7f0 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74  nt iLast){.  int
2c800 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   i;.  if( pParse
2c810 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20  ->nRangeReg>0.  
2c820 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e   && pParse->iRan
2c830 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52  geReg+pParse->nR
2c840 61 6e 67 65 52 65 67 3c 69 4c 61 73 74 0a 20 20  angeReg<iLast.  
2c850 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e   && pParse->iRan
2c860 67 65 52 65 67 3e 3d 69 46 69 72 73 74 0a 20 20  geReg>=iFirst.  
2c870 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
2c880 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
2c890 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70   i<pParse->nTemp
2c8a0 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Reg; i++){.    i
2c8b0 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  f( pParse->aTemp
2c8c0 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26  Reg[i]>=iFirst &
2c8d0 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  & pParse->aTempR
2c8e0 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a  eg[i]<=iLast ){.
2c8f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2c900 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2c910 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
2c920 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
2c930 2f 0a                                            /.