/ Hex Artifact Content
Login

Artifact 18ce84bab19ef59eff99a54d83ebefd28dc10d17e617f35c730ff7c8bc2b6ee7:


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 79 2e 70 54 61 62 20 29 7b 0a 20  xpr->y.pTab ){. 
07f0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
0800: 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69  3TableColumnAffi
0810: 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54  nity(pExpr->y.pT
0820: 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ab, pExpr->iColu
0830: 6d 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  mn);.  }.  if( o
0840: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
0850: 55 4d 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  UMN ){.    asser
0860: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  t( pExpr->pLeft-
0870: 3e 66 6c 61 67 73 26 45 50 5f 78 49 73 53 65 6c  >flags&EP_xIsSel
0880: 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ect );.    retur
0890: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  n sqlite3ExprAff
08a0: 69 6e 69 74 79 28 0a 20 20 20 20 20 20 20 20 70  inity(.        p
08b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70  Expr->pLeft->x.p
08c0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
08d0: 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
08e0: 5d 2e 70 45 78 70 72 0a 20 20 20 20 29 3b 0a 20  ].pExpr.    );. 
08f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
0900: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
0910: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
0920: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0930: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
0940: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
0950: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
0960: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0970: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0980: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
0990: 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74 68 61  ew Expr node tha
09a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  t.** implements 
09b0: 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  the COLLATE oper
09c0: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
09d0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
09e0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
09f0: 20 74 68 61 74 20 66 61 63 74 20 69 73 20 72 65   that fact is re
0a00: 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72 73 65  corded in pParse
0a10: 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ->db.** and the 
0a20: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
0a30: 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e 63 68  is returned unch
0a40: 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  anged..*/.Expr *
0a50: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0a60: 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50 61  llateToken(.  Pa
0a70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
0a80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
0a90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
0aa0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
0ab0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
0ac0: 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61  he "COLLATE" cla
0ad0: 75 73 65 20 74 6f 20 74 68 69 73 20 65 78 70 72  use to this expr
0ae0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ession */.  cons
0af0: 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61  t Token *pCollNa
0b00: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
0b10: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0b20: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ce */.  int dequ
0b30: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
0b40: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75   /* True to dequ
0b50: 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f  ote pCollName */
0b60: 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e  .){.  if( pCollN
0b70: 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  ame->n>0 ){.    
0b80: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
0b90: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
0ba0: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c  arse->db, TK_COL
0bb0: 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c  LATE, pCollName,
0bc0: 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20 20 69   dequote);.    i
0bd0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
0be0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
0bf0: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
0c00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f  ->flags |= EP_Co
0c10: 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20  llate|EP_Skip;. 
0c20: 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
0c30: 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  w;.    }.  }.  r
0c40: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45  eturn pExpr;.}.E
0c50: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
0c60: 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
0c70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0c80: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e  Expr *pExpr, con
0c90: 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20  st char *zC){.  
0ca0: 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65 72  Token s;.  asser
0cb0: 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73 71  t( zC!=0 );.  sq
0cc0: 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
0cd0: 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a 20  s, (char*)zC);. 
0ce0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
0cf0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0d00: 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
0d10: 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  , &s, 0);.}../*.
0d20: 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79  ** Skip over any
0d30: 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72   TK_COLLATE oper
0d40: 61 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e  ators and any un
0d50: 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c  likely().** or l
0d60: 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63  ikelihood() func
0d70: 74 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74  tion at the root
0d80: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
0d90: 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  n..*/.Expr *sqli
0da0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
0db0: 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  te(Expr *pExpr){
0dc0: 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72 20  .  while( pExpr 
0dd0: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
0de0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69  ty(pExpr, EP_Ski
0df0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78  p) ){.    if( Ex
0e00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0e10: 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79  xpr, EP_Unlikely
0e20: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
0e30: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
0e40: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
0e50: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
0e60: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0e70: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  >x.pList->nExpr>
0e80: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
0e90: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
0ea0: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
0eb0: 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
0ec0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
0ed0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
0ee0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
0ef0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
0f00: 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70  LLATE );.      p
0f10: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Expr = pExpr->pL
0f20: 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  eft;.    }.  }  
0f30: 20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72   .  return pExpr
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0f50: 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  n the collation 
0f60: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
0f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0f80: 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69  r. If.** there i
0f90: 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c  s no defined col
0fa0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c  lating sequence,
0fb0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
0fc0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
0fd0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
0fe0: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
0ff0: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
1000: 53 65 71 28 29 20 77 6f 72 6b 73 20 74 68 65 20  Seq() works the 
1010: 73 61 6d 65 20 65 78 61 63 74 20 74 68 61 74 20  same exact that 
1020: 69 74 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  it returns the.*
1030: 2a 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  * default collat
1040: 69 6f 6e 20 69 66 20 70 45 78 70 72 20 68 61 73  ion if pExpr has
1050: 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c   no defined coll
1060: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
1070: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1080: 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74  nce might be det
1090: 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c  ermined by a COL
10a0: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  LATE operator.**
10b0: 20 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65   or by the prese
10c0: 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  nce of a column 
10d0: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63  with a defined c
10e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10f0: 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70  e..** COLLATE op
1100: 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72  erators take fir
1110: 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20  st precedence.  
1120: 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61  Left operands ta
1130: 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65  ke.** precedence
1140: 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72   over right oper
1150: 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  ands..*/.CollSeq
1160: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c   *sqlite3ExprCol
1170: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
1180: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
1190: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
11a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
11c0: 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20   0;.  Expr *p = 
11d0: 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20  pExpr;.  while( 
11e0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  p ){.    int op 
11f0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28  = p->op;.    if(
1200: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47   p->flags & EP_G
1210: 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a  eneric ) break;.
1220: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52      if( op==TK_R
1230: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
1240: 2d 3e 6f 70 32 3b 0a 20 20 20 20 69 66 28 20 28  ->op2;.    if( (
1250: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1260: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1270: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49  MN || op==TK_TRI
1280: 47 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d  GGER).     && p-
1290: 3e 79 2e 70 54 61 62 21 3d 30 0a 20 20 20 20 29  >y.pTab!=0.    )
12a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54  {.      /* op==T
12b0: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
12c0: 3e 79 2e 70 54 61 62 21 3d 30 20 68 61 70 70 65  >y.pTab!=0 happe
12d0: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
12e0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
12f0: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1300: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1310: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1320: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1330: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1340: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1350: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1360: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1370: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1380: 20 3d 20 70 2d 3e 79 2e 70 54 61 62 2d 3e 61 43   = p->y.pTab->aC
1390: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
13a0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
13b0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
13c0: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
13d0: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ll, 0);.      }.
13e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13f0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
1400: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1410: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
1420: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1430: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1440: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
1450: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
1460: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1470: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
1480: 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30  arse, ENC(db), 0
1490: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
14a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14b0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c   }.    if( p->fl
14c0: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
14d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
14e0: 3e 70 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c  >pLeft && (p->pL
14f0: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
1500: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
1510: 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c         p = p->pL
1520: 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eft;.      }else
1530: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1540: 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67  pNext  = p->pRig
1550: 68 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  ht;.        /* T
1560: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
1570: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
1580: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
1590: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
15a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15b0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
15c0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
15d0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e  ;.        /* p->
15e0: 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43  flags holds EP_C
15f0: 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c  ollate and p->pL
1600: 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20  eft->flags does 
1610: 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20  not.  And.      
1620: 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63    ** p->x.pSelec
1630: 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66  t cannot.  So if
1640: 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73   p->x.pLeft exis
1650: 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64  ts, it must hold
1660: 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c   at.        ** l
1670: 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c  east one EP_Coll
1680: 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f  ate. Thus the fo
1690: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41  llowing two ALWA
16a0: 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  YS. */.        i
16b0: 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  f( p->x.pList!=0
16c0: 20 26 26 20 41 4c 57 41 59 53 28 21 45 78 70 72   && ALWAYS(!Expr
16d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
16e0: 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b  P_xIsSelect)) ){
16f0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1700: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1710: 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d  i=0; ALWAYS(i<p-
1720: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
1730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1740: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1750: 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69  roperty(p->x.pLi
1760: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1770: 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  EP_Collate) ){. 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
1790: 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d  xt = p->x.pList-
17a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
17b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
17c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
17d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20      }.        p 
17f0: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  = pNext;.      }
1800: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1820: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1830: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
1840: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a  rse, pColl) ){ .
1850: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
1860: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
1870: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
1880: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
1890: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
18a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
18b0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
18c0: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
18d0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18e0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
18f0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 65 66  er to the.** def
1900: 61 75 74 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  autl collation s
1910: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 53  equence..**.** S
1920: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
1930: 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 0a 2a 2a  ExprCollSeq().**
1940: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
1950: 78 70 72 43 6f 6c 6c 53 65 71 28 29 20 72 6f 75  xprCollSeq() rou
1960: 74 69 6e 65 20 77 6f 72 6b 73 20 74 68 65 20 73  tine works the s
1970: 61 6d 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ame except that 
1980: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  it.** returns NU
1990: 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
19a0: 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  o defined collat
19b0: 69 6f 6e 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  ion..*/.CollSeq 
19c0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f  *sqlite3ExprNNCo
19d0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
19e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
19f0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20  ){.  CollSeq *p 
1a00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1a10: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
1a20: 70 72 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  pr);.  if( p==0 
1a30: 29 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ) p = pParse->db
1a40: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 61  ->pDfltColl;.  a
1a50: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1a60: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1a70: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1a80: 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
1a90: 73 73 69 6f 6e 73 20 68 61 76 65 20 65 71 75 69  ssions have equi
1aa0: 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  valent collating
1ab0: 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 69   sequences..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1ad0: 6c 6c 53 65 71 4d 61 74 63 68 28 50 61 72 73 65  llSeqMatch(Parse
1ae0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1af0: 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 29 7b  pE1, Expr *pE2){
1b00: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1b10: 6c 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  l1 = sqlite3Expr
1b20: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
1b30: 2c 20 70 45 31 29 3b 0a 20 20 43 6f 6c 6c 53 65  , pE1);.  CollSe
1b40: 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69  q *pColl2 = sqli
1b50: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b60: 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20  (pParse, pE2);. 
1b70: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
1b80: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 31 2d 3e 7a  trICmp(pColl1->z
1b90: 4e 61 6d 65 2c 20 70 43 6f 6c 6c 32 2d 3e 7a 4e  Name, pColl2->zN
1ba0: 61 6d 65 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame)==0;.}../*.*
1bb0: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
1bc0: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
1bd0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
1be0: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
1bf0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
1c00: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
1c10: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1c20: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
1c30: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1c40: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1c50: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
1c60: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
1c70: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
1c80: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
1c90: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1ca0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
1cb0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
1cc0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
1cd0: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
1ce0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
1cf0: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
1d00: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
1d10: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
1d20: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
1d30: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
1d40: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
1d50: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
1d60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d70: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1d80: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
1d90: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
1da0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1db0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1dc0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1dd0: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1de0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1df0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1e00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1e10: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
1e20: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
1e30: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
1e40: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
1e50: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
1e60: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1e70: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
1e80: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1e90: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1eb0: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
1ec0: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
1ed0: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1ee0: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1ef0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1f00: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
1f10: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1f20: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
1f30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
1f40: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
1f50: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
1f60: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
1f70: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1f80: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
1f90: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
1fa0: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
1fb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
1fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1fd0: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1fe0: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1ff0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
2000: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
2010: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
2020: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
2030: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
2040: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
2050: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
2060: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
2070: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
2080: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
2090: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
20a0: 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _NE || pExpr->op
20b0: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
20c0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
20d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
20e0: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
20f0: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
2100: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
2110: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
2120: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
2130: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
2140: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
2150: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
2160: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
2170: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2180: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2190: 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66 66 20  ect) ){.    aff 
21a0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
21b0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
21c0: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
21d0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
21e0: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
21f0: 20 61 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61   aff==0 ){.    a
2200: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
2210: 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BLOB;.  }.  retu
2220: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
2230: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
2240: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
2250: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
2260: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
2270: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
2280: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
2290: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
22a0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
22b0: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
22c0: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
22d0: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
22e0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
22f0: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
2300: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
2310: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
2320: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
2330: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
2340: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
2350: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
2360: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
2370: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
2380: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
2390: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
23a0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
23b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
23c0: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
23d0: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
23e0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
23f0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
2400: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
2410: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
2420: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
2430: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
2440: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2450: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
2460: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
2470: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
2480: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
2490: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
24a0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
24b0: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
24c0: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
24d0: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
24e0: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
24f0: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
2500: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
2510: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
2520: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
2530: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
2540: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
2550: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
2560: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
2570: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
2580: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
25b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
25c0: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
25d0: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
25e0: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
25f0: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
2600: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
2610: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
2620: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
2630: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
2640: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2650: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
2660: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
2670: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
2680: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
2690: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
26a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
26b0: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
26c0: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
26d0: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
26e0: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
26f0: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
2700: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
2710: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
2720: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
2730: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
2740: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
2750: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
2760: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
2770: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
2780: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
2790: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
27a0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
27b0: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
27c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
27d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
27e0: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
27f0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
2800: 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ate ){.    pColl
2810: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2820: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2830: 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  eft);.  }else if
2840: 28 20 70 52 69 67 68 74 20 26 26 20 28 70 52 69  ( pRight && (pRi
2850: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2860: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
2870: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2880: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2890: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
28a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
28b0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
28c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
28d0: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
28e0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
28f0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2900: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
2910: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
2920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
2930: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
2940: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2950: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
2960: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
2970: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
2980: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2990: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
29a0: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
29b0: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
29c0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
29d0: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
29e0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
29f0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2a00: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2a10: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
2a20: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
2a30: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
2a40: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
2a50: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
2a60: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
2a70: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
2a80: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
2a90: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
2aa0: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
2ab0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
2ac0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
2ad0: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
2ae0: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
2af0: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
2b00: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
2b10: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
2b20: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
2b30: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2b40: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
2b50: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
2b60: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
2b70: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
2b80: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
2b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ba0: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
2bb0: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
2bc0: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
2bf0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
2c00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2c10: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
2c20: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
2c30: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2c40: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2c50: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
2c60: 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20  pr is a vector, 
2c70: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2c80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74  se..**.** A vect
2c90: 6f 72 20 69 73 20 64 65 66 69 6e 65 64 20 61 73  or is defined as
2ca0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
2cb0: 74 68 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20  that results in 
2cc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  two or more.** c
2cd0: 6f 6c 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74  olumns of result
2ce0: 2e 20 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54  .  Every TK_VECT
2cf0: 4f 52 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65  OR node is an ve
2d00: 63 74 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  ctor because the
2d10: 0a 2a 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20  .** parser will 
2d20: 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20 54  not generate a T
2d30: 4b 5f 56 45 43 54 4f 52 20 77 69 74 68 20 66 65  K_VECTOR with fe
2d40: 77 65 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74  wer than two ent
2d50: 72 69 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54  ries..** But a T
2d60: 4b 5f 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62  K_SELECT might b
2d70: 65 20 65 69 74 68 65 72 20 61 20 76 65 63 74 6f  e either a vecto
2d80: 72 20 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49  r or a scalar. I
2d90: 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e  t is only.** con
2da0: 73 69 64 65 72 65 64 20 61 20 76 65 63 74 6f 72  sidered a vector
2db0: 20 69 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f   if it has two o
2dc0: 72 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f  r more result co
2dd0: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lumns..*/.int sq
2de0: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2df0: 72 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  r(Expr *pExpr){.
2e00: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2e10: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
2e20: 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  Expr)>1;.}../*.*
2e30: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
2e40: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
2e50: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
2e60: 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45  is of type TK_VE
2e70: 43 54 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20  CTOR .** return 
2e80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78  the number of ex
2e90: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
2ea0: 20 76 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20   vector. Or, if 
2eb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
2ec0: 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
2ed0: 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  t, return the nu
2ee0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
2ef0: 69 6e 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  in the sub-selec
2f00: 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74  t. For.** any ot
2f10: 68 65 72 20 74 79 70 65 20 6f 66 20 65 78 70 72  her type of expr
2f20: 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31  ession, return 1
2f30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2f40: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45  ExprVectorSize(E
2f50: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75  xpr *pExpr){.  u
2f60: 38 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70  8 op = pExpr->op
2f70: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
2f80: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
2f90: 45 78 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28  Expr->op2;.  if(
2fa0: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29   op==TK_VECTOR )
2fb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  {.    return pEx
2fc0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
2fd0: 70 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pr;.  }else if( 
2fe0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
2ff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70  .    return pExp
3000: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
3010: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
3020: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
3030: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
3040: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
3050: 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65 73  r to a subexpres
3060: 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72 20  sion of pVector 
3070: 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74 68  that is the i-th
3080: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  .** column of th
3090: 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65 72  e vector (number
30a0: 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  ed starting with
30b0: 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65 72   0).  The caller
30c0: 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65 20   must.** ensure 
30d0: 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69 6e  that i is within
30e0: 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   range..**.** If
30f0: 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61 6c   pVector is real
3100: 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e 64  ly a scalar (and
3110: 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20 69   "scalar" here i
3120: 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72 69  ncludes subqueri
3130: 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75 72  es.** that retur
3140: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
3150: 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e 20  n!) then return 
3160: 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66 69  pVector unmodifi
3170: 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74 6f  ed..**.** pVecto
3180: 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73  r retains owners
3190: 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75 72  hip of the retur
31a0: 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69 6f  ned subexpressio
31b0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
31c0: 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45 4c  vector is a (SEL
31d0: 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74 68  ECT ...) then th
31e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74  e expression ret
31f0: 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73 74  urned is.** just
3200: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3210: 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65 72  for the i-th ter
3220: 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
3230: 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a 20  set, and may.** 
3240: 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f 72  not be ready for
3250: 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63 61   evaluation beca
3260: 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63 75  use the table cu
3270: 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65 74  rsor has not yet
3280: 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69 6f  .** been positio
3290: 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ned..*/.Expr *sq
32a0: 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
32b0: 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70 56  Subexpr(Expr *pV
32c0: 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a 20  ector, int i){. 
32d0: 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69 74   assert( i<sqlit
32e0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
32f0: 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20 69  (pVector) );.  i
3300: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
3310: 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29 20  Vector(pVector) 
3320: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3330: 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 30 20 7c  Vector->op2==0 |
3340: 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  | pVector->op==T
3350: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
3360: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3370: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c 7c 20  p==TK_SELECT || 
3380: 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 54 4b  pVector->op2==TK
3390: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
33a0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
33b0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
33c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
33d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33e0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
33f0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
3400: 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Expr;.    }.  }.
3410: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
3420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
3430: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
3440: 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74 20  new Expr object 
3450: 77 68 69 63 68 20 77 68 65 6e 20 70 61 73 73 65  which when passe
3460: 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45  d to.** sqlite3E
3470: 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c 20 67  xprCode() will g
3480: 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65 63 65  enerate all nece
3490: 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20 63 6f  ssary code to co
34a0: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69 46 69  mpute.** the iFi
34b0: 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  eld-th column of
34c0: 20 74 68 65 20 76 65 63 74 6f 72 20 65 78 70 72   the vector expr
34d0: 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a  ession pVector..
34e0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66  **.** It is ok f
34f0: 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  or pVector to be
3500: 20 61 20 73 63 61 6c 61 72 20 28 61 73 20 6c 6f   a scalar (as lo
3510: 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d 30 29  ng as iField==0)
3520: 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  .  .** In that c
3530: 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
3540: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  e works like sql
3550: 69 74 65 33 45 78 70 72 44 75 70 28 29 2e 0a 2a  ite3ExprDup()..*
3560: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
3570: 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72 6e 65  owns the returne
3580: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  d Expr object an
3590: 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  d is responsible
35a0: 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67   for.** ensuring
35b0: 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
35c0: 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74 75 61  ed value eventua
35d0: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
35e0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
35f0: 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73 68   retains ownersh
3600: 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e 20 20  ip of pVector.  
3610: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
3620: 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68  TK_SELECT,.** th
3630: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  en the returned 
3640: 6f 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 66 65  object will refe
3650: 72 65 6e 63 65 20 70 56 65 63 74 6f 72 20 61 6e  rence pVector an
3660: 64 20 73 6f 20 70 56 65 63 74 6f 72 20 6d 75 73  d so pVector mus
3670: 74 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69  t remain.** vali
3680: 64 20 66 6f 72 20 74 68 65 20 6c 69 66 65 20 6f  d for the life o
3690: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f  f the returned o
36a0: 62 6a 65 63 74 2e 20 20 49 66 20 70 56 65 63 74  bject.  If pVect
36b0: 6f 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54 4f  or is a TK_VECTO
36c0: 52 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61 72  R.** or a scalar
36d0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
36e0: 6e 20 69 74 20 63 61 6e 20 62 65 20 64 65 6c 65  n it can be dele
36f0: 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ted as soon as t
3700: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
3710: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  eturns..**.** A 
3720: 74 72 69 63 6b 20 74 6f 20 63 61 75 73 65 20 61  trick to cause a
3730: 20 54 4b 5f 53 45 4c 45 43 54 20 70 56 65 63 74   TK_SELECT pVect
3740: 6f 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  or to be deleted
3750: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a   together with.*
3760: 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45  * the returned E
3770: 78 70 72 20 6f 62 6a 65 63 74 20 69 73 20 74 6f  xpr object is to
3780: 20 61 74 74 61 63 68 20 74 68 65 20 70 56 65 63   attach the pVec
3790: 74 6f 72 20 74 6f 20 74 68 65 20 70 52 69 67 68  tor to the pRigh
37a0: 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68  t field.** of th
37b0: 65 20 72 65 74 75 72 6e 65 64 20 54 4b 5f 53 45  e returned TK_SE
37c0: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72  LECT_COLUMN Expr
37d0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72   object..*/.Expr
37e0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72   *sqlite3ExprFor
37f0: 56 65 63 74 6f 72 46 69 65 6c 64 28 0a 20 20 50  VectorField(.  P
3800: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3810: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
3820: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
3830: 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20   *pVector,      
3840: 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 2e 20   /* The vector. 
3850: 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   List of express
3860: 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d 53 45  ions or a sub-SE
3870: 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46  LECT */.  int iF
3880: 69 65 6c 64 20 20 20 20 20 20 20 20 20 20 20 2f  ield           /
3890: 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f  * Which column o
38a0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 74 6f 20  f the vector to 
38b0: 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45  return */.){.  E
38c0: 78 70 72 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  xpr *pRet;.  if(
38d0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
38e0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 61  _SELECT ){.    a
38f0: 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e  ssert( pVector->
3900: 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
3910: 6c 65 63 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  lect );.    /* T
3920: 68 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  he TK_SELECT_COL
3930: 55 4d 4e 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20  UMN Expr node:. 
3940: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65     **.    ** pLe
3950: 66 74 3a 20 20 20 20 20 20 20 20 20 20 20 70 56  ft:           pV
3960: 65 63 74 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ector containing
3970: 20 54 4b 5f 53 45 4c 45 43 54 2e 20 20 4e 6f 74   TK_SELECT.  Not
3980: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a   deleted..    **
3990: 20 70 52 69 67 68 74 3a 20 20 20 20 20 20 20 20   pRight:        
39a0: 20 20 6e 6f 74 20 75 73 65 64 2e 20 20 42 75 74    not used.  But
39b0: 20 72 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   recursively del
39c0: 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f  eted..    ** iCo
39d0: 6c 75 6d 6e 3a 20 20 20 20 20 20 20 20 20 49 6e  lumn:         In
39e0: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
39f0: 69 6e 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a  in pVector.    *
3a00: 2a 20 69 54 61 62 6c 65 3a 20 20 20 20 20 20 20  * iTable:       
3a10: 20 20 20 30 20 6f 72 20 74 68 65 20 6e 75 6d 62     0 or the numb
3a20: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e  er of columns on
3a30: 20 74 68 65 20 4c 48 53 20 6f 66 20 61 6e 20 61   the LHS of an a
3a40: 73 73 69 67 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a  ssignment.    **
3a50: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20   pLeft->iTable: 
3a60: 20 20 46 69 72 73 74 20 69 6e 20 61 6e 20 61 72    First in an ar
3a70: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 20  ray of register 
3a80: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c 20  holding result, 
3a90: 6f 72 20 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  or 0.    **     
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3ab0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
3ac0: 74 20 79 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a  t yet computed..
3ad0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71      **.    ** sq
3ae0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3af0: 29 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20 73  ) specifically s
3b00: 6b 69 70 73 20 74 68 65 20 72 65 63 75 72 73 69  kips the recursi
3b10: 76 65 20 64 65 6c 65 74 65 20 6f 66 0a 20 20 20  ve delete of.   
3b20: 20 2a 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f   ** pLeft on TK_
3b30: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f  SELECT_COLUMN no
3b40: 64 65 73 2e 20 20 42 75 74 20 70 52 69 67 68 74  des.  But pRight
3b50: 20 69 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f   is followed, so
3b60: 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20   pVector.    ** 
3b70: 63 61 6e 20 62 65 20 61 74 74 61 63 68 65 64 20  can be attached 
3b80: 74 6f 20 70 52 69 67 68 74 20 74 6f 20 63 61 75  to pRight to cau
3b90: 73 65 20 74 68 69 73 20 6e 6f 64 65 20 74 6f 20  se this node to 
3ba0: 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f  take ownership o
3bb0: 66 0a 20 20 20 20 2a 2a 20 70 56 65 63 74 6f 72  f.    ** pVector
3bc0: 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65  .  Typically the
3bd0: 72 65 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69  re will be multi
3be0: 70 6c 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  ple TK_SELECT_CO
3bf0: 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a  LUMN nodes.    *
3c00: 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
3c10: 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 20 74 6f  pLeft pointer to
3c20: 20 74 68 65 20 70 56 65 63 74 6f 72 2c 20 62 75   the pVector, bu
3c30: 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68  t only one of th
3c40: 65 6d 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f  em.    ** will o
3c50: 77 6e 20 74 68 65 20 70 56 65 63 74 6f 72 2e 0a  wn the pVector..
3c60: 20 20 20 20 2a 2f 0a 20 20 20 20 70 52 65 74 20      */.    pRet 
3c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
3c80: 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54  Parse, TK_SELECT
3c90: 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a  _COLUMN, 0, 0);.
3ca0: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
3cb0: 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f 6c        pRet->iCol
3cc0: 75 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20  umn = iField;.  
3cd0: 20 20 20 20 70 52 65 74 2d 3e 70 4c 65 66 74 20      pRet->pLeft 
3ce0: 3d 20 70 56 65 63 74 6f 72 3b 0a 20 20 20 20 7d  = pVector;.    }
3cf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
3d00: 74 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54  t==0 || pRet->iT
3d10: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  able==0 );.  }el
3d20: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 56 65 63  se{.    if( pVec
3d30: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54  tor->op==TK_VECT
3d40: 4f 52 20 29 20 70 56 65 63 74 6f 72 20 3d 20 70  OR ) pVector = p
3d50: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3d60: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
3d70: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
3d80: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
3d90: 73 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72 2c  se->db, pVector,
3da0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
3db0: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
3dc0: 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   If expression p
3dd0: 45 78 70 72 20 69 73 20 6f 66 20 74 79 70 65 20  Expr is of type 
3de0: 54 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e 65 72  TK_SELECT, gener
3df0: 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
3e00: 75 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65 74 75  uate.** it. Retu
3e10: 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
3e20: 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73  in which the res
3e30: 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 28 6f  ult is stored (o
3e40: 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75  r, if the .** su
3e50: 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
3e60: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
3e70: 6f 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72 73 74  olumn, the first
3e80: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2a 20   in an array.** 
3e90: 6f 66 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  of registers in 
3ea0: 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c 74  which the result
3eb0: 20 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a 2a 0a   is stored)..**.
3ec0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 6e  ** If pExpr is n
3ed0: 6f 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65  ot a TK_SELECT e
3ee0: 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72  xpression, retur
3ef0: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
3f00: 6e 74 20 65 78 70 72 43 6f 64 65 53 75 62 73 65  nt exprCodeSubse
3f10: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
3f20: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
3f30: 7b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 30 3b  {.  int reg = 0;
3f40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3f50: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
3f60: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
3f70: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
3f80: 72 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  reg = sqlite3Cod
3f90: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
3fa0: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 23  e, pExpr);.  }.#
3fb0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
3fc0: 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  eg;.}../*.** Arg
3fd0: 75 6d 65 6e 74 20 70 56 65 63 74 6f 72 20 70 6f  ument pVector po
3fe0: 69 6e 74 73 20 74 6f 20 61 20 76 65 63 74 6f 72  ints to a vector
3ff0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2d 20 65 69   expression - ei
4000: 74 68 65 72 20 61 20 54 4b 5f 56 45 43 54 4f 52  ther a TK_VECTOR
4010: 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43 54  .** or TK_SELECT
4020: 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 6d 6f   that returns mo
4030: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
4040: 6d 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  mn. This functio
4050: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  n returns.** the
4060: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
4070: 20 6f 66 20 61 20 72 65 67 69 73 74 65 72 20 74   of a register t
4080: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
4090: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c 65   value of.** ele
40a0: 6d 65 6e 74 20 69 46 69 65 6c 64 20 6f 66 20 74  ment iField of t
40b0: 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  he vector..**.**
40c0: 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61   If pVector is a
40d0: 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65   TK_SELECT expre
40e0: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64 65  ssion, then code
40f0: 20 66 6f 72 20 69 74 20 6d 75 73 74 20 68 61 76   for it must hav
4100: 65 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  e .** already be
4110: 65 6e 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  en generated usi
4120: 6e 67 20 74 68 65 20 65 78 70 72 43 6f 64 65 53  ng the exprCodeS
4130: 75 62 73 65 6c 65 63 74 28 29 20 72 6f 75 74 69  ubselect() routi
4140: 6e 65 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ne. In this.** c
4150: 61 73 65 20 70 61 72 61 6d 65 74 65 72 20 72 65  ase parameter re
4160: 67 53 65 6c 65 63 74 20 73 68 6f 75 6c 64 20 62  gSelect should b
4170: 65 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  e the first in a
4180: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
4190: 74 65 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ters.** containi
41a0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
41b0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
41c0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65 63  . .**.** If pVec
41d0: 74 6f 72 20 69 73 20 6f 66 20 74 79 70 65 20 54  tor is of type T
41e0: 4b 5f 56 45 43 54 4f 52 2c 20 74 68 65 6e 20 63  K_VECTOR, then c
41f0: 6f 64 65 20 66 6f 72 20 74 68 65 20 72 65 71 75  ode for the requ
4200: 65 73 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20 69  ested field.** i
4210: 73 20 67 65 6e 65 72 61 74 65 64 2e 20 49 6e 20  s generated. In 
4220: 74 68 69 73 20 63 61 73 65 20 28 2a 70 52 65 67  this case (*pReg
4230: 46 72 65 65 29 20 6d 61 79 20 62 65 20 73 65 74  Free) may be set
4240: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
4250: 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
4260: 20 72 65 67 69 73 74 65 72 20 74 6f 20 62 65 20   register to be 
4270: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
4280: 6c 65 72 20 62 65 66 6f 72 65 20 72 65 74 75 72  ler before retur
4290: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  ning..**.** Befo
42a0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f 75  re returning, ou
42b0: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 28  tput parameter (
42c0: 2a 70 70 45 78 70 72 29 20 69 73 20 73 65 74 20  *ppExpr) is set 
42d0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  to point to the.
42e0: 2a 2a 20 45 78 70 72 20 6f 62 6a 65 63 74 20 63  ** Expr object c
42f0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
4300: 65 6c 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f 66  element iElem of
4310: 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a   the vector..*/.
4320: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 56  static int exprV
4330: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 0a 20  ectorRegister(. 
4340: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
4370: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65  t */.  Expr *pVe
4380: 63 74 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  ctor,           
4390: 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72         /* Vector
43a0: 20 74 6f 20 65 78 74 72 61 63 74 20 65 6c 65 6d   to extract elem
43b0: 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ent from */.  in
43c0: 74 20 69 46 69 65 6c 64 2c 20 20 20 20 20 20 20  t iField,       
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
43e0: 20 46 69 65 6c 64 20 74 6f 20 65 78 74 72 61 63   Field to extrac
43f0: 74 20 66 72 6f 6d 20 70 56 65 63 74 6f 72 20 2a  t from pVector *
4400: 2f 0a 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63  /.  int regSelec
4410: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
4420: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20      /* First in 
4430: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
4440: 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  rs */.  Expr **p
4450: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
4460: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
4470: 45 78 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d 65  Expression eleme
4480: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nt */.  int *pRe
4490: 67 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20  gFree           
44a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
44b0: 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f  Temp register to
44c0: 20 66 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75 38   free */.){.  u8
44d0: 20 6f 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e 6f   op = pVector->o
44e0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  p;.  assert( op=
44f0: 3d 54 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f 70  =TK_VECTOR || op
4500: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c  ==TK_REGISTER ||
4510: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
4520: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
4530: 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 2a  EGISTER ){.    *
4540: 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ppExpr = sqlite3
4550: 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78  VectorFieldSubex
4560: 70 72 28 70 56 65 63 74 6f 72 2c 20 69 46 69 65  pr(pVector, iFie
4570: 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ld);.    return 
4580: 70 56 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65 2b  pVector->iTable+
4590: 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69 66  iField;.  }.  if
45a0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
45b0: 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20 3d  ){.    *ppExpr =
45c0: 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c   pVector->x.pSel
45d0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  ect->pEList->a[i
45e0: 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20  Field].pExpr;.  
45f0: 20 20 20 72 65 74 75 72 6e 20 72 65 67 53 65 6c     return regSel
4600: 65 63 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a  ect+iField;.  }.
4610: 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63    *ppExpr = pVec
4620: 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  tor->x.pList->a[
4630: 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20  iField].pExpr;. 
4640: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
4650: 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
4660: 73 65 2c 20 2a 70 70 45 78 70 72 2c 20 70 52 65  se, *ppExpr, pRe
4670: 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gFree);.}../*.**
4680: 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   Expression pExp
4690: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
46a0: 6e 20 62 65 74 77 65 65 6e 20 74 77 6f 20 76 65  n between two ve
46b0: 63 74 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f 6d  ctor values. Com
46c0: 70 75 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75  pute.** the resu
46d0: 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  lt of the compar
46e0: 69 73 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20 4e  ison (1, 0, or N
46f0: 55 4c 4c 29 20 61 6e 64 20 77 72 69 74 65 20 74  ULL) and write t
4700: 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  hat.** result in
4710: 74 6f 20 72 65 67 69 73 74 65 72 20 64 65 73 74  to register dest
4720: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
4730: 65 72 20 6d 75 73 74 20 73 61 74 69 73 66 79 20  er must satisfy 
4740: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  the following pr
4750: 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a  econditions:.**.
4760: 2a 2a 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e  **    if pExpr->
4770: 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20 20  op==TK_IS:      
4780: 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70 35  op==TK_EQ and p5
4790: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a  ==SQLITE_NULLEQ.
47a0: 2a 2a 20 20 20 20 69 66 20 70 45 78 70 72 2d 3e  **    if pExpr->
47b0: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20 20  op==TK_ISNOT:   
47c0: 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70 35  op==TK_NE and p5
47d0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a  ==SQLITE_NULLEQ.
47e0: 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65 3a  **    otherwise:
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61 6e  op==pExpr->op an
4810: 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69  d p5==0.*/.stati
4820: 63 20 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f  c void codeVecto
4830: 72 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  rCompare(.  Pars
4840: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
4850: 20 20 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72 61    /* Code genera
4860: 74 6f 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  tor context */. 
4870: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
4880: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
4890: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69  mparison operati
48a0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
48b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
48c0: 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 69   Write results i
48d0: 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65  nto this registe
48e0: 72 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20  r */.  u8 op,   
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4900: 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  Comparison opera
4910: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  tor */.  u8 p5  
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4930: 2a 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20  * SQLITE_NULLEQ 
4940: 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20  or zero */.){.  
4950: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
4960: 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20  ->pVdbe;.  Expr 
4970: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
4980: 70 4c 65 66 74 3b 0a 20 20 45 78 70 72 20 2a 70  pLeft;.  Expr *p
4990: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
49a0: 52 69 67 68 74 3b 0a 20 20 69 6e 74 20 6e 4c 65  Right;.  int nLe
49b0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
49c0: 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
49d0: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  );.  int i;.  in
49e0: 74 20 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20  t regLeft = 0;. 
49f0: 20 69 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20   int regRight = 
4a00: 30 3b 0a 20 20 75 38 20 6f 70 78 20 3d 20 6f 70  0;.  u8 opx = op
4a10: 3b 0a 20 20 69 6e 74 20 61 64 64 72 44 6f 6e 65  ;.  int addrDone
4a20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
4a30: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
4a40: 0a 0a 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 73  ..  if( nLeft!=s
4a50: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
4a60: 53 69 7a 65 28 70 52 69 67 68 74 29 20 29 7b 0a  Size(pRight) ){.
4a70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4a80: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
4a90: 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
4aa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
4ab0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  }.  assert( pExp
4ac0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
4ad0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
4ae0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70   .       || pExp
4af0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20  r->op==TK_IS || 
4b00: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4b10: 4e 4f 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  NOT .       || p
4b20: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
4b30: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4b40: 5f 47 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  _GT .       || p
4b50: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
4b60: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4b70: 5f 47 45 20 0a 20 20 29 3b 0a 20 20 61 73 73 65  _GE .  );.  asse
4b80: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f  rt( pExpr->op==o
4b90: 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d  p || (pExpr->op=
4ba0: 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d 54 4b  =TK_IS && op==TK
4bb0: 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20 20 20  _EQ).           
4bc0: 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d   || (pExpr->op==
4bd0: 54 4b 5f 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d  TK_ISNOT && op==
4be0: 54 4b 5f 4e 45 29 20 29 3b 0a 20 20 61 73 73 65  TK_NE) );.  asse
4bf0: 72 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78  rt( p5==0 || pEx
4c00: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20  pr->op!=op );.  
4c10: 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49  assert( p5==SQLI
4c20: 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78  TE_NULLEQ || pEx
4c30: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20  pr->op==op );.. 
4c40: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54   p5 |= SQLITE_ST
4c50: 4f 52 45 50 32 3b 0a 20 20 69 66 28 20 6f 70 78  OREP2;.  if( opx
4c60: 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20  ==TK_LE ) opx = 
4c70: 54 4b 5f 4c 54 3b 0a 20 20 69 66 28 20 6f 70 78  TK_LT;.  if( opx
4c80: 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20  ==TK_GE ) opx = 
4c90: 54 4b 5f 47 54 3b 0a 0a 20 20 72 65 67 4c 65 66  TK_GT;..  regLef
4ca0: 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73  t = exprCodeSubs
4cb0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c  elect(pParse, pL
4cc0: 65 66 74 29 3b 0a 20 20 72 65 67 52 69 67 68 74  eft);.  regRight
4cd0: 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73 65   = exprCodeSubse
4ce0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 52 69  lect(pParse, pRi
4cf0: 67 68 74 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  ght);..  for(i=0
4d00: 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65 78 69 74 73  ; 1 /*Loop exits
4d10: 20 62 79 20 22 62 72 65 61 6b 22 2a 2f 3b 20 69   by "break"*/; i
4d20: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  ++){.    int reg
4d30: 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67 46 72  Free1 = 0, regFr
4d40: 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 45 78 70  ee2 = 0;.    Exp
4d50: 72 20 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20  r *pL, *pR; .   
4d60: 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20   int r1, r2;.   
4d70: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
4d80: 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20   i<nLeft );.    
4d90: 72 31 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52  r1 = exprVectorR
4da0: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
4db0: 70 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66  pLeft, i, regLef
4dc0: 74 2c 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65  t, &pL, &regFree
4dd0: 31 29 3b 0a 20 20 20 20 72 32 20 3d 20 65 78 70  1);.    r2 = exp
4de0: 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28  rVectorRegister(
4df0: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
4e00: 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70 52  i, regRight, &pR
4e10: 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
4e20: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
4e30: 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70  arse, pL, pR, op
4e40: 78 2c 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c  x, r1, r2, dest,
4e50: 20 70 35 29 3b 0a 20 20 20 20 74 65 73 74 63 61   p5);.    testca
4e60: 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
4e70: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4e80: 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
4e90: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4ea0: 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
4eb0: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
4ec0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4ed0: 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
4ee0: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4ef0: 4f 50 5f 47 74 29 3b 0a 20 20 20 20 74 65 73 74  OP_Gt);.    test
4f00: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
4f10: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4f20: 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
4f30: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
4f40: 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
4f50: 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
4f60: 71 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  q);.    testcase
4f70: 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
4f80: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4f90: 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71  ==OP_Ne);.    sq
4fa0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4fb0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
4fc0: 72 65 65 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ree1);.    sqlit
4fd0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
4fe0: 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
4ff0: 32 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  2);.    if( i==n
5000: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
5010: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5020: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20   if( opx==TK_EQ 
5030: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5040: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5050: 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64  _IfNot, dest, ad
5060: 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76  drDone); VdbeCov
5070: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
5080: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45  p5 |= SQLITE_KEE
5090: 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  PNULL;.    }else
50a0: 20 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20   if( opx==TK_NE 
50b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
50c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
50d0: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
50e0: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
50f0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
5100: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
5110: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
5120: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
5130: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LT || op==TK
5140: 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45  _GT || op==TK_LE
5150: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b   || op==TK_GE );
5160: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5170: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
5180: 6c 73 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64  lseNotEq, 0, add
5190: 72 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  rDone);.      Vd
51a0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
51b0: 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20  op==TK_LT);.    
51c0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
51d0: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  (v, op==TK_GT);.
51e0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
51f0: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
5200: 45 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  E);.      VdbeCo
5210: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
5220: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66  TK_GE);.      if
5230: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
5240: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20  px = op;.    }. 
5250: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
5260: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
5270: 61 64 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69  addrDone);.}..#i
5280: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
5290: 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20  R_DEPTH>0./*.** 
52a0: 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d  Check that argum
52b0: 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c  ent nHeight is l
52c0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
52d0: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
52e0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
52f0: 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66  epth allowed. If
5300: 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76   it is not, leav
5310: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
5320: 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e  ge in.** pParse.
5330: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
5340: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50  xprCheckHeight(P
5350: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
5360: 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e  t nHeight){.  in
5370: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5380: 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74  ;.  int mxHeight
5390: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
53a0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
53b0: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
53c0: 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78    if( nHeight>mx
53d0: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  Height ){.    sq
53e0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
53f0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45  arse, .       "E
5400: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
5410: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78  s too large (max
5420: 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c  imum depth %d)",
5430: 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b   mxHeight.    );
5440: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5450: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
5460: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
5470: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
5480: 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65  ee functions, he
5490: 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65  ightOfExpr(), he
54a0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29  ightOfExprList()
54b0: 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66  .** and heightOf
54c0: 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73  Select(), are us
54d0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
54e0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
54f0: 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70  ht.** of any exp
5500: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5510: 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73  erenced by the s
5520: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
5530: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
5540: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
5550: 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20  If this maximum 
5560: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
5570: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
5580: 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  nt value pointed
5590: 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67  .** to by pnHeig
55a0: 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ht, the second p
55b0: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73  arameter, then s
55c0: 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20  et *pnHeight to 
55d0: 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  that.** value..*
55e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
55f0: 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20  ightOfExpr(Expr 
5600: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
5610: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
5620: 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68     if( p->nHeigh
5630: 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20  t>*pnHeight ){. 
5640: 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
5650: 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20   p->nHeight;.   
5660: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5670: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
5680: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
5690: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
56a0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
56b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
56c0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
56d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65  ; i++){.      he
56e0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b  ightOfExpr(p->a[
56f0: 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67  i].pExpr, pnHeig
5700: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ht);.    }.  }.}
5710: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5720: 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65  ghtOfSelect(Sele
5730: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74  ct *pSelect, int
5740: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53   *pnHeight){.  S
5750: 65 6c 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28  elect *p;.  for(
5760: 70 3d 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d  p=pSelect; p; p=
5770: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
5780: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5790: 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74  pWhere, pnHeight
57a0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
57b0: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
57c0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
57d0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
57e0: 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29  Limit, pnHeight)
57f0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5800: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
5810: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5820: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5830: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  t(p->pGroupBy, p
5840: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5850: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5860: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65  ->pOrderBy, pnHe
5870: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
5880: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
5890: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
58a0: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
58b0: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
58c0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
58d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
58e0: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
58f0: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
5900: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
5910: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
5920: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
5930: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
5940: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
5950: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
5960: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
5970: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
5980: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
5990: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72  e..**.** Also pr
59a0: 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61  opagate EP_Propa
59b0: 67 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72  gate flags up fr
59c0: 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  om Expr.x.pList 
59d0: 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a  to Expr.flags,.*
59e0: 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65  * if appropriate
59f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5a00: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45   exprSetHeight(E
5a10: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  xpr *p){.  int n
5a20: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
5a30: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5a40: 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  eft, &nHeight);.
5a50: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5a60: 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67  ->pRight, &nHeig
5a70: 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ht);.  if( ExprH
5a80: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5a90: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
5aa0: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
5ab0: 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  t(p->x.pSelect, 
5ac0: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c  &nHeight);.  }el
5ad0: 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73  se if( p->x.pLis
5ae0: 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  t ){.    heightO
5af0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70  fExprList(p->x.p
5b00: 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  List, &nHeight);
5b10: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
5b20: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
5b30: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
5b40: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
5b50: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67  ;.  }.  p->nHeig
5b60: 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31  ht = nHeight + 1
5b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
5b80: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
5b90: 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74  variable using t
5ba0: 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  he exprSetHeight
5bb0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a  () function. If.
5bc0: 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73  ** the height is
5bd0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
5be0: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5bf0: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  d expression dep
5c00: 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  th,.** leave an 
5c10: 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
5c20: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
5c30: 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f  agate all EP_Pro
5c40: 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f  pagate flags fro
5c50: 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69  m the Expr.x.pLi
5c60: 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e  st into.** Expr.
5c70: 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20  flags. .*/.void 
5c80: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
5c90: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72  ightAndFlags(Par
5ca0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
5cb0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72   *p){.  if( pPar
5cc0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
5cd0: 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67  n;.  exprSetHeig
5ce0: 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ht(p);.  sqlite3
5cf0: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
5d00: 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67  pParse, p->nHeig
5d10: 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ht);.}../*.** Re
5d20: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
5d30: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65   height of any e
5d40: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
5d50: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20  eferenced.** by 
5d60: 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  the select state
5d70: 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61  ment passed as a
5d80: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  n argument..*/.i
5d90: 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
5da0: 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63  ExprHeight(Selec
5db0: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  t *p){.  int nHe
5dc0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5dd0: 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e  htOfSelect(p, &n
5de0: 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72  Height);.  retur
5df0: 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c  n nHeight;.}.#el
5e00: 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65  se /* ABOVE:  He
5e10: 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  ight enforcement
5e20: 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57   enabled.  BELOW
5e30: 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65  : Height enforce
5e40: 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a  ment off */./*.*
5e50: 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20  * Propagate all 
5e60: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
5e70: 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  gs from the Expr
5e80: 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a  .x.pList into.**
5e90: 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f   Expr.flags. .*/
5ea0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
5eb0: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
5ec0: 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
5ed0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
5ee0: 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73  ( p && p->x.pLis
5ef0: 74 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  t && !ExprHasPro
5f00: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
5f10: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d  elect) ){.    p-
5f20: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f  >flags |= EP_Pro
5f30: 70 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33  pagate & sqlite3
5f40: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d  ExprListFlags(p-
5f50: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  >x.pList);.  }.}
5f60: 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74  .#define exprSet
5f70: 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66  Height(y).#endif
5f80: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45   /* SQLITE_MAX_E
5f90: 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a  XPR_DEPTH>0 */..
5fa0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5fb0: 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61  ne is the core a
5fc0: 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70  llocator for Exp
5fd0: 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43  r nodes..**.** C
5fe0: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
5ff0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
6000: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
6010: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
6020: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
6030: 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20  ode and for the 
6040: 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20  pToken argument 
6050: 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  is a single allo
6060: 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e  cation.** obtain
6070: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
6080: 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  bMalloc().  The 
6090: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
60a0: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
60b0: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
60c0: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
60d0: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
60e0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75  d..**.** If dequ
60f0: 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ote is true, the
6100: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20  n the token (if 
6110: 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65  it exists) is de
6120: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65  quoted..** If de
6130: 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20  quote is false, 
6140: 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20  no dequoting is 
6150: 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20  performed.  The 
6160: 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d  deQuote.** param
6170: 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
6180: 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
6190: 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65  L or if the toke
61a0: 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70  n does not.** ap
61b0: 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65  pear to be quote
61c0: 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65  d.  If the quote
61d0: 73 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f  s were of the fo
61e0: 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65  rm "..." (double
61f0: 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e  -quotes).** then
6200: 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65   the EP_DblQuote
6210: 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  d flag is set on
6220: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6230: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63  node..**.** Spec
6240: 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70  ial case:  If op
6250: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64  ==TK_INTEGER and
6260: 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74   pToken points t
6270: 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a  o a string that.
6280: 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c  ** can be transl
6290: 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62  ated into a 32-b
62a0: 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  it integer, then
62b0: 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f   the token is no
62c0: 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75  t.** stored in u
62d0: 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61  .zToken.  Instea
62e0: 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  d, the integer v
62f0: 61 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e  alues is written
6300: 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75  .** into u.iValu
6310: 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74  e and the EP_Int
6320: 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65  Value flag is se
6330: 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f  t.  No extra sto
6340: 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63  rage.** is alloc
6350: 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
6360: 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e   integer text an
6370: 64 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c  d the dequote fl
6380: 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ag is ignored..*
6390: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
63a0: 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69  xprAlloc(.  sqli
63b0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
63c0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
63d0: 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  r sqlite3DbMallo
63e0: 63 52 61 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e  cRawNN() */.  in
63f0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
6400: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6410: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
6420: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
6430: 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  ken,    /* Token
6440: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
6450: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  t be NULL */.  i
6460: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
6470: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
6480: 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a  o dequote */.){.
6490: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
64a0: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
64b0: 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30    int iValue = 0
64c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
64d0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  =0 );.  if( pTok
64e0: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70  en ){.    if( op
64f0: 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20  !=TK_INTEGER || 
6500: 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20  pToken->z==0.   
6510: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
6520: 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e  3GetInt32(pToken
6530: 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30  ->z, &iValue)==0
6540: 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
6550: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a   = pToken->n+1;.
6560: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56        assert( iV
6570: 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d  alue>=0 );.    }
6580: 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71  .  }.  pNew = sq
6590: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
65a0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  NN(db, sizeof(Ex
65b0: 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69  pr)+nExtra);.  i
65c0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d  f( pNew ){.    m
65d0: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
65e0: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
65f0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38    pNew->op = (u8
6600: 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  )op;.    pNew->i
6610: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  Agg = -1;.    if
6620: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
6630: 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20    if( nExtra==0 
6640: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
6650: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
6660: 56 61 6c 75 65 7c 45 50 5f 4c 65 61 66 3b 0a 20  Value|EP_Leaf;. 
6670: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
6680: 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a  Value = iValue;.
6690: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
66a0: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f       pNew->u.zTo
66b0: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ken = (char*)&pN
66c0: 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61  ew[1];.        a
66d0: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a  ssert( pToken->z
66e0: 21 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e  !=0 || pToken->n
66f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
6700: 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d  f( pToken->n ) m
6710: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54  emcpy(pNew->u.zT
6720: 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c  oken, pToken->z,
6730: 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20   pToken->n);.   
6740: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f       pNew->u.zTo
6750: 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d  ken[pToken->n] =
6760: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
6770: 64 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74  dequote && sqlit
6780: 65 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e  e3Isquote(pNew->
6790: 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a  u.zToken[0]) ){.
67a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
67b0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  ew->u.zToken[0]=
67c0: 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61  ='"' ) pNew->fla
67d0: 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74  gs |= EP_DblQuot
67e0: 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ed;.          sq
67f0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65  lite3Dequote(pNe
6800: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  w->u.zToken);.  
6810: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6820: 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
6830: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
6840: 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69  0.    pNew->nHei
6850: 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20  ght = 1;.#endif 
6860: 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70   .  }.  return p
6870: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  New;.}../*.** Al
6880: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70  locate a new exp
6890: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f  ression node fro
68a0: 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  m a zero-termina
68b0: 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  ted token that h
68c0: 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  as.** already be
68d0: 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a  en dequoted..*/.
68e0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
68f0: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
6900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
6910: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
6920: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
6930: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
6940: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
6950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
6960: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
6970: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
6980: 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a   *zToken      /*
6990: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
69a0: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
69b0: 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b  */.){.  Token x;
69c0: 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b  .  x.z = zToken;
69d0: 0a 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65 33  .  x.n = sqlite3
69e0: 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29  Strlen30(zToken)
69f0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
6a00: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
6a10: 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f  op, &x, 0);.}../
6a20: 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74  *.** Attach subt
6a30: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
6a40: 52 69 67 68 74 20 74 6f 20 74 68 65 20 45 78 70  Right to the Exp
6a50: 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a  r node pRoot..**
6a60: 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55  .** If pRoot==NU
6a70: 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  LL that means th
6a80: 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  at a memory allo
6a90: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
6aa0: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e   occurred..** In
6ab0: 20 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65   that case, dele
6ac0: 74 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20  te the subtrees 
6ad0: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
6ae0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6af0: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
6b00: 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ees(.  sqlite3 *
6b10: 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f  db,.  Expr *pRoo
6b20: 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  t,.  Expr *pLeft
6b30: 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  ,.  Expr *pRight
6b40: 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d  .){.  if( pRoot=
6b50: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
6b60: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
6b70: 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ed );.    sqlite
6b80: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6b90: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
6ba0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6bb0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c  , pRight);.  }el
6bc0: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67  se{.    if( pRig
6bd0: 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ht ){.      pRoo
6be0: 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67  t->pRight = pRig
6bf0: 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d  ht;.      pRoot-
6c00: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f  >flags |= EP_Pro
6c10: 70 61 67 61 74 65 20 26 20 70 52 69 67 68 74 2d  pagate & pRight-
6c20: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
6c30: 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20    if( pLeft ){. 
6c40: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66       pRoot->pLef
6c50: 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20  t = pLeft;.     
6c60: 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d   pRoot->flags |=
6c70: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
6c80: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20  pLeft->flags;.  
6c90: 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48    }.    exprSetH
6ca0: 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20  eight(pRoot);.  
6cb0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
6cc0: 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64 65  ate an Expr node
6cd0: 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20   which joins as 
6ce0: 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74  many as two subt
6cf0: 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20  rees..**.** One 
6d00: 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73  or both of the s
6d10: 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e  ubtrees can be N
6d20: 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ULL.  Return a p
6d30: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
6d40: 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20  w.** Expr node. 
6d50: 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65   Or, if an OOM e
6d60: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
6d70: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
6d80: 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72  locFailed,.** fr
6d90: 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20  ee the subtrees 
6da0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
6db0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
6dc0: 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20  3PExpr(.  Parse 
6dd0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
6de0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
6df0: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  text */.  int op
6e00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6e10: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
6e20: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72  opcode */.  Expr
6e30: 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20   *pLeft,        
6e40: 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72      /* Left oper
6e50: 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  and */.  Expr *p
6e60: 52 69 67 68 74 20 20 20 20 20 20 20 20 20 20 20  Right           
6e70: 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e   /* Right operan
6e80: 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  d */.){.  Expr *
6e90: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
6ea0: 41 4e 44 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  AND && pParse->n
6eb0: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Err==0 ){.    /*
6ec0: 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   Take advantage 
6ed0: 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74  of short-circuit
6ee0: 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74   false optimizat
6ef0: 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20  ion for AND */. 
6f00: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
6f10: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
6f20: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
6f30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6f40: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6f50: 6f 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e  ocRawNN(pParse->
6f60: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29  db, sizeof(Expr)
6f70: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
6f80: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20        memset(p, 
6f90: 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
6fa0: 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20  ;.      p->op = 
6fb0: 6f 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b 3b  op & TKFLG_MASK;
6fc0: 0a 20 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d  .      p->iAgg =
6fd0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   -1;.    }.    s
6fe0: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
6ff0: 53 75 62 74 72 65 65 73 28 70 50 61 72 73 65 2d  Subtrees(pParse-
7000: 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70  >db, p, pLeft, p
7010: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66  Right);.  }.  if
7020: 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69  ( p ) {.    sqli
7030: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
7040: 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48  ht(pParse, p->nH
7050: 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65  eight);.  }.  re
7060: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
7070: 20 41 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20   Add pSelect to 
7080: 74 68 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65  the Expr.x.pSele
7090: 63 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69  ct field.  Or, i
70a0: 66 20 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20  f pExpr is NULL 
70b0: 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d  (due.** do a mem
70c0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
70d0: 61 69 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c  ailure) then del
70e0: 65 74 65 20 74 68 65 20 70 53 65 6c 65 63 74 20  ete the pSelect 
70f0: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20  object..*/.void 
7100: 73 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53  sqlite3PExprAddS
7110: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
7120: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
7130: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
7140: 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20  t){.  if( pExpr 
7150: 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e  ){.    pExpr->x.
7160: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
7170: 74 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  t;.    ExprSetPr
7180: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
7190: 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75  _xIsSelect|EP_Su
71a0: 62 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  bquery);.    sql
71b0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
71c0: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
71d0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73  , pExpr);.  }els
71e0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
71f0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
7200: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
7210: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
7220: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
7230: 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Select);.  }.}..
7240: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
7250: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61  pression is alwa
7260: 79 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f  ys either TRUE o
7270: 72 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74  r FALSE (respect
7280: 69 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20  ively),.** then 
7290: 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e  return 1.  If on
72a0: 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
72b0: 6e 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c  ne the truth val
72c0: 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  ue of the.** exp
72d0: 72 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69  ression at compi
72e0: 6c 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30  le-time return 0
72f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
7300: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
7310: 20 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65    If is OK to re
7320: 74 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e  turn 0 here even
7330: 20 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65   if.** the expre
7340: 73 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20  ssion really is 
7350: 61 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20  always false or 
7360: 66 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e  false (a false n
7370: 65 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74  egative)..** But
7380: 20 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20   it is a bug to 
7390: 72 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  return 1 if the 
73a0: 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
73b0: 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
73c0: 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65  ** boolean value
73d0: 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63  s in different c
73e0: 69 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20  ircumstances (a 
73f0: 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29  false positive.)
7400: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
7410: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
7420: 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f  on is part of co
7430: 6e 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a  nditional for a.
7440: 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68  ** LEFT JOIN, th
7450: 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74  en we cannot det
7460: 65 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c  ermine at compil
7470: 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f  e-time whether o
7480: 72 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74  r not.** is it t
7490: 72 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f  rue or false, so
74a0: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30   always return 0
74b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
74c0: 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45  exprAlwaysTrue(E
74d0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76  xpr *p){.  int v
74e0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72   = 0;.  if( Expr
74f0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
7500: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
7510: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
7520: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
7530: 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74  ger(p, &v) ) ret
7540: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
7550: 76 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69  v!=0;.}.static i
7560: 6e 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  nt exprAlwaysFal
7570: 73 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  se(Expr *p){.  i
7580: 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20  nt v = 0;.  if( 
7590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
75a0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
75b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
75c0: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
75d0: 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29  Integer(p, &v) )
75e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
75f0: 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  urn v==0;.}../*.
7600: 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72  ** Join two expr
7610: 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e  essions using an
7620: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20   AND operator.  
7630: 49 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73  If either expres
7640: 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c  sion is.** NULL,
7650: 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
7660: 6e 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72  n the other expr
7670: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ession..**.** If
7680: 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65   one side or the
7690: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e   other of the AN
76a0: 44 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65  D is known to be
76b0: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73   false, then ins
76c0: 74 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72  tead.** of retur
76d0: 6e 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72  ning an AND expr
76e0: 65 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74  ession, just ret
76f0: 75 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65  urn a constant e
7700: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a  xpression with.*
7710: 2a 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c  * a value of fal
7720: 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  se..*/.Expr *sql
7730: 69 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69  ite3ExprAnd(sqli
7740: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
7750: 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67  Left, Expr *pRig
7760: 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74  ht){.  if( pLeft
7770: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7780: 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73  n pRight;.  }els
7790: 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20  e if( pRight==0 
77a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c  ){.    return pL
77b0: 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eft;.  }else if(
77c0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
77d0: 28 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41  (pLeft) || exprA
77e0: 6c 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68  lwaysFalse(pRigh
77f0: 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
7800: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
7810: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
7820: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
7830: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72  , pRight);.    r
7840: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
7850: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e  rAlloc(db, TK_IN
7860: 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49  TEGER, &sqlite3I
7870: 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b  ntTokens[0], 0);
7880: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78  .  }else{.    Ex
7890: 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
78a0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
78b0: 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20  TK_AND, 0, 0);. 
78c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
78d0: 74 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c  tachSubtrees(db,
78e0: 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52   pNew, pLeft, pR
78f0: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
7900: 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f  n pNew;.  }.}../
7910: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
7920: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
7930: 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74  node for a funct
7940: 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c  ion with multipl
7950: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a  e.** arguments..
7960: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
7970: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20  ExprFunction(.  
7980: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7990: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
79a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
79b0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
79c0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
79d0: 6c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  list */.  Token 
79e0: 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20  *pToken,        
79f0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
7a00: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
7a10: 20 65 44 69 73 74 69 6e 63 74 20 20 20 20 20 20   eDistinct      
7a20: 20 20 20 2f 2a 20 53 46 5f 44 69 73 74 69 6e 63     /* SF_Distinc
7a30: 74 20 6f 72 20 53 46 5f 41 4c 4c 20 6f 72 20 30  t or SF_ALL or 0
7a40: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
7a50: 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  New;.  sqlite3 *
7a60: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7a70: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
7a80: 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n );.  pNew = sq
7a90: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
7aa0: 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20  b, TK_FUNCTION, 
7ab0: 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66  pToken, 1);.  if
7ac0: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
7ad0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7ae0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
7af0: 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f  ); /* Avoid memo
7b00: 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c  ry leak when mal
7b10: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
7b20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
7b30: 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c   if( pList && pL
7b40: 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 70 50 61  ist->nExpr > pPa
7b50: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
7b60: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e  SQLITE_LIMIT_FUN
7b70: 43 54 49 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20 20  CTION_ARG] ){.  
7b80: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7b90: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
7ba0: 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e  any arguments on
7bb0: 20 66 75 6e 63 74 69 6f 6e 20 25 54 22 2c 20 70   function %T", p
7bc0: 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 70 4e  Token);.  }.  pN
7bd0: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c  ew->x.pList = pL
7be0: 69 73 74 3b 0a 20 20 45 78 70 72 53 65 74 50 72  ist;.  ExprSetPr
7bf0: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
7c00: 48 61 73 46 75 6e 63 29 3b 0a 20 20 61 73 73 65  HasFunc);.  asse
7c10: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
7c20: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
7c30: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71  sSelect) );.  sq
7c40: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
7c50: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
7c60: 65 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20  e, pNew);.  if( 
7c70: 65 44 69 73 74 69 6e 63 74 3d 3d 53 46 5f 44 69  eDistinct==SF_Di
7c80: 73 74 69 6e 63 74 20 29 20 45 78 70 72 53 65 74  stinct ) ExprSet
7c90: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
7ca0: 50 5f 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 72  P_Distinct);.  r
7cb0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
7cc0: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61  *.** Assign a va
7cd0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f  riable number to
7ce0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
7cf0: 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69  hat encodes a wi
7d00: 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65  ldcard.** in the
7d10: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
7d20: 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  atement.  .**.**
7d30: 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69   Wildcards consi
7d40: 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c  sting of a singl
7d50: 65 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e  e "?" are assign
7d60: 65 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  ed the next sequ
7d70: 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62  ential.** variab
7d80: 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  le number..**.**
7d90: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
7da0: 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72  e form "?nnn" ar
7db0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
7dc0: 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65  umber "nnn".  We
7dd0: 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e   make.** sure "n
7de0: 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62  nn" is not too b
7df0: 69 67 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  ig to avoid a de
7e00: 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20  nial of service 
7e10: 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74  attack when.** t
7e20: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
7e30: 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65   comes from an e
7e40: 78 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a  xternal source..
7e50: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7e60: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61  of the form ":aa
7e70: 61 22 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22  a", "@aaa", or "
7e80: 24 61 61 61 22 20 61 72 65 20 61 73 73 69 67 6e  $aaa" are assign
7e90: 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ed the same numb
7ea0: 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65  er.** as the pre
7eb0: 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f  vious instance o
7ec0: 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63  f the same wildc
7ed0: 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73  ard.  Or if this
7ee0: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
7ef0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
7f00: 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e   wildcard, the n
7f10: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 20 76  ext sequential v
7f20: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  ariable number i
7f30: 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a  s.** assigned..*
7f40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
7f50: 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65  prAssignVarNumbe
7f60: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
7f70: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75 33   Expr *pExpr, u3
7f80: 32 20 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  2 n){.  sqlite3 
7f90: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7fa0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7fb0: 7a 3b 0a 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20  z;.  ynVar x;.. 
7fc0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
7fd0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
7fe0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
7ff0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
8000: 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63 65 64  Value|EP_Reduced
8010: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29  |EP_TokenOnly) )
8020: 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ;.  z = pExpr->u
8030: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72  .zToken;.  asser
8040: 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( z!=0 );.  ass
8050: 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a  ert( z[0]!=0 );.
8060: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 28 75 33    assert( n==(u3
8070: 32 29 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  2)sqlite3Strlen3
8080: 30 28 7a 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b  0(z) );.  if( z[
8090: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  1]==0 ){.    /* 
80a0: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
80b0: 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67  form "?".  Assig
80c0: 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61  n the next varia
80d0: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
80e0: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d    assert( z[0]==
80f0: 27 3f 27 20 29 3b 0a 20 20 20 20 78 20 3d 20 28  '?' );.    x = (
8100: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
8110: 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  >nVar);.  }else{
8120: 0a 20 20 20 20 69 6e 74 20 64 6f 41 64 64 20 3d  .    int doAdd =
8130: 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d   0;.    if( z[0]
8140: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f  =='?' ){.      /
8150: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
8160: 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20  e form "?nnn".  
8170: 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f  Convert "nnn" to
8180: 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a   an integer and.
8190: 20 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20        ** use it 
81a0: 61 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  as the variable 
81b0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20  number */.      
81c0: 69 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  i64 i;.      int
81d0: 20 62 4f 6b 3b 0a 20 20 20 20 20 20 69 66 28 20   bOk;.      if( 
81e0: 6e 3d 3d 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49  n==2 ){ /*OPTIMI
81f0: 5a 41 54 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f  ZATION-IF-TRUE*/
8200: 0a 20 20 20 20 20 20 20 20 69 20 3d 20 7a 5b 31  .        i = z[1
8210: 5d 2d 27 30 27 3b 20 20 2f 2a 20 54 68 65 20 63  ]-'0';  /* The c
8220: 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e  ommon case of ?N
8230: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 69   for a single di
8240: 67 69 74 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20  git N */.       
8250: 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20   bOk = 1;.      
8260: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62  }else{.        b
8270: 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41  Ok = 0==sqlite3A
8280: 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c  toi64(&z[1], &i,
8290: 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46   n-1, SQLITE_UTF
82a0: 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  8);.      }.    
82b0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30    testcase( i==0
82c0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
82d0: 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20  se( i==1 );.    
82e0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
82f0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8300: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
8310: 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20  NUMBER]-1 );.   
8320: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
8330: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8340: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
8350: 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20  _NUMBER] );.    
8360: 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20    if( bOk==0 || 
8370: 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69  i<1 || i>db->aLi
8380: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8390: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
83a0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
83b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
83c0: 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e  rse, "variable n
83d0: 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65  umber must be be
83e0: 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64  tween ?1 and ?%d
83f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ",.            d
8400: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8410: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
8420: 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20  NUMBER]);.      
8430: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
8440: 7d 0a 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56  }.      x = (ynV
8450: 61 72 29 69 3b 0a 20 20 20 20 20 20 69 66 28 20  ar)i;.      if( 
8460: 78 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29  x>pParse->nVar )
8470: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  {.        pParse
8480: 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 78 3b  ->nVar = (int)x;
8490: 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d  .        doAdd =
84a0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
84b0: 69 66 28 20 73 71 6c 69 74 65 33 56 4c 69 73 74  if( sqlite3VList
84c0: 4e 75 6d 54 6f 4e 61 6d 65 28 70 50 61 72 73 65  NumToName(pParse
84d0: 2d 3e 70 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20  ->pVList, x)==0 
84e0: 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 41 64 64  ){.        doAdd
84f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
8500: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
8510: 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65  * Wildcards like
8520: 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20   ":aaa", "$aaa" 
8530: 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75 73  or "@aaa".  Reus
8540: 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61  e the same varia
8550: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d  ble.      ** num
8560: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
8570: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
8580: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
8590: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
85a0: 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20     ** has never 
85b0: 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c  appeared before,
85c0: 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
85d0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a  variable number.
85e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 78        */.      x
85f0: 20 3d 20 28 79 6e 56 61 72 29 73 71 6c 69 74 65   = (ynVar)sqlite
8600: 33 56 4c 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28  3VListNameToNum(
8610: 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20  pParse->pVList, 
8620: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  z, n);.      if(
8630: 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   x==0 ){.       
8640: 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70   x = (ynVar)(++p
8650: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
8660: 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b        doAdd = 1;
8670: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8680: 20 20 20 69 66 28 20 64 6f 41 64 64 20 29 7b 0a     if( doAdd ){.
8690: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
86a0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 56 4c  List = sqlite3VL
86b0: 69 73 74 41 64 64 28 64 62 2c 20 70 50 61 72 73  istAdd(db, pPars
86c0: 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c  e->pVList, z, n,
86d0: 20 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   x);.    }.  }. 
86e0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
86f0: 3d 20 78 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d  = x;.  if( x>db-
8700: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
8710: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
8720: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c  MBER] ){.    sql
8730: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8740: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53  rse, "too many S
8750: 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a  QL variables");.
8760: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
8770: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
8780: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
8790: 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ee..*/.static SQ
87a0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
87b0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
87c0: 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a  leteNN(sqlite3 *
87d0: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
87e0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
87f0: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
8800: 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  k: Assert that t
8810: 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e  he IntValue is n
8820: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69  on-negative if i
8830: 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73  t exists */.  as
8840: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
8850: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
8860: 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69  Value) || p->u.i
8870: 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 0a 20 20 61  Value>=0 );..  a
8880: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
8890: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69  roperty(p, EP_Wi
88a0: 6e 46 75 6e 63 29 20 7c 7c 20 70 2d 3e 79 2e 70  nFunc) || p->y.p
88b0: 57 69 6e 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  Win!=0 || db->ma
88c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
88d0: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
88e0: 4b 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 45 78  K_FUNCTION || Ex
88f0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8900: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
8910: 5f 52 65 64 75 63 65 64 29 0a 20 20 20 20 20 20  _Reduced).      
8920: 20 20 20 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e      || p->y.pWin
8930: 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72  ==0 || ExprHasPr
8940: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e  operty(p, EP_Win
8950: 46 75 6e 63 29 20 29 3b 0a 23 69 66 64 65 66 20  Func) );.#ifdef 
8960: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
8970: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8980: 74 79 28 70 2c 20 45 50 5f 4c 65 61 66 29 20 26  ty(p, EP_Leaf) &
8990: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
89a0: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
89b0: 6c 79 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ly) ){.    asser
89c0: 74 28 20 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29  t( p->pLeft==0 )
89d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
89e0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
89f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70    assert( p->x.p
8a00: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d  Select==0 );.  }
8a10: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 45  .#endif.  if( !E
8a20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8a30: 2c 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  , (EP_TokenOnly|
8a40: 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20 20  EP_Leaf)) ){.   
8a50: 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75   /* The Expr.x u
8a60: 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73  nion is never us
8a70: 65 64 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  ed at the same t
8a80: 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69 67  ime as Expr.pRig
8a90: 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ht */.    assert
8aa0: 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20  ( p->x.pList==0 
8ab0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
8ac0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  );.    if( p->pL
8ad0: 65 66 74 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b  eft && p->op!=TK
8ae0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
8af0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8b00: 74 65 4e 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66  teNN(db, p->pLef
8b10: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  t);.    if( p->p
8b20: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
8b30: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8b40: 4e 4e 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  NN(db, p->pRight
8b50: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8b60: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8b70: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
8b80: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
8b90: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
8ba0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29  b, p->x.pSelect)
8bb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8bc0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
8bd0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
8be0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
8bf0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
8c00: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69  roperty(p, EP_Wi
8c10: 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  nFunc) ){.      
8c20: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
8c30: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  K_FUNCTION );.  
8c40: 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f      sqlite3Windo
8c50: 77 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 79  wDelete(db, p->y
8c60: 2e 70 57 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  .pWin);.    }.  
8c70: 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  }.  if( ExprHasP
8c80: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65  roperty(p, EP_Me
8c90: 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65  mToken) ) sqlite
8ca0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
8cb0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20  .zToken);.  if( 
8cc0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8cd0: 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29  (p, EP_Static) )
8ce0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
8cf0: 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20  reeNN(db, p);.  
8d00: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
8d10: 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74  ExprDelete(sqlit
8d20: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
8d30: 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c 69  {.  if( p ) sqli
8d40: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8d50: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
8d60: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
8d70: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
8d80: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
8d90: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
8da0: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
8db0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
8dc0: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
8dd0: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
8de0: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
8df0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
8e00: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
8e10: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
8e20: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
8e30: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
8e40: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8e50: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
8e60: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
8e70: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
8e80: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
8e90: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
8ea0: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
8eb0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
8ec0: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
8ed0: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
8ee0: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
8ef0: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
8f00: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
8f10: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
8f20: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
8f30: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
8f40: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
8f50: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
8f60: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
8f70: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
8f80: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
8f90: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
8fa0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
8fb0: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
8fc0: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
8fd0: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
8fe0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
8ff0: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
9000: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
9010: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
9020: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
9030: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
9040: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
9050: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
9060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
90b0: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
90c0: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
90d0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
90e0: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
90f0: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
9100: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
9110: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
9120: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
9130: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
9140: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
9150: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
9160: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
9170: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
9180: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
9190: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
91a0: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
91b0: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
91c0: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
91d0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
91e0: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
91f0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
9200: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
9210: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
9220: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
9230: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
9240: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
9250: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
9260: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
9270: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
9280: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
9290: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
92a0: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
92b0: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
92c0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
92d0: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
92e0: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
92f0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
9300: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
9310: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
9320: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
9330: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
9340: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
9350: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
9360: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
9370: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
9380: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
9390: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
93a0: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
93b0: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
93c0: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
93d0: 68 65 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  he Expr object a
93e0: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
93f0: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
9400: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
9410: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
9420: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
9430: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
9440: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
9450: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20  k to.** make an 
9460: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63  EXPRDUP_REDUCE c
9470: 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64  opy of a reduced
9480: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74   expression.  It
9490: 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a   is only legal.*
94a0: 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72  * to reduce a pr
94b0: 69 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f  istine expressio
94c0: 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20  n tree from the 
94d0: 70 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70  parser.  The imp
94e0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f  lementation.** o
94f0: 66 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  f dupedExprStruc
9500: 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20  tSize() contain 
9510: 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28  multiple assert(
9520: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  ) statements tha
9530: 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  t attempt.** to 
9540: 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e  enforce this con
9550: 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  straint..*/.stat
9560: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
9570: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
9580: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
9590: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61    int nSize;.  a
95a0: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58  ssert( flags==EX
95b0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20  PRDUP_REDUCE || 
95c0: 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f  flags==0 ); /* O
95d0: 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c  nly one flag val
95e0: 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  ue allowed */.  
95f0: 61 73 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c  assert( EXPR_FUL
9600: 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a  LSIZE<=0xfff );.
9610: 20 20 61 73 73 65 72 74 28 20 28 30 78 66 66 66    assert( (0xfff
9620: 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45   & (EP_Reduced|E
9630: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30  P_TokenOnly))==0
9640: 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61   );.  if( 0==fla
9650: 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  gs || p->op==TK_
9660: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 0a 23  SELECT_COLUMN .#
9670: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9680: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
9690: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
96a0: 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e  rty(p, EP_WinFun
96b0: 63 29 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  c).#endif.  ){. 
96c0: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
96d0: 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73  FULLSIZE;.  }els
96e0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  e{.    assert( !
96f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9700: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
9710: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
9720: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
9730: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9740: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a  P_FromJoin) ); .
9750: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9760: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9770: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a  EP_MemToken) );.
9780: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
9790: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
97a0: 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a  EP_NoReduce) );.
97b0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
97c0: 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   || p->x.pList )
97d0: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
97e0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
97f0: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20   | EP_Reduced;. 
9800: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9810: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
9820: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53  t==0 );.      nS
9830: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
9840: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
9850: 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20  kenOnly;.    }. 
9860: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a   }.  return nSiz
9870: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
9880: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
9890: 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62  s the space in b
98a0: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
98b0: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
98c0: 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20  .** of the Expr 
98d0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
98e0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
98f0: 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  .u.zToken string
9900: 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72   (if that.** str
9910: 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29  ing is defined.)
9920: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9930: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
9940: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
9950: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
9960: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
9970: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
9980: 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28  ) & 0xfff;.  if(
9990: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
99a0: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
99b0: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
99c0: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
99d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
99e0: 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b  NN(p->u.zToken)+
99f0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
9a00: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d  ROUND8(nByte);.}
9a10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9a20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
9a30: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  es required to c
9a40: 72 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74  reate a duplicat
9a50: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70  e of the .** exp
9a60: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
9a70: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
9a80: 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64  ment. The second
9a90: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a   argument is a.*
9aa0: 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e  * mask containin
9ab0: 67 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c  g EXPRDUP_XXX fl
9ac0: 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ags..**.** The v
9ad0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e  alue returned in
9ae0: 63 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20  cludes space to 
9af0: 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
9b00: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
9b10: 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74  .** itself and t
9b20: 68 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72  he buffer referr
9b30: 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e  ed to by Expr.u.
9b40: 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a  zToken, if any..
9b50: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50  **.** If the EXP
9b60: 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67  RDUP_REDUCE flag
9b70: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
9b80: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
9b90: 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63  ncludes .** spac
9ba0: 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61  e to duplicate a
9bb0: 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e  ll Expr nodes in
9bc0: 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64   the tree formed
9bd0: 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a   by Expr.pLeft .
9be0: 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67  ** and Expr.pRig
9bf0: 68 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75  ht variables (bu
9c00: 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74  t not for any st
9c10: 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64  ructures pointed
9c20: 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65   to or .** desce
9c30: 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78  nded from the Ex
9c40: 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78  pr.x.pList or Ex
9c50: 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72  pr.x.pSelect var
9c60: 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74  iables)..*/.stat
9c70: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
9c80: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
9c90: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
9ca0: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28  nByte = 0;.  if(
9cb0: 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20   p ){.    nByte 
9cc0: 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  = dupedExprNodeS
9cd0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20  ize(p, flags);. 
9ce0: 20 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50     if( flags&EXP
9cf0: 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20  RDUP_REDUCE ){. 
9d00: 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75       nByte += du
9d10: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
9d20: 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64  Left, flags) + d
9d30: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e  upedExprSize(p->
9d40: 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a  pRight, flags);.
9d50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9d60: 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nByte;.}../*.
9d70: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9d80: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
9d90: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c  qlite3ExprDup(),
9da0: 20 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20   except that if 
9db0: 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20  pzBuffer .** is 
9dc0: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70  not NULL then *p
9dd0: 7a 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d  zBuffer is assum
9de0: 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  ed to point to a
9df0: 20 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e   buffer large en
9e00: 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72  ough .** to stor
9e10: 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78  e the copy of ex
9e20: 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20  pression p, the 
9e30: 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a  copies of p->u.z
9e40: 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70  Token.** (if app
9e50: 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68  licable), and th
9e60: 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
9e70: 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e  p->pLeft and p->
9e80: 70 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f  pRight expressio
9e90: 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42  ns,.** if any. B
9ea0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
9eb0: 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65   *pzBuffer is se
9ec0: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  t to the first b
9ed0: 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20  yte past the.** 
9ee0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  portion of the b
9ef0: 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74  uffer copied int
9f00: 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  o by this functi
9f10: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  on..*/.static Ex
9f20: 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69  pr *exprDup(sqli
9f30: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
9f40: 2c 20 69 6e 74 20 64 75 70 46 6c 61 67 73 2c 20  , int dupFlags, 
9f50: 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a  u8 **pzBuffer){.
9f60: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20    Expr *pNew;   
9f70: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
9f80: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
9f90: 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20  u8 *zAlloc;     
9fa0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
9fb0: 73 70 61 63 65 20 66 72 6f 6d 20 77 68 69 63 68  space from which
9fc0: 20 74 6f 20 62 75 69 6c 64 20 45 78 70 72 20 6f   to build Expr o
9fd0: 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 73  bject */.  u32 s
9fe0: 74 61 74 69 63 46 6c 61 67 3b 20 20 20 20 20 20  taticFlag;      
9ff0: 20 2f 2a 20 45 50 5f 53 74 61 74 69 63 20 69 66   /* EP_Static if
a000: 20 73 70 61 63 65 20 6e 6f 74 20 6f 62 74 61 69   space not obtai
a010: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20  ned from malloc 
a020: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  */..  assert( db
a030: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a040: 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   p );.  assert( 
a050: 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64  dupFlags==0 || d
a060: 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  upFlags==EXPRDUP
a070: 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61 73 73  _REDUCE );.  ass
a080: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
a090: 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58   || dupFlags==EX
a0a0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a  PRDUP_REDUCE );.
a0b0: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
a0c0: 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   where to write 
a0d0: 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72  the new Expr str
a0e0: 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28  ucture. */.  if(
a0f0: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
a100: 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66   zAlloc = *pzBuf
a110: 66 65 72 3b 0a 20 20 20 20 73 74 61 74 69 63 46  fer;.    staticF
a120: 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b  lag = EP_Static;
a130: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41  .  }else{.    zA
a140: 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62  lloc = sqlite3Db
a150: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
a160: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c  dupedExprSize(p,
a170: 20 64 75 70 46 6c 61 67 73 29 29 3b 0a 20 20 20   dupFlags));.   
a180: 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b   staticFlag = 0;
a190: 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45  .  }.  pNew = (E
a1a0: 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20  xpr *)zAlloc;.. 
a1b0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
a1c0: 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65   /* Set nNewSize
a1d0: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c   to the size all
a1e0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  ocated for the s
a1f0: 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
a200: 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e   to.    ** by pN
a210: 65 77 2e 20 54 68 69 73 20 69 73 20 65 69 74 68  ew. This is eith
a220: 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  er EXPR_FULLSIZE
a230: 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  , EXPR_REDUCEDSI
a240: 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50  ZE or.    ** EXP
a250: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
a260: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
a270: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
a280: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
a290: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70     ** by the cop
a2a0: 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54  y of the p->u.zT
a2b0: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
a2c0: 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  any)..    */.   
a2d0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
a2e0: 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75  nStructSize = du
a2f0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
a300: 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  e(p, dupFlags);.
a310: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e      const int nN
a320: 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74  ewSize = nStruct
a330: 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20  Size & 0xfff;.  
a340: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20    int nToken;.  
a350: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
a360: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
a370: 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
a380: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e  Token ){.      n
a390: 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53  Token = sqlite3S
a3a0: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
a3b0: 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65  ken) + 1;.    }e
a3c0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65  lse{.      nToke
a3d0: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  n = 0;.    }.   
a3e0: 20 69 66 28 20 64 75 70 46 6c 61 67 73 20 29 7b   if( dupFlags ){
a3f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
a400: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a410: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30  , EP_Reduced)==0
a420: 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
a430: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77  (zAlloc, p, nNew
a440: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Size);.    }else
a450: 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 53 69 7a  {.      u32 nSiz
a460: 65 20 3d 20 28 75 33 32 29 65 78 70 72 53 74 72  e = (u32)exprStr
a470: 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20  uctSize(p);.    
a480: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
a490: 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20   p, nSize);.    
a4a0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52    if( nSize<EXPR
a4b0: 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20  _FULLSIZE ){ .  
a4c0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41        memset(&zA
a4d0: 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20  lloc[nSize], 0, 
a4e0: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53  EXPR_FULLSIZE-nS
a4f0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
a500: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
a510: 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20  the EP_Reduced, 
a520: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e  EP_TokenOnly, an
a530: 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67  d EP_Static flag
a540: 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  s appropriately.
a550: 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c   */.    pNew->fl
a560: 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75  ags &= ~(EP_Redu
a570: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
a580: 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65  |EP_Static|EP_Me
a590: 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65  mToken);.    pNe
a5a0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72  w->flags |= nStr
a5b0: 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65  uctSize & (EP_Re
a5c0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
a5d0: 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66  ly);.    pNew->f
a5e0: 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c  lags |= staticFl
a5f0: 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79  ag;..    /* Copy
a600: 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e   the p->u.zToken
a610: 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e   string, if any.
a620: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b   */.    if( nTok
a630: 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  en ){.      char
a640: 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d   *zToken = pNew-
a650: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
a660: 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53  r*)&zAlloc[nNewS
a670: 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ize];.      memc
a680: 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e  py(zToken, p->u.
a690: 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  zToken, nToken);
a6a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
a6b0: 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e  0==((p->flags|pN
a6c0: 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28 45 50  ew->flags) & (EP
a6d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65  _TokenOnly|EP_Le
a6e0: 61 66 29 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  af)) ){.      /*
a6f0: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65   Fill in the pNe
a700: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20  w->x.pSelect or 
a710: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65  pNew->x.pList me
a720: 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69  mber. */.      i
a730: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
a740: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
a750: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ct) ){.        p
a760: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d  New->x.pSelect =
a770: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
a780: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65  p(db, p->x.pSele
a790: 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  ct, dupFlags);. 
a7a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a7b0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73      pNew->x.pLis
a7c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
a7d0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  istDup(db, p->x.
a7e0: 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67 73 29  pList, dupFlags)
a7f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a800: 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  .    /* Fill in 
a810: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20  pNew->pLeft and 
a820: 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f  pNew->pRight. */
a830: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
a840: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
a850: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
a860: 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69 6e 46 75 6e  enOnly|EP_WinFun
a870: 63 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  c) ){.      zAll
a880: 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e  oc += dupedExprN
a890: 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  odeSize(p, dupFl
a8a0: 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
a8b0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
a8c0: 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65 6e 4f  (pNew, EP_TokenO
a8d0: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
a8e0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
a8f0: 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f  eft = p->pLeft ?
a900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a910: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a920: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50  b, p->pLeft, EXP
a930: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
a940: 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20  lloc) : 0;.     
a950: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
a960: 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20  = p->pRight ?.  
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c       exprDup(db,
a990: 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52   p->pRight, EXPR
a9a0: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
a9b0: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
a9c0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
a9d0: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
a9e0: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
a9f0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
aa00: 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
aa10: 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70 57 69       pNew->y.pWi
aa20: 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  n = sqlite3Windo
aa30: 77 44 75 70 28 64 62 2c 20 70 4e 65 77 2c 20 70  wDup(db, pNew, p
aa40: 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20 20 20  ->y.pWin);.     
aa50: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
aa60: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
aa70: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a   EP_WinFunc) );.
aa80: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f        }.#endif /
aa90: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  * SQLITE_OMIT_WI
aaa0: 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20 20  NDOWFUNC */.    
aab0: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
aac0: 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66  {.        *pzBuf
aad0: 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20  fer = zAlloc;.  
aae0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
aaf0: 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72  .      if( !Expr
ab00: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
ab10: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
ab20: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
ab30: 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d 54 4b  if( pNew->op==TK
ab40: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
ab50: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
ab60: 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65  ->pLeft = p->pLe
ab70: 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ft;.          as
ab80: 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c 75 6d 6e  sert( p->iColumn
ab90: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74  ==0 || p->pRight
aba0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
abb0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
abc0: 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70 52 69  ht==0  || p->pRi
abd0: 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74 20 29 3b  ght==p->pLeft );
abe0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
abf0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
ac00: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
ac10: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
ac20: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eft, 0);.       
ac30: 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d   }.        pNew-
ac40: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
ac50: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
ac60: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
ac70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
ac80: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
ac90: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64  /*.** Create and
aca0: 20 72 65 74 75 72 6e 20 61 20 64 65 65 70 20 63   return a deep c
acb0: 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a 65 63  opy of the objec
acc0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
acd0: 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d  second .** argum
ace0: 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63  ent. If an OOM c
acf0: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f  ondition is enco
ad00: 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73  untered, NULL is
ad10: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
ad20: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
ad30: 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 2e 0a  ailed flag set..
ad40: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
ad50: 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69  E_OMIT_CTE.stati
ad60: 63 20 57 69 74 68 20 2a 77 69 74 68 44 75 70 28  c With *withDup(
ad70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74  sqlite3 *db, Wit
ad80: 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a 70  h *p){.  With *p
ad90: 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Ret = 0;.  if( p
ada0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
adb0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
adc0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
add0: 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a   * (p->nCte-1);.
ade0: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
adf0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
ae00: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  b, nByte);.    i
ae10: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
ae20: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52   int i;.      pR
ae30: 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43  et->nCte = p->nC
ae40: 74 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  te;.      for(i=
ae50: 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b  0; i<p->nCte; i+
ae60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74  +){.        pRet
ae70: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[i].pSelect =
ae80: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
ae90: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53  p(db, p->a[i].pS
aea0: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
aeb0: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43     pRet->a[i].pC
aec0: 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ols = sqlite3Exp
aed0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
aee0: 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a  a[i].pCols, 0);.
aef0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
af00: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
af10: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
af20: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
af30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
af40: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
af50: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
af60: 20 77 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a   withDup(x,y) 0.
af70: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
af80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
af90: 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 54 68 65  OWFUNC./*.** The
afa0: 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e   gatherSelectWin
afb0: 64 6f 77 73 28 29 20 70 72 6f 63 65 64 75 72 65  dows() procedure
afc0: 20 61 6e 64 20 69 74 73 20 68 65 6c 70 65 72 20   and its helper 
afd0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 67 61 74 68 65  routine.** gathe
afe0: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 43 61  rSelectWindowsCa
aff0: 6c 6c 62 61 63 6b 28 29 20 61 72 65 20 75 73 65  llback() are use
b000: 64 20 74 6f 20 73 63 61 6e 20 61 6c 6c 20 74 68  d to scan all th
b010: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
b020: 20 61 6e 20 61 20 6e 65 77 6c 79 20 64 75 70 6c   an a newly dupl
b030: 69 63 61 74 65 64 20 53 45 4c 45 43 54 20 73 74  icated SELECT st
b040: 61 74 65 6d 65 6e 74 20 61 6e 64 20 67 61 74 68  atement and gath
b050: 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 69  er all of the Wi
b060: 6e 64 6f 77 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ndow.** objects 
b070: 66 6f 75 6e 64 20 74 68 65 72 65 2c 20 61 73 73  found there, ass
b080: 65 6d 62 6c 69 6e 67 20 74 68 65 6d 20 6f 6e 74  embling them ont
b090: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
b0a0: 74 20 61 74 20 53 65 6c 65 63 74 2d 3e 70 57 69  t at Select->pWi
b0b0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b0c0: 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e   gatherSelectWin
b0d0: 64 6f 77 73 43 61 6c 6c 62 61 63 6b 28 57 61 6c  dowsCallback(Wal
b0e0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
b0f0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66  pr *pExpr){.  if
b100: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
b110: 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 45 78 70  FUNCTION && pExp
b120: 72 2d 3e 79 2e 70 57 69 6e 21 3d 30 20 29 7b 0a  r->y.pWin!=0 ){.
b130: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
b140: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
b150: 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  r, EP_WinFunc) )
b160: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 70  ;.    pExpr->y.p
b170: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 20 3d 20  Win->pNextWin = 
b180: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65  pWalker->u.pSele
b190: 63 74 2d 3e 70 57 69 6e 3b 0a 20 20 20 20 70 57  ct->pWin;.    pW
b1a0: 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74  alker->u.pSelect
b1b0: 2d 3e 70 57 69 6e 20 3d 20 70 45 78 70 72 2d 3e  ->pWin = pExpr->
b1c0: 79 2e 70 57 69 6e 3b 0a 20 20 7d 0a 20 20 72 65  y.pWin;.  }.  re
b1d0: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
b1e0: 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  e;.}.static int 
b1f0: 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64  gatherSelectWind
b200: 6f 77 73 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  owsSelectCallbac
b210: 6b 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  k(Walker *pWalke
b220: 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
b230: 20 72 65 74 75 72 6e 20 70 3d 3d 70 57 61 6c 6b   return p==pWalk
b240: 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 20 3f 20  er->u.pSelect ? 
b250: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 3a 20 57  WRC_Continue : W
b260: 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 73 74 61 74  RC_Prune;.}.stat
b270: 69 63 20 76 6f 69 64 20 67 61 74 68 65 72 53 65  ic void gatherSe
b280: 6c 65 63 74 57 69 6e 64 6f 77 73 28 53 65 6c 65  lectWindows(Sele
b290: 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72  ct *p){.  Walker
b2a0: 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
b2b0: 6c 62 61 63 6b 20 3d 20 67 61 74 68 65 72 53 65  lback = gatherSe
b2c0: 6c 65 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62  lectWindowsCallb
b2d0: 61 63 6b 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ack;.  w.xSelect
b2e0: 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74 68 65  Callback = gathe
b2f0: 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 53 65  rSelectWindowsSe
b300: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 3b 0a 20 20  lectCallback;.  
b310: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
b320: 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 53  k2 = 0;.  w.u.pS
b330: 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c  elect = p;.  sql
b340: 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
b350: 77 2c 20 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  w, p);.}.#endif.
b360: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
b370: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
b380: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
b390: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
b3a0: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
b3b0: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
b3c0: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
b3d0: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
b3e0: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
b3f0: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
b400: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
b410: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
b420: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
b430: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
b440: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
b450: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
b460: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
b470: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
b480: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
b490: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
b4a0: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
b4b0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
b4c0: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
b4d0: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
b4e0: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
b4f0: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
b500: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
b510: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
b520: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
b530: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
b540: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
b550: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
b560: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
b570: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ted..**.** The f
b580: 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63  lags parameter c
b590: 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e  ontains a combin
b5a0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50  ation of the EXP
b5b0: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
b5c0: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
b5d0: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
b5e0: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73   set, then the s
b5f0: 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
b600: 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61  d is a.** trunca
b610: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ted version of t
b620: 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74  he usual Expr st
b630: 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
b640: 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a  l be stored as.*
b650: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  * part of the in
b660: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
b670: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
b680: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
b690: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
b6a0: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
b6b0: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
b6c0: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
b6d0: 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
b6e0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
b6f0: 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  DUCE );.  return
b700: 20 70 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c   p ? exprDup(db,
b710: 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20   p, flags, 0) : 
b720: 30 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73  0;.}.ExprList *s
b730: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
b740: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
b750: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
b760: 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69  flags){.  ExprLi
b770: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75  st *pNew;.  stru
b780: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
b790: 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74   *pItem, *pOldIt
b7a0: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  em;.  int i;.  E
b7b0: 78 70 72 20 2a 70 50 72 69 6f 72 53 65 6c 65 63  xpr *pPriorSelec
b7c0: 74 43 6f 6c 20 3d 20 30 3b 0a 20 20 61 73 73 65  tCol = 0;.  asse
b7d0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
b7e0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
b7f0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
b800: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
b810: 4e 28 64 62 2c 20 73 71 6c 69 74 65 33 44 62 4d  N(db, sqlite3DbM
b820: 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 29  allocSize(db, p)
b830: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
b840: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b850: 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e  New->nExpr = p->
b860: 6e 45 78 70 72 3b 0a 20 20 70 49 74 65 6d 20 3d  nExpr;.  pItem =
b870: 20 70 4e 65 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64   pNew->a;.  pOld
b880: 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66  Item = p->a;.  f
b890: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
b8a0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
b8b0: 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20  , pOldItem++){. 
b8c0: 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70     Expr *pOldExp
b8d0: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45  r = pOldItem->pE
b8e0: 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
b8f0: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 70 49 74  NewExpr;.    pIt
b900: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  em->pExpr = sqli
b910: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b920: 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b  OldExpr, flags);
b930: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70  .    if( pOldExp
b940: 72 20 0a 20 20 20 20 20 26 26 20 70 4f 6c 64 45  r .     && pOldE
b950: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
b960: 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26  CT_COLUMN.     &
b970: 26 20 28 70 4e 65 77 45 78 70 72 20 3d 20 70 49  & (pNewExpr = pI
b980: 74 65 6d 2d 3e 70 45 78 70 72 29 21 3d 30 20 0a  tem->pExpr)!=0 .
b990: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
b9a0: 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69  ert( pNewExpr->i
b9b0: 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30  Column==0 || i>0
b9c0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e   );.      if( pN
b9d0: 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  ewExpr->iColumn=
b9e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
b9f0: 73 65 72 74 28 20 70 4f 6c 64 45 78 70 72 2d 3e  sert( pOldExpr->
ba00: 70 4c 65 66 74 3d 3d 70 4f 6c 64 45 78 70 72 2d  pLeft==pOldExpr-
ba10: 3e 70 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20  >pRight );.     
ba20: 20 20 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43     pPriorSelectC
ba30: 6f 6c 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70  ol = pNewExpr->p
ba40: 4c 65 66 74 20 3d 20 70 4e 65 77 45 78 70 72 2d  Left = pNewExpr-
ba50: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 7d  >pRight;.      }
ba60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
ba70: 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
ba80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
ba90: 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 21 3d 30 20  em[-1].pExpr!=0 
baa0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
bab0: 74 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f  t( pNewExpr->iCo
bac0: 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e  lumn==pItem[-1].
bad0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31  pExpr->iColumn+1
bae0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
baf0: 72 74 28 20 70 50 72 69 6f 72 53 65 6c 65 63 74  rt( pPriorSelect
bb00: 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70  Col==pItem[-1].p
bb10: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  Expr->pLeft );. 
bb20: 20 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 2d         pNewExpr-
bb30: 3e 70 4c 65 66 74 20 3d 20 70 50 72 69 6f 72 53  >pLeft = pPriorS
bb40: 65 6c 65 63 74 43 6f 6c 3b 0a 20 20 20 20 20 20  electCol;.      
bb50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  }.    }.    pIte
bb60: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
bb70: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
bb80: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
bb90: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
bba0: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
bbb0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bbc0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
bbd0: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d  tem->sortOrder =
bbe0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f   pOldItem->sortO
bbf0: 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  rder;.    pItem-
bc00: 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  >done = 0;.    p
bc10: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
bc20: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70   = pOldItem->bSp
bc30: 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74  anIsTab;.    pIt
bc40: 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 3d  em->bSorterRef =
bc50: 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 6f 72 74   pOldItem->bSort
bc60: 65 72 52 65 66 3b 0a 20 20 20 20 70 49 74 65 6d  erRef;.    pItem
bc70: 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ->u = pOldItem->
bc80: 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  u;.  }.  return 
bc90: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pNew;.}../*.** I
bca0: 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67  f cursors, trigg
bcb0: 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73  ers, views and s
bcc0: 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c  ubqueries are al
bcd0: 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a  l omitted from.*
bce0: 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65  * the build, the
bcf0: 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  n none of the fo
bd00: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
bd10: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a  , except for .**
bd20: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
bd30: 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c  p(), can be call
bd40: 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ed. sqlite3Selec
bd50: 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69  tDup() is someti
bd60: 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  mes.** called wi
bd70: 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65  th a NULL argume
bd80: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  nt..*/.#if !defi
bd90: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
bda0: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
bdb0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
bdc0: 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65  IGGER) \. || !de
bdd0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bde0: 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c  T_SUBQUERY).SrcL
bdf0: 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
be00: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
be10: 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  db, SrcList *p, 
be20: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72  int flags){.  Sr
be30: 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  cList *pNew;.  i
be40: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74  nt i;.  int nByt
be50: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  e;.  assert( db!
be60: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
be70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
be80: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
be90: 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f  ) + (p->nSrc>0 ?
bea0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
beb0: 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a   * (p->nSrc-1) :
bec0: 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71   0);.  pNew = sq
bed0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
bee0: 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  NN(db, nByte );.
bef0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
bf00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
bf10: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
bf20: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
bf30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
bf40: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
bf50: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
bf60: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
bf70: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
bf80: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
bf90: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
bfa0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
bfb0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
bfc0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65   pNewItem->pSche
bfd0: 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ma = pOldItem->p
bfe0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77  Schema;.    pNew
bff0: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
c000: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
c010: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c020: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
c030: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
c040: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
c050: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c060: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
c070: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
c080: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c090: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c  b, pOldItem->zAl
c0a0: 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ias);.    pNewIt
c0b0: 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65  em->fg = pOldIte
c0c0: 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77 49  m->fg;.    pNewI
c0d0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
c0e0: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
c0f0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
c100: 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f  addrFillSub = pO
c110: 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ldItem->addrFill
c120: 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Sub;.    pNewIte
c130: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70  m->regReturn = p
c140: 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  OldItem->regRetu
c150: 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  rn;.    if( pNew
c160: 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
c170: 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4e  edBy ){.      pN
c180: 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ewItem->u1.zInde
c190: 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 44  xedBy = sqlite3D
c1a0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
c1b0: 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
c1c0: 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dBy);.    }.    
c1d0: 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64  pNewItem->pIBInd
c1e0: 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ex = pOldItem->p
c1f0: 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  IBIndex;.    if(
c200: 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73   pNewItem->fg.is
c210: 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  TabFunc ){.     
c220: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46   pNewItem->u1.pF
c230: 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20 20  uncArg = .      
c240: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
c250: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
c260: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
c270: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
c280: 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49      pTab = pNewI
c290: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
c2a0: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
c2b0: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
c2c0: 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b    pTab->nTabRef+
c2d0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
c2e0: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
c2f0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
c300: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c310: 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b  pSelect, flags);
c320: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
c330: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
c340: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c350: 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20  ->pOn, flags);. 
c360: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
c370: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
c380: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
c390: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
c3a0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
c3b0: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
c3c0: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
c3d0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
c3e0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
c3f0: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
c400: 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a  db, IdList *p){.
c410: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
c420: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
c430: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
c440: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
c450: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
c460: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
c470: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
c480: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
c490: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
c4a0: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
c4b0: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
c4c0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c4d0: 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49  cRawNN(db, p->nI
c4e0: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
c4f0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
c500: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
c510: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
c520: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
c530: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e  rn 0;.  }.  /* N
c540: 6f 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ote that because
c550: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c560: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
c570: 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20  p->a[] is not.  
c580: 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61  ** necessarily a
c590: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73   power of two, s
c5a0: 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
c5b0: 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20  nd() may not be 
c5c0: 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74  called.  ** on t
c5d0: 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65  he duplicate cre
c5e0: 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
c5f0: 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28  ction. */.  for(
c600: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69  i=0; i<p->nId; i
c610: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
c620: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  IdList_item *pNe
c630: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
c640: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
c650: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  IdList_item *pOl
c660: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
c670: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
c680: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
c690: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
c6a0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
c6b0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20    pNewItem->idx 
c6c0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b  = pOldItem->idx;
c6d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
c6e0: 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71  ew;.}.Select *sq
c6f0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
c700: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
c710: 63 74 20 2a 70 44 75 70 2c 20 69 6e 74 20 66 6c  ct *pDup, int fl
c720: 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  ags){.  Select *
c730: 70 52 65 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65  pRet = 0;.  Sele
c740: 63 74 20 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ct *pNext = 0;. 
c750: 20 53 65 6c 65 63 74 20 2a 2a 70 70 20 3d 20 26   Select **pp = &
c760: 70 52 65 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pRet;.  Select *
c770: 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  p;..  assert( db
c780: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  !=0 );.  for(p=p
c790: 44 75 70 3b 20 70 3b 20 70 3d 70 2d 3e 70 50 72  Dup; p; p=p->pPr
c7a0: 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
c7b0: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
c7c0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
c7d0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  , sizeof(*p) );.
c7e0: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
c7f0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4e 65  ) break;.    pNe
c800: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
c810: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
c820: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c  b, p->pEList, fl
c830: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
c840: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
c850: 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  cListDup(db, p->
c860: 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20  pSrc, flags);.  
c870: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
c880: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
c890: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66  db, p->pWhere, f
c8a0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lags);.    pNew-
c8b0: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
c8c0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
c8d0: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
c8e0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
c8f0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
c900: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
c910: 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73  ->pHaving, flags
c920: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72  );.    pNew->pOr
c930: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
c940: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
c950: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67  ->pOrderBy, flag
c960: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70  s);.    pNew->op
c970: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e   = p->op;.    pN
c980: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78  ew->pNext = pNex
c990: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  t;.    pNew->pPr
c9a0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  ior = 0;.    pNe
c9b0: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
c9c0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
c9d0: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
c9e0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  ;.    pNew->iLim
c9f0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  it = 0;.    pNew
ca00: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
ca10: 20 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67     pNew->selFlag
ca20: 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  s = p->selFlags 
ca30: 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65  & ~SF_UsesEpheme
ca40: 72 61 6c 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ral;.    pNew->a
ca50: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
ca60: 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61   -1;.    pNew->a
ca70: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
ca80: 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e   -1;.    pNew->n
ca90: 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e  SelectRow = p->n
caa0: 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 70  SelectRow;.    p
cab0: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74  New->pWith = wit
cac0: 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74  hDup(db, p->pWit
cad0: 68 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h);.#ifndef SQLI
cae0: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
caf0: 4e 43 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69  NC.    pNew->pWi
cb00: 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  n = 0;.    pNew-
cb10: 3e 70 57 69 6e 44 65 66 6e 20 3d 20 73 71 6c 69  >pWinDefn = sqli
cb20: 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 75 70  te3WindowListDup
cb30: 28 64 62 2c 20 70 2d 3e 70 57 69 6e 44 65 66 6e  (db, p->pWinDefn
cb40: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57  );.    if( p->pW
cb50: 69 6e 20 29 20 67 61 74 68 65 72 53 65 6c 65 63  in ) gatherSelec
cb60: 74 57 69 6e 64 6f 77 73 28 70 4e 65 77 29 3b 0a  tWindows(pNew);.
cb70: 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 77 2d  #endif.    pNew-
cb80: 3e 73 65 6c 49 64 20 3d 20 70 2d 3e 73 65 6c 49  >selId = p->selI
cb90: 64 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 4e 65  d;.    *pp = pNe
cba0: 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70 4e 65  w;.    pp = &pNe
cbb0: 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  w->pPrior;.    p
cbc0: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  Next = pNew;.  }
cbd0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
cbe0: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
cbf0: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
cc00: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
cc10: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
cc20: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
cc30: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
cc40: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
cc50: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
cc60: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
cc70: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
cc80: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
cc90: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
cca0: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
ccb0: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
ccc0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
ccd0: 2a 20 54 68 65 20 70 4c 69 73 74 20 61 72 67 75  * The pList argu
cce0: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 69 74  ment must be eit
ccf0: 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 70 6f  her NULL or a po
cd00: 69 6e 74 65 72 20 74 6f 20 61 6e 20 45 78 70 72  inter to an Expr
cd10: 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  List.** obtained
cd20: 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 61   from a prior ca
cd30: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ll to sqlite3Exp
cd40: 72 4c 69 73 74 41 70 70 65 6e 64 28 29 2e 20 20  rListAppend().  
cd50: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
cd60: 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20  may not be used 
cd70: 77 69 74 68 20 61 6e 20 45 78 70 72 4c 69 73 74  with an ExprList
cd80: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
cd90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
cda0: 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f 6e 3a 20  p()..** Reason: 
cdb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
cdc0: 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 6e  sumes that the n
cdd0: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69  umber of slots i
cde0: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a 2a 2a 20  n pList->a[].** 
cdf0: 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  is a power of tw
ce00: 6f 2e 20 20 54 68 61 74 20 69 73 20 74 72 75 65  o.  That is true
ce10: 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72   for sqlite3Expr
ce20: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 65 74  ListAppend() ret
ce30: 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69 73 20 6e  urns.** but is n
ce40: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74  ot necessarily t
ce50: 72 75 65 20 66 72 6f 6d 20 74 68 65 20 72 65 74  rue from the ret
ce60: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
ce70: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
ce80: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  )..**.** If a me
ce90: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
cea0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
ceb0: 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73  e entire list is
cec0: 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55   freed and.** NU
ced0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  LL is returned. 
cee0: 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20   If non-NULL is 
cef0: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69  returned, then i
cf00: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  t is guaranteed.
cf10: 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ** that the new 
cf20: 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73  entry was succes
cf30: 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e  sfully appended.
cf40: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
cf50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
cf60: 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  end(.  Parse *pP
cf70: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
cf80: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
cf90: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
cfa0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
cfb0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
cfc0: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
cfd0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
cfe0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
cff0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
d000: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
d010: 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  ed. Might be NUL
d020: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  L */.){.  struct
d030: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
d040: 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
d050: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d060: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
d070: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
d080: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
d090: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
d0a0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
d0b0: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
d0c0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
d0d0: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
d0e0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
d0f0: 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d    pList->nExpr =
d100: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
d110: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20  (pList->nExpr & 
d120: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  (pList->nExpr-1)
d130: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  )==0 ){.    Expr
d140: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
d150: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
d160: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
d170: 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
d180: 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 2b   sizeof(*pList)+
d190: 28 32 2a 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  (2*pList->nExpr 
d1a0: 2d 20 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73  - 1)*sizeof(pLis
d1b0: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
d1c0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
d1d0: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
d1e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
d1f0: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
d200: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
d210: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
d220: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
d230: 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72  etof(struct Expr
d240: 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29  List_item,zName)
d250: 3d 3d 73 69 7a 65 6f 66 28 70 49 74 65 6d 2d 3e  ==sizeof(pItem->
d260: 70 45 78 70 72 29 20 29 3b 0a 20 20 61 73 73 65  pExpr) );.  asse
d270: 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73 74 72  rt( offsetof(str
d280: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d290: 6d 2c 70 45 78 70 72 29 3d 3d 30 20 29 3b 0a 20  m,pExpr)==0 );. 
d2a0: 20 6d 65 6d 73 65 74 28 26 70 49 74 65 6d 2d 3e   memset(&pItem->
d2b0: 7a 4e 61 6d 65 2c 30 2c 73 69 7a 65 6f 66 28 2a  zName,0,sizeof(*
d2c0: 70 49 74 65 6d 29 2d 6f 66 66 73 65 74 6f 66 28  pItem)-offsetof(
d2d0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d2e0: 69 74 65 6d 2c 7a 4e 61 6d 65 29 29 3b 0a 20 20  item,zName));.  
d2f0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
d300: 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  Expr;.  return p
d310: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
d320: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
d330: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
d340: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
d350: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
d360: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
d370: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
d380: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
d390: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
d3a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d3b0: 70 43 6f 6c 75 6d 6e 73 20 61 6e 64 20 70 45 78  pColumns and pEx
d3c0: 70 72 20 66 6f 72 6d 20 61 20 76 65 63 74 6f 72  pr form a vector
d3d0: 20 61 73 73 69 67 6e 6d 65 6e 74 20 77 68 69 63   assignment whic
d3e0: 68 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  h is part of the
d3f0: 20 53 45 54 0a 2a 2a 20 63 6c 61 75 73 65 20 6f   SET.** clause o
d400: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
d410: 65 6d 65 6e 74 2e 20 20 4c 69 6b 65 20 74 68 69  ement.  Like thi
d420: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
d430: 28 61 2c 62 2c 63 29 20 3d 20 28 65 78 70 72 31  (a,b,c) = (expr1
d440: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
d450: 20 4f 72 3a 20 20 20 20 28 61 2c 62 2c 63 29 20   Or:    (a,b,c) 
d460: 3d 20 28 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20  = (SELECT x,y,z 
d470: 46 52 4f 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  FROM ....).**.**
d480: 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f   For each term o
d490: 66 20 74 68 65 20 76 65 63 74 6f 72 20 61 73 73  f the vector ass
d4a0: 69 67 6e 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20  ignment, append 
d4b0: 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74  new entries to t
d4c0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
d4d0: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 20 49 6e   list pList.  In
d4e0: 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 73   the case of a s
d4f0: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 52  ubquery on the R
d500: 48 53 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 54 4b  HS, append.** TK
d510: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 65  _SELECT_COLUMN e
d520: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 45  xpressions..*/.E
d530: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
d540: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65  ExprListAppendVe
d550: 63 74 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  ctor(.  Parse *p
d560: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
d570: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d580: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
d590: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  *pList,       /*
d5a0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
d5b0: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
d5c0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 64 4c  be NULL */.  IdL
d5d0: 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20  ist *pColumns,  
d5e0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e      /* List of n
d5f0: 61 6d 65 73 20 6f 66 20 4c 48 53 20 6f 66 20 74  ames of LHS of t
d600: 68 65 20 61 73 73 69 67 6e 6d 65 6e 74 20 2a 2f  he assignment */
d610: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
d620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63            /* Vec
d630: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74  tor expression t
d640: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
d650: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
d660: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
d670: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
d680: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b   int n;.  int i;
d690: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
d6a0: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
d6b0: 45 78 70 72 20 3a 20 30 3b 0a 20 20 2f 2a 20 70  Expr : 0;.  /* p
d6c0: 43 6f 6c 75 6d 6e 73 20 63 61 6e 20 6f 6e 6c 79  Columns can only
d6d0: 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20   be NULL due to 
d6e0: 61 6e 20 4f 4f 4d 20 62 75 74 20 61 6e 20 4f 4f  an OOM but an OO
d6f0: 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 61 6e 0a  M will cause an.
d700: 20 20 2a 2a 20 65 78 69 74 20 70 72 69 6f 72 20    ** exit prior 
d710: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
d720: 62 65 69 6e 67 20 69 6e 76 6f 6b 65 64 20 2a 2f  being invoked */
d730: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 6f  .  if( NEVER(pCo
d740: 6c 75 6d 6e 73 3d 3d 30 29 20 29 20 67 6f 74 6f  lumns==0) ) goto
d750: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
d760: 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70  rror;.  if( pExp
d770: 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74  r==0 ) goto vect
d780: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
d790: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48  ..  /* If the RH
d7a0: 53 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20 74  S is a vector, t
d7b0: 68 65 6e 20 77 65 20 63 61 6e 20 69 6d 6d 65 64  hen we can immed
d7c0: 69 61 74 65 6c 79 20 63 68 65 63 6b 20 74 6f 20  iately check to 
d7d0: 73 65 65 20 74 68 61 74 20 0a 20 20 2a 2a 20 74  see that .  ** t
d7e0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 52  he size of the R
d7f0: 48 53 20 61 6e 64 20 4c 48 53 20 6d 61 74 63 68  HS and LHS match
d800: 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 52 48  .  But if the RH
d810: 53 20 69 73 20 61 20 53 45 4c 45 43 54 2c 20 0a  S is a SELECT, .
d820: 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 73 20 28    ** wildcards (
d830: 22 2a 22 29 20 69 6e 20 74 68 65 20 72 65 73 75  "*") in the resu
d840: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
d850: 4c 45 43 54 20 6d 75 73 74 20 62 65 20 65 78 70  LECT must be exp
d860: 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 20 20 2a  anded before.  *
d870: 2a 20 77 65 20 63 61 6e 20 64 6f 20 74 68 65 20  * we can do the 
d880: 73 69 7a 65 20 63 68 65 63 6b 2c 20 73 6f 20 64  size check, so d
d890: 65 66 65 72 20 74 68 65 20 73 69 7a 65 20 63 68  efer the size ch
d8a0: 65 63 6b 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  eck until code g
d8b0: 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  eneration..  */.
d8c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
d8d0: 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 43  =TK_SELECT && pC
d8e0: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 21 3d 28 6e 3d  olumns->nId!=(n=
d8f0: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
d900: 72 53 69 7a 65 28 70 45 78 70 72 29 29 20 29 7b  rSize(pExpr)) ){
d910: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
d920: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
d930: 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65   columns assigne
d940: 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  d %d values",.  
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c    pColumns->nId,
d970: 20 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65   n);.    goto ve
d980: 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f  ctor_append_erro
d990: 72 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  r;.  }..  for(i=
d9a0: 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 73 2d 3e 6e  0; i<pColumns->n
d9b0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  Id; i++){.    Ex
d9c0: 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20 73  pr *pSubExpr = s
d9d0: 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63  qlite3ExprForVec
d9e0: 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c  torField(pParse,
d9f0: 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20 20   pExpr, i);.    
da00: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
da10: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
da20: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53 75  arse, pList, pSu
da30: 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  bExpr);.    if( 
da40: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61  pList ){.      a
da50: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
da60: 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31 20  xpr==iFirst+i+1 
da70: 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  );.      pList->
da80: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
da90: 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75 6d  ].zName = pColum
daa0: 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  ns->a[i].zName;.
dab0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d 3e        pColumns->
dac0: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[i].zName = 0;.
dad0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
dae0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
daf0: 65 64 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  ed && pExpr->op=
db00: 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 41 4c  =TK_SELECT && AL
db10: 57 41 59 53 28 70 4c 69 73 74 21 3d 30 29 20 29  WAYS(pList!=0) )
db20: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 46 69 72  {.    Expr *pFir
db30: 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 46  st = pList->a[iF
db40: 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20 20 20  irst].pExpr;.   
db50: 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74 21   assert( pFirst!
db60: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
db70: 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d 54 4b  ( pFirst->op==TK
db80: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
db90: 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53  ;.     .    /* S
dba0: 74 6f 72 65 20 74 68 65 20 53 45 4c 45 43 54 20  tore the SELECT 
dbb0: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 70 52 69  statement in pRi
dbc0: 67 68 74 20 73 6f 20 69 74 20 77 69 6c 6c 20 62  ght so it will b
dbd0: 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 0a 20  e deleted when. 
dbe0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70     ** sqlite3Exp
dbf0: 72 4c 69 73 74 44 65 6c 65 74 65 28 29 20 69 73  rListDelete() is
dc00: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 70   called */.    p
dc10: 46 69 72 73 74 2d 3e 70 52 69 67 68 74 20 3d 20  First->pRight = 
dc20: 70 45 78 70 72 3b 0a 20 20 20 20 70 45 78 70 72  pExpr;.    pExpr
dc30: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65   = 0;..    /* Re
dc40: 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a 65 20  member the size 
dc50: 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 69 54  of the LHS in iT
dc60: 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77 65 20  able so that we 
dc70: 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74 0a 20  can check that. 
dc80: 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 61 6e     ** the RHS an
dc90: 64 20 4c 48 53 20 73 69 7a 65 73 20 6d 61 74 63  d LHS sizes matc
dca0: 68 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65  h during code ge
dcb0: 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  neration. */.   
dcc0: 20 70 46 69 72 73 74 2d 3e 69 54 61 62 6c 65 20   pFirst->iTable 
dcd0: 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b  = pColumns->nId;
dce0: 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61 70 70  .  }..vector_app
dcf0: 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  end_error:.  sql
dd00: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
dd10: 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c  b, pExpr);.  sql
dd20: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
dd30: 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a  (db, pColumns);.
dd40: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
dd50: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
dd60: 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20   sort order for 
dd70: 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
dd80: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 45 78   on the given Ex
dd90: 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  prList..*/.void 
dda0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
ddb0: 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78 70 72  etSortOrder(Expr
ddc0: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f  List *p, int iSo
ddd0: 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66 28 20  rtOrder){.  if( 
dde0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
ddf0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
de00: 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20 26  SO_UNDEFINED<0 &
de10: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e  & SQLITE_SO_ASC>
de20: 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f  =0 && SQLITE_SO_
de30: 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73 65  DESC>0 );.  asse
de40: 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29  rt( p->nExpr>0 )
de50: 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64  ;.  if( iSortOrd
de60: 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73 73 65  er<0 ){.    asse
de70: 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70  rt( p->a[p->nExp
de80: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d  r-1].sortOrder==
de90: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b  SQLITE_SO_ASC );
dea0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
deb0: 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  .  p->a[p->nExpr
dec0: 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  -1].sortOrder = 
ded0: 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a  (u8)iSortOrder;.
dee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
def0: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e   ExprList.a[].zN
df00: 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ame element of t
df10: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
df20: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
df30: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
df40: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
df50: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
df60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
df70: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e  M error.  But pN
df80: 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  ame should never
df90: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
dfa0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
dfb0: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
dfc0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
dfd0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
dfe0: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
dff0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e000: 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  SetName(.  Parse
e010: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e020: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e030: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
e040: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
e050: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
e060: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
e070: 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pan. */.  Token 
e080: 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
e090: 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20    /* Name to be 
e0a0: 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  added */.  int d
e0b0: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
e0c0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61     /* True to ca
e0d0: 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20  use the name to 
e0e0: 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29  be dequoted */.)
e0f0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  {.  assert( pLis
e100: 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  t!=0 || pParse->
e110: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e120: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
e130: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
e140: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
e150: 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72  pItem;.    asser
e160: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
e170: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
e180: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
e190: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
e1a0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a  assert( pItem->z
e1b0: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
e1c0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
e1d0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
e1e0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
e1f0: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
e200: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
e210: 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65  ) sqlite3Dequote
e220: 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
e230: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
e240: 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
e250: 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
e260: 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20  okenMap(pParse, 
e270: 28 76 6f 69 64 2a 29 70 49 74 65 6d 2d 3e 7a 4e  (void*)pItem->zN
e280: 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ame, pName);.   
e290: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
e2a0: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
e2b0: 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65  .a[].zSpan eleme
e2c0: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
e2d0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
e2e0: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
e2f0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
e300: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
e310: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
e320: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
e330: 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c   But pSpan shoul
e340: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
e350: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
e360: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
e370: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
e380: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e390: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
e3a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
e3b0: 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a  xprListSetSpan(.
e3c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e3d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
e3e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
e3f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
e400: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
e410: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
e420: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
e430: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
e440: 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74 61 72  art,     /* Star
e450: 74 20 6f 66 20 74 68 65 20 73 70 61 6e 20 2a 2f  t of the span */
e460: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e470: 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  End        /* En
e480: 64 20 6f 66 20 74 68 65 20 73 70 61 6e 20 2a 2f  d of the span */
e490: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
e4a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
e4b0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
e4c0: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
e4d0: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
e4e0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
e4f0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
e500: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
e510: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
e520: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
e530: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
e540: 72 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  r>0 );.    sqlit
e550: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
e560: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
e570: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
e580: 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75 70 28  qlite3DbSpanDup(
e590: 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64  db, zStart, zEnd
e5a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
e5b0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
e5c0: 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f  n list pEList co
e5d0: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
e5e0: 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73   iLimit elements
e5f0: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
e600: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
e610: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
e620: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
e630: 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72  eckLength(.  Par
e640: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
e650: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a  prList *pEList,.
e660: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
e670: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d  bject.){.  int m
e680: 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  x = pParse->db->
e690: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
e6a0: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74  MIT_COLUMN];.  t
e6b0: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
e6c0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
e6d0: 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61  ==mx );.  testca
e6e0: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
e6f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b  List->nExpr==mx+
e700: 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  1 );.  if( pELis
e710: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
e720: 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c  pr>mx ){.    sql
e730: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
e740: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
e750: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
e760: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
e770: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
e780: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
e790: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  n list..*/.stati
e7a0: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
e7b0: 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73 74 44  E void exprListD
e7c0: 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20  eleteNN(sqlite3 
e7d0: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
e7e0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 20 3d  List){.  int i =
e7f0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
e800: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
e810: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 20  _item *pItem =  
e820: 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73 73 65  pList->a;.  asse
e830: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
e840: 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  >0 );.  do{.    
e850: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
e860: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78  e(db, pItem->pEx
e870: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
e880: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
e890: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
e8a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e8b0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
e8c0: 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 7d 77     pItem++;.  }w
e8d0: 68 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b 0a 20  hile( --i>0 );. 
e8e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
e8f0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76  (db, pList);.}.v
e900: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
e910: 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
e920: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
e930: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  *pList){.  if( p
e940: 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73 74 44  List ) exprListD
e950: 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73  eleteNN(db, pLis
e960: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
e970: 75 72 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d  urn the bitwise-
e980: 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66  OR of all Expr.f
e990: 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74  lags fields in t
e9a0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72  he given.** Expr
e9b0: 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  List..*/.u32 sql
e9c0: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
e9d0: 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74  s(const ExprList
e9e0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
e9f0: 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a  i;.  u32 m = 0;.
ea00: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
ea10: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
ea20: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
ea30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 45 78 70 72   i++){.     Expr
ea40: 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   *pExpr = pList-
ea50: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
ea60: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21    assert( pExpr!
ea70: 3d 30 20 29 3b 0a 20 20 20 20 20 6d 20 7c 3d 20  =0 );.     m |= 
ea80: 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20  pExpr->flags;.  
ea90: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a  }.  return m;.}.
eaa0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
eab0: 20 53 45 4c 45 43 54 2d 6e 6f 64 65 20 63 61 6c   SELECT-node cal
eac0: 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 65 78  lback for the ex
ead0: 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72 20  pression walker 
eae0: 74 68 61 74 0a 2a 2a 20 61 6c 77 61 79 73 20 22  that.** always "
eaf0: 66 61 69 6c 73 22 2e 20 20 42 79 20 22 66 61 69  fails".  By "fai
eb00: 6c 22 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c  l" in this case,
eb10: 20 77 65 20 6d 65 61 6e 20 73 65 74 0a 2a 2a 20   we mean set.** 
eb20: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74  pWalker->eCode t
eb30: 6f 20 7a 65 72 6f 20 61 6e 64 20 61 62 6f 72 74  o zero and abort
eb40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
eb50: 6c 62 61 63 6b 20 69 73 20 75 73 65 64 20 62 79  lback is used by
eb60: 20 6d 75 6c 74 69 70 6c 65 20 65 78 70 72 65 73   multiple expres
eb70: 73 69 6f 6e 20 77 61 6c 6b 65 72 73 2e 0a 2a 2f  sion walkers..*/
eb80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
eb90: 63 74 57 61 6c 6b 46 61 69 6c 28 57 61 6c 6b 65  ctWalkFail(Walke
eba0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
ebb0: 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  ct *NotUsed){.  
ebc0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
ebd0: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61  (NotUsed);.  pWa
ebe0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
ebf0: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62  .  return WRC_Ab
ec00: 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  ort;.}../*.** If
ec10: 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65   the input expre
ec20: 73 73 69 6f 6e 20 69 73 20 61 6e 20 49 44 20 77  ssion is an ID w
ec30: 69 74 68 20 74 68 65 20 6e 61 6d 65 20 22 74 72  ith the name "tr
ec40: 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22 0a 2a  ue" or "false".*
ec50: 2a 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 69  * then convert i
ec60: 74 20 69 6e 74 6f 20 61 6e 20 54 4b 5f 54 52 55  t into an TK_TRU
ec70: 45 46 41 4c 53 45 20 74 65 72 6d 2e 20 20 52 65  EFALSE term.  Re
ec80: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
ec90: 0a 2a 2a 20 74 68 65 20 63 6f 6e 76 65 72 73 69  .** the conversi
eca0: 6f 6e 20 68 61 70 70 65 6e 65 64 2c 20 61 6e 64  on happened, and
ecb0: 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70   zero if the exp
ecc0: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 61 6c 74  ression is unalt
ecd0: 65 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ered..*/.int sql
ece0: 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75 65  ite3ExprIdToTrue
ecf0: 46 61 6c 73 65 28 45 78 70 72 20 2a 70 45 78 70  False(Expr *pExp
ed00: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45  r){.  assert( pE
ed10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c  xpr->op==TK_ID |
ed20: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
ed30: 53 54 52 49 4e 47 20 29 3b 0a 20 20 69 66 28 20  STRING );.  if( 
ed40: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
ed50: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
ed60: 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 7c 7c  "true")==0.   ||
ed70: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
ed80: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
ed90: 20 22 66 61 6c 73 65 22 29 3d 3d 30 0a 20 20 29   "false")==0.  )
eda0: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  {.    pExpr->op 
edb0: 3d 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3b 0a  = TK_TRUEFALSE;.
edc0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
edd0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
ede0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
edf0: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20 54 4b  ent must be a TK
ee00: 5f 54 52 55 45 46 41 4c 53 45 20 45 78 70 72 20  _TRUEFALSE Expr 
ee10: 6e 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 31 20  node.  Return 1 
ee20: 69 66 20 69 74 20 69 73 20 54 52 55 45 0a 2a 2a  if it is TRUE.**
ee30: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 73 20   and 0 if it is 
ee40: 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  FALSE..*/.int sq
ee50: 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
ee60: 6c 75 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  lue(const Expr *
ee70: 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74  pExpr){.  assert
ee80: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
ee90: 54 52 55 45 46 41 4c 53 45 20 29 3b 0a 20 20 61  TRUEFALSE );.  a
eea0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
eeb0: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
eec0: 54 6f 6b 65 6e 2c 22 74 72 75 65 22 29 3d 3d 30  Token,"true")==0
eed0: 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
eee0: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
eef0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 66 61 6c 73 65  >u.zToken,"false
ef00: 22 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  ")==0 );.  retur
ef10: 6e 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  n pExpr->u.zToke
ef20: 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  n[4]==0;.}.../*.
ef30: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
ef40: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
ef50: 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63  lbacks used to c
ef60: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73  heck expressions
ef70: 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68   to.** see if th
ef80: 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74  ey are "constant
ef90: 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e  " for some defin
efa0: 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e  ition of constan
efb0: 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65  t.  The.** Walke
efc0: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65  r.eCode value de
efd0: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70  termines the typ
efe0: 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20  e of "constant" 
eff0: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a  we are looking.*
f000: 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  * for..**.** The
f010: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
f020: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
f030: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
f040: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
f050: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
f060: 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  sConstant()     
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
f080: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a  lker->eCode==1.*
f090: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
f0a0: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
f0b0: 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70  in()           p
f0c0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
f0d0: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
f0e0: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
f0f0: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
f100: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f110: 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =3.**     sqlite
f120: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
f130: 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20  rFunction()     
f140: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
f150: 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20  e==4 or 5.**.** 
f160: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68  In all cases, th
f170: 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20  e callbacks set 
f180: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61  Walker.eCode=0 a
f190: 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20  nd abort if the 
f1a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
f1b0: 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65   found to not be
f1c0: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a   a constant..**.
f1d0: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
f1e0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
f1f0: 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64  nction() is used
f200: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
f210: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69  expressions.** i
f220: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
f230: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
f240: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
f250: 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61  lue is 5 when pa
f260: 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73  rsing.** an exis
f270: 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20  ting schema and 
f280: 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  4 when processin
f290: 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  g a new statemen
f2a0: 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70  t.  A bound.** p
f2b0: 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20  arameter raises 
f2c0: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77  an error for new
f2d0: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74   statements, but
f2e0: 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e   is silently con
f2f0: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c  verted.** to NUL
f300: 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73  L for existing s
f310: 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c  chemas.  This al
f320: 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74  lows sqlite_mast
f330: 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a  er tables that .
f340: 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75  ** contain a bou
f350: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63  nd parameter bec
f360: 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67  ause they were g
f370: 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65  enerated by olde
f380: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
f390: 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61   SQLite to be pa
f3a0: 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  rsed by newer ve
f3b0: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
f3c0: 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67   without raising
f3d0: 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20   a.** malformed 
f3e0: 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f  schema error..*/
f3f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
f400: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
f410: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
f420: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
f430: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
f440: 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20  eCode is 2 then 
f450: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
f460: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
f470: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
f480: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
f490: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66  clauses of a lef
f4a0: 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  t join disqualif
f4b0: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
f4c0: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
f4d0: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
f4e0: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
f4f0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f500: 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =2 && ExprHasPro
f510: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f520: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
f530: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
f540: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
f550: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
f560: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
f570: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
f580: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
f590: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
f5a0: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
f5b0: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
f5c0: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
f5d0: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65  ither pWalker->e
f5e0: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20  Code==4 or 5 or 
f5f0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  the function has
f600: 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49   the.    ** SQLI
f610: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c  TE_FUNC_CONST fl
f620: 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ag. */.    case 
f630: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
f640: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
f650: 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72  eCode>=4 || Expr
f660: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
f670: 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20  r,EP_ConstFunc) 
f680: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f690: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
f6a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f6b0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f6c0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
f6d0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
f6e0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
f6f0: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 20  ase TK_ID:.     
f700: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 74 72 75   /* Convert "tru
f710: 65 22 20 6f 72 20 22 66 61 6c 73 65 22 20 69 6e  e" or "false" in
f720: 20 61 20 44 45 46 41 55 4c 54 20 63 6c 61 75 73   a DEFAULT claus
f730: 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
f740: 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20   ** appropriate 
f750: 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 6f 70 65  TK_TRUEFALSE ope
f760: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  rator */.      i
f770: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 64  f( sqlite3ExprId
f780: 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45 78 70  ToTrueFalse(pExp
f790: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
f7a0: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
f7b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
f7c0: 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   Fall thru */.  
f7d0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
f7e0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
f7f0: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
f800: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
f810: 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  MN:.      testca
f820: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
f830: 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65  K_ID );.      te
f840: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
f850: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
f860: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f870: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
f880: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
f890: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
f8a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
f8b0: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
f8c0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
f8d0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 69  rty(pExpr, EP_Fi
f8e0: 78 65 64 43 6f 6c 29 20 26 26 20 70 57 61 6c 6b  xedCol) && pWalk
f8f0: 65 72 2d 3e 65 43 6f 64 65 21 3d 32 20 29 7b 0a  er->eCode!=2 ){.
f900: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
f910: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
f920: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
f930: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33  Walker->eCode==3
f940: 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
f950: 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43  e==pWalker->u.iC
f960: 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ur ){.        re
f970: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
f980: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
f990: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
f9a0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
f9b0: 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a 20 20 20  IF_NULL_ROW:.   
f9c0: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
f9d0: 52 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  R:.      testcas
f9e0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
f9f0: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20  _REGISTER );.   
fa00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
fa10: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55  pr->op==TK_IF_NU
fa20: 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20 20 20 20  LL_ROW );.      
fa30: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
fa40: 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
fa50: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
fa60: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
fa70: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
fa80: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b  ker->eCode==5 ){
fa90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65  .        /* Sile
faa0: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75  ntly convert bou
fab0: 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  nd parameters th
fac0: 61 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65  at appear inside
fad0: 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20   of CREATE.     
fae0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
faf0: 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65   into a NULL whe
fb00: 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52  n parsing the CR
fb10: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  EATE statement t
fb20: 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20  ext out.        
fb30: 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ** of the sqlite
fb40: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f  _master table */
fb50: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
fb60: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
fb70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
fb80: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
fb90: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
fba0: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
fbb0: 69 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74  in a CREATE stat
fbc0: 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69  ement that origi
fbd0: 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20  nates from.     
fbe0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72     ** sqlite3_pr
fbf0: 65 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61  epare() causes a
fc00: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
fc10: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
fc20: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
fc30: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
fc40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
fc50: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
fc60: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  /.    default:. 
fc70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
fc80: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
fc90: 45 43 54 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65  ECT ); /* sqlite
fca0: 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28  3SelectWalkFail(
fcb0: 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f 0a 20  ) disallows */. 
fcc0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
fcd0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
fce0: 53 54 53 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65  STS ); /* sqlite
fcf0: 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28  3SelectWalkFail(
fd00: 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f 0a 20  ) disallows */. 
fd10: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
fd20: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
fd30: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
fd40: 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20  sConst(Expr *p, 
fd50: 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e  int initFlag, in
fd60: 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65  t iCur){.  Walke
fd70: 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  r w;.  w.eCode =
fd80: 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78   initFlag;.  w.x
fd90: 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
fda0: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
fdb0: 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  t;.  w.xSelectCa
fdc0: 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
fdd0: 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a  SelectWalkFail;.
fde0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
fdf0: 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  BUG.  w.xSelectC
fe00: 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74  allback2 = sqlit
fe10: 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65  e3SelectWalkAsse
fe20: 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 77 2e  rt2;.#endif.  w.
fe30: 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  u.iCur = iCur;. 
fe40: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
fe50: 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
fe60: 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
fe70: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
fe80: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
fe90: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
fea0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
feb0: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61  is constant.** a
fec0: 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  nd 0 if it invol
fed0: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
fee0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e   function calls.
fef0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
ff00: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
ff10: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
ff20: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
ff30: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
ff40: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
ff50: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
ff60: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
ff70: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
ff80: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
ff90: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ffa0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45  ExprIsConstant(E
ffb0: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
ffc0: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
ffd0: 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   1, 0);.}../*.**
ffe0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
fff0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
10000 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a  n non-zero if.**
10010 0a 2a 2a 20 20 20 28 31 29 20 74 68 65 20 65 78  .**   (1) the ex
10020 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
10030 74 61 6e 74 2c 20 61 6e 64 0a 2a 2a 20 20 20 28  tant, and.**   (
10040 32 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  2) the expressio
10050 6e 20 64 6f 65 73 20 6f 72 69 67 69 6e 61 74 65  n does originate
10060 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
10070 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  ING clause.**   
10080 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f      of a LEFT JO
10090 49 4e 2c 20 61 6e 64 0a 2a 2a 20 20 20 28 33 29  IN, and.**   (3)
100a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
100b0 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
100c0 20 61 6e 79 20 45 50 5f 46 69 78 65 64 43 6f 6c   any EP_FixedCol
100d0 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 20 20   TK_COLUMN.**   
100e0 20 20 20 20 6f 70 65 72 61 6e 64 73 20 63 72 65      operands cre
100f0 61 74 65 64 20 62 79 20 74 68 65 20 63 6f 6e 73  ated by the cons
10100 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  tant propagation
10110 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
10120 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
10130 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
10140 72 75 65 2c 20 69 74 20 69 6e 64 69 63 61 74 65  rue, it indicate
10150 73 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  s that the expre
10160 73 73 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ssion.** can be 
10170 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61  added to the pPa
10180 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20  rse->pConstExpr 
10190 6c 69 73 74 20 61 6e 64 20 65 76 61 6c 75 61 74  list and evaluat
101a0 65 64 20 6f 6e 63 65 20 77 68 65 6e 0a 2a 2a 20  ed once when.** 
101b0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
101c0 74 65 6d 65 6e 74 20 73 74 61 72 74 73 20 75 70  tement starts up
101d0 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
101e0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 29 2e 0a  prCodeAtInit()..
101f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
10200 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
10210 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oin(Expr *p){.  
10220 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
10230 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a  st(p, 2, 0);.}..
10240 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
10250 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
10260 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
10270 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
10280 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
10290 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65 20   for any single 
102a0 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65  row of the table
102b0 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75   with cursor iCu
102c0 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
102d0 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  ds, the.** expre
102e0 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 72  ssion must not r
102f0 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d  efer to any non-
10300 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75  deterministic fu
10310 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a  nction nor any.*
10320 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68  * table other th
10330 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20  an iCur..*/.int 
10340 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
10350 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  leConstant(Expr 
10360 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20  *p, int iCur){. 
10370 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
10380 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72 29 3b  nst(p, 3, iCur);
10390 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  .}.../*.** sqlit
103a0 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c  e3WalkExpr() cal
103b0 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 73 71  lback used by sq
103c0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
103d0 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 29 2e 0a  antOrGroupBy()..
103e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
103f0 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
10400 4f 72 47 72 6f 75 70 42 79 28 57 61 6c 6b 65 72  OrGroupBy(Walker
10410 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
10420 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 4c  *pExpr){.  ExprL
10430 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20  ist *pGroupBy = 
10440 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 47 72 6f 75  pWalker->u.pGrou
10450 70 42 79 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  pBy;.  int i;.. 
10460 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78   /* Check if pEx
10470 70 72 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20  pr is identical 
10480 74 6f 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20  to any GROUP BY 
10490 74 65 72 6d 2e 20 49 66 20 73 6f 2c 20 63 6f 6e  term. If so, con
104a0 73 69 64 65 72 0a 20 20 2a 2a 20 69 74 20 63 6f  sider.  ** it co
104b0 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a 20 20 66 6f  nstant.  */.  fo
104c0 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
104d0 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
104e0 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 47      Expr *p = pG
104f0 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
10500 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  pr;.    if( sqli
10510 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
10520 2c 20 70 45 78 70 72 2c 20 70 2c 20 2d 31 29 3c  , pExpr, p, -1)<
10530 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
10540 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
10550 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
10560 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65  (pWalker->pParse
10570 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , p);.      if( 
10580 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28  sqlite3IsBinary(
10590 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  pColl) ){.      
105a0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
105b0 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
105c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
105d0 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  k if pExpr is a 
105e0 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 66 20 73  sub-select. If s
105f0 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69 74 20 76  o, consider it v
10600 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66  ariable. */.  if
10610 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
10620 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
10630 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 57  elect) ){.    pW
10640 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
10650 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
10660 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72  _Abort;.  }..  r
10670 65 74 75 72 6e 20 65 78 70 72 4e 6f 64 65 49 73  eturn exprNodeIs
10680 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b 65 72  Constant(pWalker
10690 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
106a0 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65 78 70 72  ** Walk the expr
106b0 65 73 73 69 6f 6e 20 74 72 65 65 20 70 61 73 73  ession tree pass
106c0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
106d0 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e  argument. Return
106e0 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 66 20   non-zero.** if 
106f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
10700 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
10710 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 6f 72   of constants or
10720 20 63 6f 70 69 65 73 20 6f 66 20 74 65 72 6d 73   copies of terms
10730 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70 42 79   .** in pGroupBy
10740 20 74 68 61 74 20 73 6f 72 74 20 77 69 74 68 20   that sort with 
10750 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  the BINARY colla
10760 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a  tion sequence..*
10770 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10780 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
10790 65 72 6d 69 6e 65 20 69 66 20 61 20 74 65 72 6d  ermine if a term
107a0 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63   of the HAVING c
107b0 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62 65 20  lause can.** be 
107c0 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20 74 68  promoted into th
107d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
107e0 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 73 75   In order for su
107f0 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e 20 74  ch a promotion t
10800 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65 20 76  o work,.** the v
10810 61 6c 75 65 20 6f 66 20 74 68 65 20 48 41 56 49  alue of the HAVI
10820 4e 47 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6d  NG clause term m
10830 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
10840 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  for all members 
10850 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70 22 2e  of.** a "group".
10860 20 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e    The requiremen
10870 74 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50  t that the GROUP
10880 20 42 59 20 74 65 72 6d 20 6d 75 73 74 20 62 65   BY term must be
10890 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73 75 6d   BINARY.** assum
108a0 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
108b0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
108c0 6e 63 65 20 77 69 6c 6c 20 68 61 76 65 20 61 20  nce will have a 
108d0 66 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a 2a 2a  finer-grained.**
108e0 20 67 72 6f 75 70 69 6e 67 20 74 68 61 6e 20 62   grouping than b
108f0 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  inary.  In other
10900 20 77 6f 72 64 73 20 28 41 3d 42 20 43 4f 4c 4c   words (A=B COLL
10910 41 54 45 20 62 69 6e 61 72 79 29 20 69 6d 70 6c  ATE binary) impl
10920 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20 65 76  ies.** A=B in ev
10930 65 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74  ery other collat
10940 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 54  ing sequence.  T
10950 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74  he requirement t
10960 68 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50  hat the.** GROUP
10970 20 42 59 20 62 65 20 42 49 4e 41 52 59 20 69 73   BY be BINARY is
10980 20 73 74 72 69 63 74 65 72 20 74 68 61 6e 20 6e   stricter than n
10990 65 63 65 73 73 61 72 79 2e 20 20 49 74 20 77 6f  ecessary.  It wo
109a0 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a 2a 2a  uld also work.**
109b0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41 56 49   to promote HAVI
109c0 4e 47 20 63 6c 61 75 73 65 73 20 74 68 61 74 20  NG clauses that 
109d0 75 73 65 20 74 68 65 20 73 61 6d 65 20 61 6c 74  use the same alt
109e0 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
109f0 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 61  ng.** sequence a
10a00 73 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  s the GROUP BY t
10a10 65 72 6d 2c 20 62 75 74 20 74 68 61 74 20 69 73  erm, but that is
10a20 20 6d 75 63 68 20 68 61 72 64 65 72 20 74 6f 20   much harder to 
10a30 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65 72 6e  check,.** altern
10a40 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
10a50 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 75 6e  sequences are un
10a60 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73  common, and this
10a70 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a 20 6f   is only an.** o
10a80 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73 6f 20  ptimization, so 
10a90 77 65 20 74 61 6b 65 20 74 68 65 20 65 61 73 79  we take the easy
10aa0 20 77 61 79 20 6f 75 74 20 61 6e 64 20 73 69 6d   way out and sim
10ab0 70 6c 79 20 72 65 71 75 69 72 65 20 74 68 65 0a  ply require the.
10ac0 2a 2a 20 47 52 4f 55 50 20 42 59 20 74 6f 20 75  ** GROUP BY to u
10ad0 73 65 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f  se the BINARY co
10ae0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10af0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10b00 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
10b10 47 72 6f 75 70 42 79 28 50 61 72 73 65 20 2a 70  GroupBy(Parse *p
10b20 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20  Parse, Expr *p, 
10b30 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
10b40 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  By){.  Walker w;
10b50 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a  .  w.eCode = 1;.
10b60 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
10b70 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
10b80 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 3b  nstantOrGroupBy;
10b90 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
10ba0 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  back = 0;.  w.u.
10bb0 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
10bc0 70 42 79 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  pBy;.  w.pParse 
10bd0 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
10be0 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
10bf0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
10c00 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
10c10 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
10c20 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
10c30 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
10c40 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
10c50 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
10c60 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
10c70 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
10c80 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
10c90 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
10ca0 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
10cb0 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
10cc0 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
10cd0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
10ce0 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
10cf0 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
10d00 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
10d10 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
10d20 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
10d30 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
10d40 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
10d50 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
10d60 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
10d70 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
10d80 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a  *p, u8 isInit){.
10d90 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74    assert( isInit
10da0 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31  ==0 || isInit==1
10db0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70   );.  return exp
10dc0 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73  rIsConst(p, 4+is
10dd0 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  Init, 0);.}..#if
10de0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10df0 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f  E_CURSOR_HINTS./
10e00 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
10e10 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
10e20 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
10e30 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
10e40 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79  ns a.** subquery
10e50 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
10e60 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
10e70 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72  e are no subquer
10e80 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ies..*/.int sqli
10e90 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53  te3ExprContainsS
10ea0 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70 29  ubquery(Expr *p)
10eb0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
10ec0 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77  w.eCode = 1;.  w
10ed0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
10ee0 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
10ef0 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Noop;.  w.xSelec
10f00 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
10f10 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
10f20 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  l;.#ifdef SQLITE
10f30 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65  _DEBUG.  w.xSele
10f40 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71  ctCallback2 = sq
10f50 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41  lite3SelectWalkA
10f60 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20  ssert2;.#endif. 
10f70 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
10f80 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
10f90 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a  n w.eCode==0;.}.
10fa0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
10fb0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10fc0 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61  p codes a consta
10fd0 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  nt integer that 
10fe0 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a  is small enough.
10ff0 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33  ** to fit in a 3
11000 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
11010 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20  eturn 1 and put 
11020 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
11030 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a   integer.** in *
11040 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20  pValue.  If the 
11050 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
11060 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  t an integer or 
11070 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67  if it is too big
11080 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
11090 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
110a0 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20  teger, return 0 
110b0 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75  and leave *pValu
110c0 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
110d0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
110e0 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70  sInteger(Expr *p
110f0 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a  , int *pValue){.
11100 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
11110 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
11120 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c  n 0;  /* Can onl
11130 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c 6f 77 69  y happen followi
11140 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a 0a 20 20  ng on OOM */..  
11150 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73  /* If an express
11160 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ion is an intege
11170 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66  r literal that f
11180 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20  its in a signed 
11190 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65  32-bit.  ** inte
111a0 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50  ger, then the EP
111b0 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77  _IntValue flag w
111c0 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
111d0 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61   been set */.  a
111e0 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
111f0 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e  _INTEGER || (p->
11200 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
11210 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20  lue)!=0.        
11220 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74     || sqlite3Get
11230 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65  Int32(p->u.zToke
11240 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20  n, &rc)==0 );.. 
11250 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
11260 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
11270 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e     *pValue = p->
11280 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65  u.iValue;.    re
11290 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77  turn 1;.  }.  sw
112a0 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
112b0 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
112c0 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  : {.      rc = s
112d0 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
112e0 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56  ger(p->pLeft, pV
112f0 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alue);.      bre
11300 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
11310 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
11320 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20        int v;.   
11330 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
11340 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
11350 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20  Left, &v) ){.   
11360 20 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d       assert( v!=
11370 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20  (-2147483647-1) 
11380 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c  );.        *pVal
11390 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20  ue = -v;.       
113a0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
113b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
113c0 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
113d0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
113e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
113f0 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
11400 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
11410 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78  ance that the ex
11420 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
11430 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  NULL..**.** If t
11440 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
11450 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69  ght be NULL or i
11460 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
11470 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a   is too complex.
11480 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72  ** to tell retur
11490 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20  n TRUE.  .**.** 
114a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
114b0 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d  used as an optim
114c0 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70  ization, to skip
114d0 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64   OP_IsNull opcod
114e0 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e  es.** when we kn
114f0 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20  ow that a value 
11500 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20  cannot be NULL. 
11510 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20   Hence, a false 
11520 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74  positive.** (ret
11530 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e  urning TRUE when
11540 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70   in fact the exp
11550 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65  ression can neve
11560 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74  r be NULL) might
11570 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70  .** be a small p
11580 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62  erformance hit b
11590 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
115a0 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68  harmless.  On th
115b0 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c  e other.** hand,
115c0 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   a false negativ
115d0 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c  e (returning FAL
115e0 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  SE when the resu
115f0 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c  lt could be NULL
11600 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ).** will likely
11610 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
11620 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20  correct answer. 
11630 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62   So when in doub
11640 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55  t, return.** TRU
11650 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
11660 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63  3ExprCanBeNull(c
11670 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20  onst Expr *p){. 
11680 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28   u8 op;.  while(
11690 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
116a0 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
116b0 49 4e 55 53 20 29 7b 0a 20 20 20 20 70 20 3d 20  INUS ){.    p = 
116c0 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20  p->pLeft;.  }.  
116d0 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66  op = p->op;.  if
116e0 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
116f0 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
11700 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
11710 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
11720 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54  EGER:.    case T
11730 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61  K_STRING:.    ca
11740 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
11750 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20   case TK_BLOB:. 
11760 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
11770 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
11780 4e 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  N:.      return 
11790 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
117a0 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29  p, EP_CanBeNull)
117b0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
117c0 20 70 2d 3e 79 2e 70 54 61 62 3d 3d 30 20 7c 7c   p->y.pTab==0 ||
117d0 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74    /* Reference t
117e0 6f 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  o column of inde
117f0 78 20 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  x on expression 
11800 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
11810 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  (p->iColumn>=0 &
11820 26 20 70 2d 3e 79 2e 70 54 61 62 2d 3e 61 43 6f  & p->y.pTab->aCo
11830 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  l[p->iColumn].no
11840 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64  tNull==0);.    d
11850 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
11860 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 1;.  }.}../
11870 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
11880 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
11890 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
118a0 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75  nstant which wou
118b0 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67  ld be.** unchang
118c0 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74  ed by OP_Affinit
118d0 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e  y with the affin
118e0 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ity given in the
118f0 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
11900 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
11910 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
11920 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
11930 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
11940 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  operation.** can
11950 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68   be omitted.  Wh
11960 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75  en in doubt retu
11970 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c  rn FALSE.  A fal
11980 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69  se negative.** i
11990 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66  s harmless.  A f
119a0 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68  alse positive, h
119b0 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75  owever, can resu
119c0 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a  lt in the wrong.
119d0 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e  ** answer..*/.in
119e0 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  t sqlite3ExprNee
119f0 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
11a00 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ge(const Expr *p
11a10 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75  , char aff){.  u
11a20 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d  8 op;.  if( aff=
11a30 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
11a40 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77   ) return 1;.  w
11a50 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
11a60 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
11a70 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
11a80 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
11a90 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
11aa0 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
11ab0 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
11ac0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
11ad0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
11ae0 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  GER: {.      ret
11af0 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
11b00 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
11b10 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
11b20 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
11b30 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
11b40 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
11b50 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11b60 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  REAL || aff==SQL
11b70 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
11b80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11b90 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
11ba0 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
11bb0 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
11bc0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11bd0 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
11be0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
11bf0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
11c00 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  MN: {.      asse
11c10 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30  rt( p->iTable>=0
11c20 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74   );  /* p cannot
11c30 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48   be part of a CH
11c40 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ECK constraint *
11c50 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  /.      return p
11c60 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20  ->iColumn<0.    
11c70 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
11c80 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
11c90 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
11ca0 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20  _AFF_NUMERIC);. 
11cb0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
11cc0 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
11cd0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
11ce0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
11cf0 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
11d00 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
11d10 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
11d20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
11d30 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
11d40 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
11d50 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
11d60 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
11d70 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
11d80 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
11d90 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
11da0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
11db0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
11dc0 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
11dd0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
11de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73  ;.}../*.** pX is
11df0 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49   the RHS of an I
11e00 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  N operator.  If 
11e10 70 58 20 69 73 20 61 20 53 45 4c 45 43 54 20 73  pX is a SELECT s
11e20 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61  tatement .** tha
11e30 74 20 63 61 6e 20 62 65 20 73 69 6d 70 6c 69 66  t can be simplif
11e40 69 65 64 20 74 6f 20 61 20 64 69 72 65 63 74 20  ied to a direct 
11e50 74 61 62 6c 65 20 61 63 63 65 73 73 2c 20 74 68  table access, th
11e60 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70  en return.** a p
11e70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53 45  ointer to the SE
11e80 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
11e90 20 49 66 20 70 58 20 69 73 20 6e 6f 74 20 61 20   If pX is not a 
11ea0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11eb0 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 53  ,.** or if the S
11ec0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11ed0 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 61 6e 69  needs to be mani
11ee0 66 65 73 74 65 64 20 69 6e 74 6f 20 61 20 74 72  fested into a tr
11ef0 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65  ansient.** table
11f00 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55  , then return NU
11f10 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  LL..*/.#ifndef S
11f20 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
11f30 45 52 59 0a 73 74 61 74 69 63 20 53 65 6c 65 63  ERY.static Selec
11f40 74 20 2a 69 73 43 61 6e 64 69 64 61 74 65 46 6f  t *isCandidateFo
11f50 72 49 6e 4f 70 74 28 45 78 70 72 20 2a 70 58 29  rInOpt(Expr *pX)
11f60 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20  {.  Select *p;. 
11f70 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
11f80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
11f90 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
11fa0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  b;.  int i;.  if
11fb0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
11fc0 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
11fd0 65 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ect) ) return 0;
11fe0 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71 75    /* Not a subqu
11ff0 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 45 78 70  ery */.  if( Exp
12000 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
12010 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 20   EP_VarSelect)  
12020 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
12030 43 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 20  Correlated subq 
12040 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70  */.  p = pX->x.p
12050 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 2d  Select;.  if( p-
12060 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e  >pPrior ) return
12070 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12080 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75   /* Not a compou
12090 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  nd SELECT */.  i
120a0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
120b0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
120c0 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20  _Aggregate) ){. 
120d0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
120e0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
120f0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
12100 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
12110 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74  inct );.    test
12120 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
12130 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
12140 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
12150 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
12160 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  ;.    return 0; 
12170 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b  /* No DISTINCT k
12180 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67  eyword and no ag
12190 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
121a0 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72  s */.  }.  asser
121b0 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  t( p->pGroupBy==
121c0 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
121d0 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55    /* Has no GROU
121e0 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  P BY clause */. 
121f0 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
12200 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
12210 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
12220 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a  o LIMIT clause *
12230 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  /.  if( p->pWher
12240 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
12250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
12260 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
12270 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d  e */.  pSrc = p-
12280 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
12290 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66   pSrc!=0 );.  if
122a0 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
122b0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
122c0 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74       /* Single t
122d0 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  erm in FROM clau
122e0 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  se */.  if( pSrc
122f0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
12300 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f   return 0;     /
12310 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20  * FROM is not a 
12320 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77  subquery or view
12330 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72   */.  pTab = pSr
12340 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
12350 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
12360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
12370 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  b->pSelect==0 );
12380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12390 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
123a0 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66  t a view */.  if
123b0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
123c0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  ) ) return 0;   
123d0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
123e0 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61  use not a virtua
123f0 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c  l table */.  pEL
12400 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
12410 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
12420 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c  t!=0 );.  /* All
12430 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
12440 6d 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e  must be columns.
12450 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
12460 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
12470 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
12480 70 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pRes = pEList->a
12490 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
124a0 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f  f( pRes->op!=TK_
124b0 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
124c0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
124d0 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  Res->iTable==pSr
124e0 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20  c->a[0].iCursor 
124f0 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72  );  /* Not a cor
12500 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
12510 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
12520 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   p;.}.#endif /* 
12530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
12540 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
12550 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
12560 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
12570 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63  rate code that c
12580 68 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d  hecks the left-m
12590 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  ost column of in
125a0 64 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74  dex table iCur t
125b0 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63  o see if.** it c
125c0 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
125d0 20 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65   entries.  Cause
125e0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74   the register at
125f0 20 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62   regHasNull to b
12600 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  e set.** to a no
12610 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20  n-NULL value if 
12620 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  iCur contains no
12630 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72   NULLs.  Cause r
12640 65 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75  egister regHasNu
12650 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20  ll.** to be set 
12660 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20  to NULL if iCur 
12670 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
12680 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
12690 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
126a0 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75   sqlite3SetHasNu
126b0 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20  llFlag(Vdbe *v, 
126c0 69 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65  int iCur, int re
126d0 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74  gHasNull){.  int
126e0 20 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65   addr1;.  sqlite
126f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12700 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
12710 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64  gHasNull);.  add
12720 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
12730 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
12740 69 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65  ind, iCur); Vdbe
12750 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
12760 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12770 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
12780 43 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75  Cur, 0, regHasNu
12790 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ll);.  sqlite3Vd
127a0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
127b0 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b  FLAG_TYPEOFARG);
127c0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
127d0 76 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f  v, "first_entry_
127e0 69 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b  in(%d)", iCur));
127f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
12800 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
12810 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
12820 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12830 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
12840 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
12850 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  an IN operator w
12860 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20  ith a list (not 
12870 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74  a subquery) on t
12880 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e  he .** right-han
12890 64 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20  d side.  Return 
128a0 54 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73  TRUE if that lis
128b0 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  t is constant..*
128c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
128d0 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74  ite3InRhsIsConst
128e0 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a  ant(Expr *pIn){.
128f0 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20    Expr *pLHS;.  
12900 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72  int res;.  asser
12910 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
12920 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53  rty(pIn, EP_xIsS
12930 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53  elect) );.  pLHS
12940 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20   = pIn->pLeft;. 
12950 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b   pIn->pLeft = 0;
12960 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  .  res = sqlite3
12970 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
12980 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66  In);.  pIn->pLef
12990 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75  t = pLHS;.  retu
129a0 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66  rn res;.}.#endif
129b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
129c0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ction is used by
129d0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
129e0 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e  ion of the IN (.
129f0 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ..) operator..**
12a00 20 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65   The pX paramete
12a10 72 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73  r is the express
12a20 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ion on the RHS o
12a30 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
12a40 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68  r, which.** migh
12a50 74 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69  t be either a li
12a60 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
12a70 73 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  s or a subquery.
12a80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f  .**.** The job o
12a90 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
12aa0 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65  s to find or cre
12ab0 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a  ate a b-tree obj
12ac0 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20  ect that can.** 
12ad0 62 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74  be used either t
12ae0 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65  o test for membe
12af0 72 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53  rship in the RHS
12b00 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61   set or to itera
12b10 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c  te through.** al
12b20 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65  l members of the
12b30 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69   RHS set, skippi
12b40 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a  ng duplicates..*
12b50 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73  *.** A cursor is
12b60 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62   opened on the b
12b70 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61  -tree object tha
12b80 74 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20  t is the RHS of 
12b90 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
12ba0 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c  ** and pX->iTabl
12bb0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
12bc0 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75  index of that cu
12bd0 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
12be0 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f  returned value o
12bf0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
12c00 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d  indicates the b-
12c10 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f  tree type, as fo
12c20 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49  llows:.**.**   I
12c30 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20  N_INDEX_ROWID   
12c40 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20     - The cursor 
12c50 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
12c60 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
12c70 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
12c80 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63  DEX_ASC  - The c
12c90 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
12ca0 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67   on an ascending
12cb0 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
12cc0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
12cd0 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
12ce0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65  s opened on a de
12cf0 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a  scending index..
12d00 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50  **   IN_INDEX_EP
12d10 48 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63  H        - The c
12d20 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
12d30 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20   on a specially 
12d40 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20  created and.**  
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64         populated
12d70 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
12d80 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
12d90 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20  NOOP       - No 
12da0 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63  cursor was alloc
12db0 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70  ated.  The IN op
12dc0 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a  erator must be.*
12dd0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12de0 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d            implem
12df0 65 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65  ented as a seque
12e00 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  nce of compariso
12e10 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  ns..**.** An exi
12e20 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67  sting b-tree mig
12e30 68 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68  ht be used if th
12e40 65 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e  e RHS expression
12e50 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a   pX is a simple.
12e60 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68  ** subquery such
12e70 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53   as:.**.**     S
12e80 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c  ELECT <column1>,
12e90 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52   <column2>... FR
12ea0 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  OM <table>.**.**
12eb0 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
12ec0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
12ed0 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f  s a list or a mo
12ee0 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75  re complex subqu
12ef0 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20  ery, then.** an 
12f00 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
12f10 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
12f20 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
12f30 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e  the RHS and then
12f40 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d  .** pX->iTable m
12f50 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
12f60 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
12f70 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
12f80 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61  n.** existing ta
12f90 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ble..**.** The i
12fa0 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  nFlags parameter
12fb0 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 2c 20 61   must contain, a
12fc0 74 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 6f 6e 65  t a minimum, one
12fd0 20 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20   of the bits.** 
12fe0 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
12ff0 48 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f  HIP or IN_INDEX_
13000 4c 4f 4f 50 20 62 75 74 20 6e 6f 74 20 62 6f 74  LOOP but not bot
13010 68 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63  h.  If inFlags c
13020 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e  ontains.** IN_IN
13030 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20  DEX_MEMBERSHIP, 
13040 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74  then the generat
13050 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  ed table will be
13060 20 75 73 65 64 20 66 6f 72 20 61 20 66 61 73 74   used for a fast
13070 0a 2a 2a 20 6d 65 6d 62 65 72 73 68 69 70 20 74  .** membership t
13080 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49  est.  When the I
13090 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74  N_INDEX_LOOP bit
130a0 20 69 73 20 73 65 74 2c 20 74 68 65 20 49 4e 20   is set, the IN 
130b0 69 6e 64 65 78 20 77 69 6c 6c 0a 2a 2a 20 62 65  index will.** be
130c0 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76   used to loop ov
130d0 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
130e0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
130f0 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  IN operator..**.
13100 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58  ** When IN_INDEX
13110 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61  _LOOP is used (a
13120 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69  nd the b-tree wi
13130 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74  ll be used to it
13140 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68  erate.** through
13150 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73   the set members
13160 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65  ) then the b-tre
13170 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61  e must not conta
13180 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a  in duplicates..*
13190 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  * An epheremal t
131a0 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 63 72 65  able will be cre
131b0 61 74 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20  ated unless the 
131c0 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73  selected columns
131d0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a   are guaranteed.
131e0 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20  ** to be unique 
131f0 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  - either because
13200 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45   it is an INTEGE
13210 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
13220 20 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49   due to.** a UNI
13230 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
13240 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57  r index..**.** W
13250 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  hen IN_INDEX_MEM
13260 42 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20  BERSHIP is used 
13270 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20  (and the b-tree 
13280 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
13290 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65   for fast set me
132a0 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20  mbership tests) 
132b0 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61  then an epherema
132c0 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a  l table must .**
132d0 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
132e0 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73  <columns> is a s
132f0 69 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52  ingle INTEGER PR
13300 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
13310 20 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78   or an .** index
13320 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69   can be found wi
13330 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
13340 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74   <columns> as it
13350 73 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a  s left-most..**.
13360 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44  ** If the IN_IND
13370 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49  EX_NOOP_OK and I
13380 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
13390 49 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20  IP are both set 
133a0 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48  and.** if the RH
133b0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
133c0 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28  ator is a list (
133d0 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
133e0 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
133f0 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64  tine might decid
13400 65 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20  e that creating 
13410 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74  an ephemeral b-t
13420 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  ree for membersh
13430 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73  ip.** testing is
13440 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61   too expensive a
13450 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  nd return IN_IND
13460 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61  EX_NOOP.  In tha
13470 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63  t case, the.** c
13480 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73  alling routine s
13490 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20  hould implement 
134a0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
134b0 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65  using a sequence
134c0 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20  .** of Eq or Ne 
134d0 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
134e0 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tions..**.** Whe
134f0 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  n the b-tree is 
13500 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d  being used for m
13510 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c  embership tests,
13520 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
13530 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e  ction.** might n
13540 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74  eed to know whet
13550 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52  her or not the R
13560 48 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  HS side of the I
13570 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f  N operator.** co
13580 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20  ntains a NULL.  
13590 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  If prRhsHasNull 
135a0 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f  is not a NULL po
135b0 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66  inter and .** if
135c0 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68   there is any ch
135d0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
135e0 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  ..) might contai
135f0 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61  n a NULL value a
13600 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68  t.** runtime, th
13610 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73  en a register is
13620 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
13630 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
13640 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  er written.** to
13650 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20   *prRhsHasNull. 
13660 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  If there is no c
13670 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
13680 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a  ...) contains a.
13690 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74  ** NULL value, t
136a0 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  hen *prRhsHasNul
136b0 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  l is left unchan
136c0 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ged..**.** If a 
136d0 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
136e0 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f  cated and its lo
136f0 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e  cation stored in
13700 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
13710 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75  then.** the valu
13720 65 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74  e in that regist
13730 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  er will be NULL 
13740 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f  if the b-tree co
13750 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
13760 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  re.** NULL value
13770 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62  s, and it will b
13780 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20  e some non-NULL 
13790 76 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74  value if the b-t
137a0 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a  ree contains no.
137b0 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a  ** NULL values..
137c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d  **.** If the aiM
137d0 61 70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ap parameter is 
137e0 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73  not NULL, it mus
137f0 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72  t point to an ar
13800 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ray containing.*
13810 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f  * one element fo
13820 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65  r each column re
13830 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
13840 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
13850 6e 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20  n the RHS.** of 
13860 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72  the IN(...) oper
13870 61 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65  ator. The i'th e
13880 6e 74 72 79 20 6f 66 20 74 68 65 20 61 72 72 61  ntry of the arra
13890 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  y is populated w
138a0 69 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65  ith the.** offse
138b0 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63  t of the index c
138c0 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68  olumn that match
138d0 65 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  es the i'th colu
138e0 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  mn returned by t
138f0 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f  he.** SELECT. Fo
13900 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
13910 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
13920 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20   selected index 
13930 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c  are:.**.**   (?,
13940 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20  ?,?) IN (SELECT 
13950 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29  a, b, c FROM t1)
13960 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
13970 45 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63  EX i1 ON t1(b, c
13980 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  , a);.**.** then
13990 20 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75   aiMap[] is popu
139a0 6c 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30  lated with {2, 0
139b0 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  , 1}..*/.#ifndef
139c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
139d0 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
139e0 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20  3FindInIndex(.  
139f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
13a10 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
13a20 0a 20 20 45 78 70 72 20 2a 70 58 2c 20 20 20 20  .  Expr *pX,    
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a40 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
13a50 73 69 64 65 20 28 52 48 53 29 20 6f 66 20 74 68  side (RHS) of th
13a60 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
13a70 0a 20 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20  .  u32 inFlags, 
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a90 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20   IN_INDEX_LOOP, 
13aa0 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64  _MEMBERSHIP, and
13ab0 2f 6f 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a  /or _NOOP_OK */.
13ac0 20 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e    int *prRhsHasN
13ad0 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ull,         /* 
13ae0 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
13af0 20 4e 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53   NULL status.  S
13b00 65 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e  ee notes */.  in
13b10 74 20 2a 61 69 4d 61 70 2c 20 20 20 20 20 20 20  t *aiMap,       
13b20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70           /* Mapp
13b30 69 6e 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66  ing from Index f
13b40 69 65 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65  ields to RHS fie
13b50 6c 64 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  lds */.  int *pi
13b60 54 61 62 20 20 20 20 20 20 20 20 20 20 20 20 20  Tab             
13b70 20 20 20 20 2f 2a 20 4f 55 54 3a 20 69 6e 64 65      /* OUT: inde
13b80 78 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20  x to use */.){. 
13b90 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20   Select *p;     
13ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bb0 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
13bc0 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
13bd0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
13be0 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b    int eType = 0;
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
13c10 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e  of RHS table. IN
13c20 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e  _INDEX_* */.  in
13c30 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
13c40 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20  >nTab++;        
13c50 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
13c60 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a   the RHS table *
13c70 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e  /.  int mustBeUn
13c80 69 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ique;           
13c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
13ca0 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65  e if RHS must be
13cb0 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62   unique */.  Vdb
13cc0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
13cd0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
13ce0 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61     /* Virtual ma
13cf0 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65  chine being code
13d00 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
13d10 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
13d20 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20  .  mustBeUnique 
13d30 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  = (inFlags & IN_
13d40 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a  INDEX_LOOP)!=0;.
13d50 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53  .  /* If the RHS
13d60 20 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29   of this IN(...)
13d70 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 53   operator is a S
13d80 45 4c 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74  ELECT, and if it
13d90 20 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77   matters .  ** w
13da0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
13db0 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20  e SELECT result 
13dc0 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
13dd0 6c 75 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74  lues, check whet
13de0 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20  her.  ** or not 
13df0 4e 55 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79  NULL is actually
13e00 20 70 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61   possible (it ma
13e10 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78  y not be, for ex
13e20 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a  ample, due .  **
13e30 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e   to NOT NULL con
13e40 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
13e50 73 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e  schema). If no N
13e60 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70  ULL values are p
13e70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65  ossible,.  ** se
13e80 74 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74  t prRhsHasNull t
13e90 6f 20 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  o 0 before conti
13ea0 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28  nuing.  */.  if(
13eb0 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26   prRhsHasNull &&
13ec0 20 28 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pX->flags & EP
13ed0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
13ee0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78     int i;.    Ex
13ef0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
13f00 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e   pX->x.pSelect->
13f10 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28  pEList;.    for(
13f20 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
13f30 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
13f40 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
13f50 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73  rCanBeNull(pELis
13f60 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
13f70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13f80 20 20 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d    if( i==pEList-
13f90 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
13fa0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30  prRhsHasNull = 0
13fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13fc0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
13fd0 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  f an existing ta
13fe0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  ble or index can
13ff0 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a   be used to.  **
14000 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65   satisfy the que
14010 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65  ry.  This is pre
14020 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ferable to gener
14030 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a  ating a new .  *
14040 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  * ephemeral tabl
14050 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  e.  */.  if( pPa
14060 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20  rse->nErr==0 && 
14070 28 70 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65  (p = isCandidate
14080 46 6f 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30  ForInOpt(pX))!=0
14090 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
140a0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
140b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
140c0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
140d0 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62  ction */.    Tab
140e0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
140f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14100 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61      /* Table <ta
14110 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36  ble>. */.    i16
14120 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
14130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14140 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
14150 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  idx for pTab */.
14160 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
14170 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
14180 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  ;.    int nExpr 
14190 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
141a0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
141b0 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20  >pEList!=0 );   
141c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
141d0 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
141e0 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
141f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
14200 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
14210 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63  xpr!=0 ); /* Bec
14220 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
14230 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
14240 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
14250 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20  >pSrc!=0 );     
14260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
14270 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
14280 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
14290 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e  /.    pTab = p->
142a0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
142b0 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e  ..    /* Code an
142c0 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20   OP_Transaction 
142d0 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  and OP_TableLock
142e0 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f   for <table>. */
142f0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
14300 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
14310 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
14320 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  a);.    sqlite3C
14330 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
14340 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
14350 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
14360 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
14370 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
14380 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
14390 20 20 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a    assert(v);  /*
143a0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
143b0 29 20 68 61 73 20 61 6c 77 61 79 73 20 62 65 65  ) has always bee
143c0 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  n previously cal
143d0 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  led */.    if( n
143e0 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73  Expr==1 && pELis
143f0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69  t->a[0].pExpr->i
14400 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
14410 20 20 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28    /* The "x IN (
14420 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
14430 4d 20 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a  M table)" case *
14440 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64  /.      int iAdd
14450 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
14460 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
14470 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
14480 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20  erage(v);..     
14490 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
144a0 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
144b0 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
144c0 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65  enRead);.      e
144d0 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
144e0 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 45 78 70  ROWID;.      Exp
144f0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
14500 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20  Parse, 0,.      
14510 20 20 20 20 20 20 22 55 53 49 4e 47 20 52 4f 57        "USING ROW
14520 49 44 20 53 45 41 52 43 48 20 4f 4e 20 54 41 42  ID SEARCH ON TAB
14530 4c 45 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45  LE %s FOR IN-OPE
14540 52 41 54 4f 52 22 2c 70 54 61 62 2d 3e 7a 4e 61  RATOR",pTab->zNa
14550 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
14560 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14570 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d  v, iAddr);.    }
14580 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
14590 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145b0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
145c0 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  iable */.      i
145d0 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d  nt affinity_ok =
145e0 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   1;.      int i;
145f0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
14600 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69   that the affini
14610 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ty that will be 
14620 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20  used to perform 
14630 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63  each .      ** c
14640 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65  omparison is the
14650 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66   same as the aff
14660 69 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f  inity of each co
14670 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20  lumn in table.  
14680 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48      ** on the RH
14690 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
146a0 61 74 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74  ator.  If it not
146b0 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
146c0 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ible to.      **
146d0 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f   use any index o
146e0 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e  f the RHS table.
146f0 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69    */.      for(i
14700 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61  =0; i<nExpr && a
14710 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29  ffinity_ok; i++)
14720 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
14730 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65  pLhs = sqlite3Ve
14740 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
14750 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a  (pX->pLeft, i);.
14760 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
14770 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
14780 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
14790 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
147a0 61 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62  aff = sqlite3Tab
147b0 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79  leColumnAffinity
147c0 28 70 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20  (pTab,iCol); /* 
147d0 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  RHS table */.   
147e0 20 20 20 20 20 63 68 61 72 20 63 6d 70 61 66 66       char cmpaff
147f0 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
14800 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20  eAffinity(pLhs, 
14810 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20  idxaff);.       
14820 20 74 65 73 74 63 61 73 65 28 20 63 6d 70 61 66   testcase( cmpaf
14830 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  f==SQLITE_AFF_BL
14840 4f 42 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  OB );.        te
14850 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d  stcase( cmpaff==
14860 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
14870 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  );.        switc
14880 68 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20  h( cmpaff ){.   
14890 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
148a0 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20  TE_AFF_BLOB:.   
148b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
148c0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
148d0 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a  QLITE_AFF_TEXT:.
148e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
148f0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
14900 69 6e 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74  inity() only ret
14910 75 72 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65  urns TEXT if one
14920 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20   side or the.   
14930 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65           ** othe
14940 72 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74  r has no affinit
14950 79 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  y and the other 
14960 73 69 64 65 20 69 73 20 54 45 58 54 2e 20 20 48  side is TEXT.  H
14970 65 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ence,.          
14980 20 20 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61    ** the only wa
14990 79 20 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20  y for cmpaff to 
149a0 62 65 20 54 45 58 54 20 69 73 20 66 6f 72 20 69  be TEXT is for i
149b0 64 78 61 66 66 20 74 6f 20 62 65 20 54 45 58 54  dxaff to be TEXT
149c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
149d0 61 6e 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d  and for the term
149e0 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
149f0 68 65 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f  he IN to have no
14a00 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20   affinity. */.  
14a10 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
14a20 28 20 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45  ( idxaff==SQLITE
14a30 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
14a40 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14a50 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
14a60 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  t:.            a
14a70 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c  ffinity_ok = sql
14a80 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
14a90 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20  inity(idxaff);. 
14aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14ab0 0a 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 69  ..      if( affi
14ac0 6e 69 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20  nity_ok ){.     
14ad0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
14ae0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64   an existing ind
14af0 65 78 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72  ex that will wor
14b00 6b 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70  k for this IN op
14b10 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
14b20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
14b30 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26  >pIndex; pIdx &&
14b40 20 65 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d   eType==0; pIdx=
14b50 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
14b60 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
14b70 63 6f 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a  colUsed;      /*
14b80 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   Columns of the 
14b90 69 6e 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20  index used */.  
14ba0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
14bb0 6d 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  mCol;         /*
14bc0 20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75   Mask for the cu
14bd0 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  rrent column */.
14be0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
14bf0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70  dx->nColumn<nExp
14c00 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
14c10 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14c20 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
14c30 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
14c40 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
14c50 6d 75 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42  mum nColumn is B
14c60 4d 53 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c  MS-2, not BMS-1,
14c70 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
14c80 63 6f 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20  compute.        
14c90 20 20 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78    ** BITMASK(nEx
14ca0 70 72 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72  pr) without over
14cb0 66 6c 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20  flowing */.     
14cc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
14cd0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d  Idx->nColumn==BM
14ce0 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20  S-2 );.         
14cf0 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d   testcase( pIdx-
14d00 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20  >nColumn==BMS-1 
14d10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
14d20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
14d30 42 4d 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65  BMS-1 ) continue
14d40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14d50 6d 75 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a  mustBeUnique ){.
14d60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14d70 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45  pIdx->nKeyCol>nE
14d80 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  xpr.            
14d90 20 7c 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   ||(pIdx->nColum
14da0 6e 3e 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e  n>nExpr && !IsUn
14db0 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 29  iqueIndex(pIdx))
14dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
14de0 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73  ntinue;  /* This
14df0 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e   index is not un
14e00 69 71 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e  ique over the IN
14e10 20 52 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a   RHS columns */.
14e20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
14e30 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
14e40 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d         colUsed =
14e50 20 30 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73   0;   /* Columns
14e60 20 6f 66 20 69 6e 64 65 78 20 75 73 65 64 20 73   of index used s
14e70 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
14e80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
14e90 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
14ea0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68         Expr *pLh
14eb0 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  s = sqlite3Vecto
14ec0 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58  rFieldSubexpr(pX
14ed0 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  ->pLeft, i);.   
14ee0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
14ef0 52 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Rhs = pEList->a[
14f00 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
14f10 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
14f20 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
14f30 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
14f40 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20  q(pParse, pLhs, 
14f50 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20  pRhs);.         
14f60 20 20 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20     int j;.  .   
14f70 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
14f80 20 70 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73   pReq!=0 || pRhs
14f90 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f  ->iColumn==XN_RO
14fa0 57 49 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  WID || pParse->n
14fb0 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Err );.         
14fc0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45     for(j=0; j<nE
14fd0 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
14fe0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
14ff0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d  x->aiColumn[j]!=
15000 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  pRhs->iColumn ) 
15010 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
15020 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15030 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20  pIdx->azColl[j] 
15040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
15050 20 69 66 28 20 70 52 65 71 21 3d 30 20 26 26 20   if( pReq!=0 && 
15060 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
15070 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78  Req->zName, pIdx
15080 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20  ->azColl[j])!=0 
15090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
150a0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
150b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
150c0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
150d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
150e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
150f0 6a 3d 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b  j==nExpr ) break
15100 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 43  ;.            mC
15110 6f 6c 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b  ol = MASKBIT(j);
15120 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
15130 20 6d 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20   mCol & colUsed 
15140 29 20 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68  ) break; /* Each
15150 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c   column used onl
15160 79 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20  y once */.      
15170 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d        colUsed |=
15180 20 6d 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20   mCol;.         
15190 20 20 20 69 66 28 20 61 69 4d 61 70 20 29 20 61     if( aiMap ) a
151a0 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20  iMap[i] = j;.   
151b0 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
151c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
151d0 3d 6e 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65  =nExpr || colUse
151e0 64 21 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70  d!=(MASKBIT(nExp
151f0 72 29 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  r)-1) );.       
15200 20 20 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d     if( colUsed==
15210 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d  (MASKBIT(nExpr)-
15220 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
15230 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
15240 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61   this point, tha
15250 74 20 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65  t means the inde
15260 78 20 70 49 64 78 20 69 73 20 75 73 61 62 6c 65  x pIdx is usable
15270 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
15280 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
15290 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
152a0 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
152b0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
152c0 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51          ExplainQ
152d0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
152e0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15300 20 20 20 22 55 53 49 4e 47 20 49 4e 44 45 58 20     "USING INDEX 
15310 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54  %s FOR IN-OPERAT
15320 4f 52 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  OR",pIdx->zName)
15330 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
15340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15350 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
15360 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75   iTab, pIdx->tnu
15370 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
15380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15390 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
153a0 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
153b0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
153c0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
153d0 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
153e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
153f0 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
15400 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58  DESC == IN_INDEX
15410 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a  _INDEX_ASC+1 );.
15420 20 20 20 20 20 20 20 20 20 20 20 20 65 54 79 70              eTyp
15430 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  e = IN_INDEX_IND
15440 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61  EX_ASC + pIdx->a
15450 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 20 20  SortOrder[0];.  
15460 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
15470 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b   prRhsHasNull ){
15480 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15490 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
154a0 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 20  D_MASK.         
154b0 20 20 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20       i64 mask = 
154c0 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20  (1<<nExpr)-1;.  
154d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
154e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
154f0 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55  8(v, OP_ColumnsU
15500 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20  sed, .          
15510 20 20 20 20 20 20 20 20 69 54 61 62 2c 20 30 2c          iTab, 0,
15520 20 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c 20   0, (u8*)&mask, 
15530 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69  P4_INT64);.#endi
15540 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f.              
15550 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  *prRhsHasNull = 
15560 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
15580 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20  ( nExpr==1 ){.  
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
155a0 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
155b0 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72  lag(v, iTab, *pr
155c0 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20  RhsHasNull);.   
155d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
155e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
155f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15600 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
15610 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
15620 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 45  }.        } /* E
15630 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64  nd loop over ind
15640 65 78 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20  exes */.      } 
15650 2f 2a 20 45 6e 64 20 69 66 28 20 61 66 66 69 6e  /* End if( affin
15660 69 74 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20  ity_ok ) */.    
15670 7d 20 2f 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20  } /* End if not 
15680 61 6e 20 72 6f 77 69 64 20 69 6e 64 65 78 20 2a  an rowid index *
15690 2f 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74  /.  } /* End att
156a0 65 6d 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65  empt to optimize
156b0 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20   using an index 
156c0 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70  */..  /* If no p
156d0 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78  reexisting index
156e0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   is available fo
156f0 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a  r the IN clause.
15700 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45    ** and IN_INDE
15710 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c  X_NOOP is an all
15720 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20  owed reply.  ** 
15730 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66 20 74  and the RHS of t
15740 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
15750 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20  s a list, not a 
15760 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e  subquery.  ** an
15770 64 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74  d the RHS is not
15780 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61 73   constant or has
15790 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65   two or fewer te
157a0 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69  rms,.  ** then i
157b0 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63  t is not worth c
157c0 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
157d0 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76  eral table to ev
157e0 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20  aluate.  ** the 
157f0 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72  IN operator so r
15800 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e  eturn IN_INDEX_N
15810 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OOP..  */.  if( 
15820 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28  eType==0.   && (
15830 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44  inFlags & IN_IND
15840 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26  EX_NOOP_OK).   &
15850 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
15860 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
15870 65 63 74 29 0a 20 20 20 26 26 20 28 21 73 71 6c  ect).   && (!sql
15880 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74  ite3InRhsIsConst
15890 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78  ant(pX) || pX->x
158a0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32  .pList->nExpr<=2
158b0 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65  ).  ){.    eType
158c0 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   = IN_INDEX_NOOP
158d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79  ;.  }..  if( eTy
158e0 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==0 ){.    /* 
158f0 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  Could not find a
15900 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
15910 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65   or index to use
15920 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72   as the RHS b-tr
15930 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69  ee..    ** We wi
15940 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72  ll have to gener
15950 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
15960 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65   table to do the
15970 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   job..    */.   
15980 20 75 33 32 20 73 61 76 65 64 4e 51 75 65 72 79   u32 savedNQuery
15990 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
159a0 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69  QueryLoop;.    i
159b0 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  nt rMayHaveNull 
159c0 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  = 0;.    eType =
159d0 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20   IN_INDEX_EPH;. 
159e0 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26     if( inFlags &
159f0 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29   IN_INDEX_LOOP )
15a00 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
15a10 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a  nQueryLoop = 0;.
15a20 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c        if( pX->pL
15a30 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26  eft->iColumn<0 &
15a40 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
15a50 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
15a60 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
15a70 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
15a80 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a  _ROWID;.      }.
15a90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72      }else if( pr
15aa0 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20  RhsHasNull ){.  
15ab0 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c      *prRhsHasNul
15ac0 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  l = rMayHaveNull
15ad0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
15ae0 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  m;.    }.    ass
15af0 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
15b00 49 4e 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  IN );.    sqlite
15b10 33 43 6f 64 65 52 68 73 4f 66 49 4e 28 70 50 61  3CodeRhsOfIN(pPa
15b20 72 73 65 2c 20 70 58 2c 20 69 54 61 62 2c 20 65  rse, pX, iTab, e
15b30 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
15b40 4f 57 49 44 29 3b 0a 20 20 20 20 69 66 28 20 72  OWID);.    if( r
15b50 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20  MayHaveNull ){. 
15b60 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48       sqlite3SetH
15b70 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54  asNullFlag(v, iT
15b80 61 62 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  ab, rMayHaveNull
15b90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
15ba0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
15bb0 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  = savedNQueryLoo
15bc0 70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69  p;.  }..  if( ai
15bd0 4d 61 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e  Map && eType!=IN
15be0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
15bf0 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e   && eType!=IN_IN
15c00 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29  DEX_INDEX_DESC )
15c10 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  {.    int i, n;.
15c20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45      n = sqlite3E
15c30 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58  xprVectorSize(pX
15c40 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f  ->pLeft);.    fo
15c50 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
15c60 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20   aiMap[i] = i;. 
15c70 20 7d 0a 20 20 2a 70 69 54 61 62 20 3d 20 69 54   }.  *piTab = iT
15c80 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 65 54 79  ab;.  return eTy
15c90 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  pe;.}.#endif..#i
15ca0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15cb0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
15cc0 20 41 72 67 75 6d 65 6e 74 20 70 45 78 70 72 20   Argument pExpr 
15cd0 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20  is an (?, ?...) 
15ce0 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  IN(...) expressi
15cf0 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  on. This .** fun
15d00 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
15d10 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6e 75  and returns a nu
15d20 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
15d30 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a  ing containing .
15d40 2a 2a 20 74 68 65 20 61 66 66 69 6e 69 74 69 65  ** the affinitie
15d50 73 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  s to be used for
15d60 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   each column of 
15d70 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a  the comparison..
15d80 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  **.** It is the 
15d90 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
15da0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
15db0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
15dc0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69  returned.** stri
15dd0 6e 67 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  ng is eventually
15de0 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c   freed using sql
15df0 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f  ite3DbFree()..*/
15e00 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78  .static char *ex
15e10 70 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72  prINAffinity(Par
15e20 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
15e30 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72   *pExpr){.  Expr
15e40 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
15e50 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56  >pLeft;.  int nV
15e60 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
15e70 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
15e80 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  );.  Select *pSe
15e90 6c 65 63 74 20 3d 20 28 70 45 78 70 72 2d 3e 66  lect = (pExpr->f
15ea0 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
15eb0 65 63 74 29 20 3f 20 70 45 78 70 72 2d 3e 78 2e  ect) ? pExpr->x.
15ec0 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a 20 20 63  pSelect : 0;.  c
15ed0 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 61 73  har *zRet;..  as
15ee0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
15ef0 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a 52 65 74  =TK_IN );.  zRet
15f00 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
15f10 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62  ocRaw(pParse->db
15f20 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 69 66 28  , nVal+1);.  if(
15f30 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   zRet ){.    int
15f40 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
15f50 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
15f60 20 20 20 20 20 45 78 70 72 20 2a 70 41 20 3d 20       Expr *pA = 
15f70 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
15f80 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
15f90 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20   i);.      char 
15fa0 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  a = sqlite3ExprA
15fb0 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20 20 20  ffinity(pA);.   
15fc0 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
15fd0 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69  {.        zRet[i
15fe0 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  ] = sqlite3Compa
15ff0 72 65 41 66 66 69 6e 69 74 79 28 70 53 65 6c 65  reAffinity(pSele
16000 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ct->pEList->a[i]
16010 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20 20 20  .pExpr, a);.    
16020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16030 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a 20 20   zRet[i] = a;.  
16040 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16050 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30  zRet[nVal] = '\0
16060 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ';.  }.  return 
16070 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
16080 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16090 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
160a0 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61 72 73  ** Load the Pars
160b0 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
160c0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
160d0 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 65 72  ument with an er
160e0 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 20  ror .** message 
160f0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
16100 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65 63 74  **   "sub-select
16110 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d   returns N colum
16120 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 4d 22  ns - expected M"
16130 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69  .*/   .void sqli
16140 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f  te3SubselectErro
16150 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
16160 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20 69 6e   int nActual, in
16170 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20 63 6f  t nExpect){.  co
16180 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d  nst char *zFmt =
16190 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74   "sub-select ret
161a0 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20  urns %d columns 
161b0 2d 20 65 78 70 65 63 74 65 64 20 25 64 22 3b 0a  - expected %d";.
161c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
161d0 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74 2c 20  g(pParse, zFmt, 
161e0 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65 63 74  nActual, nExpect
161f0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
16200 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45  ** Expression pE
16210 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 20  xpr is a vector 
16220 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 75 73  that has been us
16230 65 64 20 69 6e 20 61 20 63 6f 6e 74 65 78 74 20  ed in a context 
16240 77 68 65 72 65 0a 2a 2a 20 69 74 20 69 73 20 6e  where.** it is n
16250 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 49 66  ot permitted. If
16260 20 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d   pExpr is a sub-
16270 73 65 6c 65 63 74 20 76 65 63 74 6f 72 2c 20 74  select vector, t
16280 68 69 73 20 72 6f 75 74 69 6e 65 20 0a 2a 2a 20  his routine .** 
16290 6c 6f 61 64 73 20 74 68 65 20 50 61 72 73 65 20  loads the Parse 
162a0 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20 6d 65  object with a me
162b0 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72  ssage of the for
162c0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d  m:.**.**   "sub-
162d0 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e  select returns N
162e0 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
162f0 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ted 1".**.** Or,
16300 20 69 66 20 69 74 20 69 73 20 61 20 72 65 67 75   if it is a regu
16310 6c 61 72 20 73 63 61 6c 61 72 20 76 65 63 74 6f  lar scalar vecto
16320 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 72 6f 77 20  r:.**.**   "row 
16330 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 0a 2a  value misused".*
16340 2f 20 20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  /   .void sqlite
16350 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
16360 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
16370 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 23 69 66  xpr *pExpr){.#if
16380 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16390 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
163a0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
163b0 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20  P_xIsSelect ){. 
163c0 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
163d0 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
163e0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
163f0 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
16400 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  , 1);.  }else.#e
16410 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
16420 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16430 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
16440 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d  misused");.  }.}
16450 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16460 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
16470 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
16480 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e  de that will con
16490 73 74 72 75 63 74 20 61 6e 20 65 70 68 65 6d 65  struct an epheme
164a0 72 61 6c 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  ral table contai
164b0 6e 69 6e 67 20 61 6c 6c 20 74 65 72 6d 73 0a 2a  ning all terms.*
164c0 2a 20 69 6e 20 74 68 65 20 52 48 53 20 6f 66 20  * in the RHS of 
164d0 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20  an IN operator. 
164e0 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   The IN operator
164f0 20 63 61 6e 20 62 65 20 69 6e 20 65 69 74 68 65   can be in eithe
16500 72 20 6f 66 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d  r of two.** form
16510 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 49  s:.**.**     x I
16520 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
16530 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
16540 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
16550 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
16560 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
16570 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
16580 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
16590 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
165a0 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
165b0 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
165c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
165d0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 54   IN operator.  T
165e0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
165f0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f 6e 73   for the.** cons
16600 74 72 75 63 74 65 64 20 65 70 68 65 72 6d 65 72  tructed ephermer
16610 61 6c 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  al table is retu
16620 72 6e 65 64 2e 20 20 54 68 65 20 66 69 72 73 74  rned.  The first
16630 20 74 69 6d 65 20 74 68 65 20 65 70 68 65 6d 65   time the epheme
16640 72 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ral.** table is 
16650 63 6f 6d 70 75 74 65 64 2c 20 74 68 65 20 63 75  computed, the cu
16660 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 73 20 61  rsor number is a
16670 6c 73 6f 20 73 74 6f 72 65 64 20 69 6e 20 70 45  lso stored in pE
16680 78 70 72 2d 3e 69 54 61 62 6c 65 2c 0a 2a 2a 20  xpr->iTable,.** 
16690 68 6f 77 65 76 65 72 20 74 68 65 20 63 75 72 73  however the curs
166a0 6f 72 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  or number return
166b0 65 64 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ed might not be 
166c0 74 68 65 20 73 61 6d 65 2c 20 61 73 20 69 74 20  the same, as it 
166d0 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 62 65  might.** have be
166e0 65 6e 20 64 75 70 6c 69 63 61 74 65 64 20 75 73  en duplicated us
166f0 69 6e 67 20 4f 50 5f 4f 70 65 6e 44 75 70 2e 0a  ing OP_OpenDup..
16700 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
16710 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f  er isRowid is no
16720 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 4c 48 53  n-zero, then LHS
16730 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
16740 74 6f 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  tor is guarantee
16750 64 0a 2a 2a 20 74 6f 20 62 65 20 61 20 6e 6f 6e  d.** to be a non
16760 2d 6e 75 6c 6c 20 69 6e 74 65 67 65 72 2e 20 49  -null integer. I
16770 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
16780 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
16790 20 63 61 6e 20 62 65 20 61 6e 0a 2a 2a 20 74 61   can be an.** ta
167a0 62 6c 65 20 42 2d 54 72 65 65 20 74 68 61 74 20  ble B-Tree that 
167b0 6b 65 79 65 64 20 62 79 20 6f 6e 6c 79 20 69 6e  keyed by only in
167c0 74 65 67 65 72 73 2e 20 20 54 68 65 20 6d 6f 72  tegers.  The mor
167d0 65 20 67 65 6e 65 72 61 6c 20 63 61 73 65 73 20  e general cases 
167e0 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78  uses.** an index
167f0 20 42 2d 54 72 65 65 20 77 68 69 63 68 20 63 61   B-Tree which ca
16800 6e 20 68 61 76 65 20 61 72 62 69 74 72 61 72 79  n have arbitrary
16810 20 6b 65 79 73 2c 20 62 75 74 20 69 73 20 73 6c   keys, but is sl
16820 6f 77 65 72 20 74 6f 20 62 6f 74 68 0a 2a 2a 20  ower to both.** 
16830 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 2e 0a  read and write..
16840 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 48 53  **.** If the LHS
16850 20 65 78 70 72 65 73 73 69 6f 6e 20 28 22 78 22   expression ("x"
16860 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 73   in the examples
16870 29 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  ) is a column va
16880 6c 75 65 2c 20 6f 72 0a 2a 2a 20 74 68 65 20 53  lue, or.** the S
16890 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
168a0 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
168b0 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
168c0 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
168d0 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75  t.** column is u
168e0 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
168f0 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
16900 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
16910 0a 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  .** SELECT... st
16920 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
16930 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
16940 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73  c affinity is us
16950 65 64 0a 2a 2a 20 69 66 20 65 69 74 68 65 72 20  ed.** if either 
16960 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52  column has NUMER
16970 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66  IC or INTEGER af
16980 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68  finity. If neith
16990 65 72 0a 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68  er.** 'x' nor th
169a0 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
169b0 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
169c0 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
169d0 61 66 66 69 6e 69 74 79 0a 2a 2a 20 69 73 20 75  affinity.** is u
169e0 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
169f0 69 74 65 33 43 6f 64 65 52 68 73 4f 66 49 4e 28  ite3CodeRhsOfIN(
16a00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
16a10 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
16a20 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
16a30 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
16a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16a50 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
16a60 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
16a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
16a80 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 6e 75  e this cursor nu
16a90 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  mber */.  int is
16aa0 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
16ab0 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48    /* If true, LH
16ac0 53 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a  S is a rowid */.
16ad0 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63  ){.  int addrOnc
16ae0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
16af0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
16b00 68 65 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72  he OP_Once instr
16b10 75 63 74 69 6f 6e 20 61 74 20 74 6f 70 20 2a 2f  uction at top */
16b20 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16b40 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
16b50 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
16b60 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  struction */.  E
16b70 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  xpr *pLeft;     
16b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
16b90 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
16ba0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 4b 65  operator */.  Ke
16bb0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
16bc0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79  = 0;      /* Key
16bd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
16be0 20 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20    int nVal;     
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16c00 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20   Size of vector 
16c10 70 4c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20  pLeft */.  Vdbe 
16c20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
16c30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
16c40 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
16c50 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
16c60 69 6f 6e 20 2a 2f 0a 0a 20 20 76 20 3d 20 70 50  ion */..  v = pP
16c70 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
16c80 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a  ssert( v!=0 );..
16c90 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74    /* The evaluat
16ca0 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 6d 75  ion of the IN mu
16cb0 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65  st be repeated e
16cc0 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a  very time it.  *
16cd0 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
16ce0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
16cf0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
16d00 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
16d10 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
16d20 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
16d30 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
16d40 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
16d50 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
16d60 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
16d70 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
16d80 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
16d90 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
16da0 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
16db0 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
16dc0 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
16dd0 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
16de0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   compute the RHS
16df0 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
16e00 61 6e 64 20 72 65 75 73 65 20 69 74 20 6d 61 6e  and reuse it man
16e10 79 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  y names..  */.  
16e20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
16e30 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
16e40 61 72 53 65 6c 65 63 74 29 20 26 26 20 70 50 61  arSelect) && pPa
16e50 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3d 3d 30  rse->iSelfTab==0
16e60 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 75 73 65   ){.    /* Reuse
16e70 20 6f 66 20 74 68 65 20 52 48 53 20 69 73 20 61   of the RHS is a
16e80 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 2f 2a  llowed */.    /*
16e90 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
16ea0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
16eb0 6e 20 63 6f 64 65 64 2c 20 62 75 74 20 74 68 65  n coded, but the
16ec0 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20   previous code. 
16ed0 20 20 20 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20     ** might not 
16ee0 68 61 76 65 20 62 65 65 6e 20 69 6e 76 6f 6b 65  have been invoke
16ef0 64 20 79 65 74 2c 20 73 6f 20 69 6e 76 6f 6b 65  d yet, so invoke
16f00 20 69 74 20 6e 6f 77 20 61 73 20 61 20 73 75 62   it now as a sub
16f10 72 6f 75 74 69 6e 65 2e 20 0a 20 20 20 20 2a 2f  routine. .    */
16f20 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
16f30 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
16f40 45 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20 20  EP_Subrtn) ){.  
16f50 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73      addrOnce = s
16f60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
16f70 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
16f80 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16f90 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
16fa0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
16fb0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
16fc0 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
16fd0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
16fe0 65 2c 20 30 2c 20 22 52 45 55 53 45 20 4c 49 53  e, 0, "REUSE LIS
16ff0 54 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a  T SUBQUERY %d",.
17000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
17010 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
17020 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 7d  selId));.      }
17030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17040 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
17050 6f 73 75 62 2c 20 70 45 78 70 72 2d 3e 79 2e 73  osub, pExpr->y.s
17060 75 62 2e 72 65 67 52 65 74 75 72 6e 2c 0a 20 20  ub.regReturn,.  
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17080 20 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73        pExpr->y.s
17090 75 62 2e 69 41 64 64 72 29 3b 0a 20 20 20 20 20  ub.iAddr);.     
170a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
170b0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
170c0 2c 20 69 54 61 62 2c 20 70 45 78 70 72 2d 3e 69  , iTab, pExpr->i
170d0 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71  Table);.      sq
170e0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
170f0 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
17100 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
17110 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69    }..    /* Begi
17120 6e 20 63 6f 64 69 6e 67 20 74 68 65 20 73 75 62  n coding the sub
17130 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45  routine */.    E
17140 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
17150 45 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29  Expr, EP_Subrtn)
17160 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73  ;.    pExpr->y.s
17170 75 62 2e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  ub.regReturn = +
17180 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
17190 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e     pExpr->y.sub.
171a0 69 41 64 64 72 20 3d 0a 20 20 20 20 20 20 73 71  iAddr =.      sq
171b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
171c0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
171d0 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72  , pExpr->y.sub.r
171e0 65 67 52 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20  egReturn) + 1;. 
171f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
17200 76 2c 20 22 72 65 74 75 72 6e 20 61 64 64 72 65  v, "return addre
17210 73 73 22 29 29 3b 0a 0a 20 20 20 20 61 64 64 72  ss"));..    addr
17220 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Once = sqlite3Vd
17230 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
17240 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
17250 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
17260 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
17270 20 74 68 69 73 20 69 73 20 61 20 76 65 63 74 6f   this is a vecto
17280 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  r IN operator */
17290 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72  .  pLeft = pExpr
172a0 2d 3e 70 4c 65 66 74 3b 0a 20 20 6e 56 61 6c 20  ->pLeft;.  nVal 
172b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
172c0 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
172d0 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77    assert( !isRow
172e0 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b  id || nVal==1 );
172f0 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74  ..  /* Construct
17300 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
17310 61 62 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 63  able that will c
17320 6f 6e 74 61 69 6e 20 74 68 65 20 63 6f 6e 74 65  ontain the conte
17330 6e 74 20 6f 66 0a 20 20 2a 2a 20 52 48 53 20 6f  nt of.  ** RHS o
17340 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
17350 72 2e 0a 20 20 2a 2f 0a 20 20 70 45 78 70 72 2d  r..  */.  pExpr-
17360 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
17370 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
17380 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17390 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
173a0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
173b0 61 62 6c 65 2c 20 28 69 73 52 6f 77 69 64 3f 30  able, (isRowid?0
173c0 3a 6e 56 61 6c 29 29 3b 0a 23 69 66 64 65 66 20  :nVal));.#ifdef 
173d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
173e0 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
173f0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
17400 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
17410 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
17420 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
17430 20 22 52 65 73 75 6c 74 20 6f 66 20 53 45 4c 45   "Result of SELE
17440 43 54 20 25 75 22 2c 20 70 45 78 70 72 2d 3e 78  CT %u", pExpr->x
17450 2e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64 29  .pSelect->selId)
17460 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17470 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
17480 22 52 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61  "RHS of IN opera
17490 74 6f 72 22 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  tor"));.  }.#end
174a0 69 66 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  if.  pKeyInfo = 
174b0 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71  isRowid ? 0 : sq
174c0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
174d0 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56  c(pParse->db, nV
174e0 61 6c 2c 20 31 29 3b 0a 0a 20 20 69 66 28 20 45  al, 1);..  if( E
174f0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
17500 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
17510 63 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  ct) ){.    /* Ca
17520 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
17530 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
17540 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 47 65 6e     **.    ** Gen
17550 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
17560 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
17570 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
17580 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
17590 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c  .    ** table al
175a0 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
175b0 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 2a 2f  ed above..    */
175c0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65  .    Select *pSe
175d0 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  lect = pExpr->x.
175e0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70  pSelect;.    Exp
175f0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
17600 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
17610 0a 0a 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65  ..    ExplainQue
17620 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
17630 31 2c 20 22 25 73 4c 49 53 54 20 53 55 42 51 55  1, "%sLIST SUBQU
17640 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20  ERY %d",.       
17650 20 61 64 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f   addrOnce?"":"CO
17660 52 52 45 4c 41 54 45 44 20 22 2c 20 70 53 65 6c  RRELATED ", pSel
17670 65 63 74 2d 3e 73 65 6c 49 64 0a 20 20 20 20 29  ect->selId.    )
17680 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
17690 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 2f  isRowid );.    /
176a0 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61 6e 64  * If the LHS and
176b0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
176c0 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 6d  perator do not m
176d0 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20 20 2a  atch, that.    *
176e0 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20 68 61 76  * error will hav
176f0 65 20 62 65 65 6e 20 63 61 75 67 68 74 20 6c 6f  e been caught lo
17700 6e 67 20 62 65 66 6f 72 65 20 77 65 20 72 65 61  ng before we rea
17710 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a  ch this point. *
17720 2f 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  /.    if( ALWAYS
17730 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  (pEList->nExpr==
17740 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 53  nVal) ){.      S
17750 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
17760 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
17770 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
17780 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
17790 53 52 54 5f 53 65 74 2c 20 69 54 61 62 29 3b 0a  SRT_Set, iTab);.
177a0 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53        dest.zAffS
177b0 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69  dst = exprINAffi
177c0 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78  nity(pParse, pEx
177d0 70 72 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 65  pr);.      pSele
177e0 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ct->iLimit = 0;.
177f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17800 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
17810 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
17820 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17830 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29  e( pKeyInfo==0 )
17840 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f  ; /* Caused by O
17850 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79  OM in sqlite3Key
17860 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20  InfoAlloc() */. 
17870 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
17880 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
17890 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29  Select, &dest) )
178a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
178b0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
178c0 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73  db, dest.zAffSds
178d0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
178e0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
178f0 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pKeyInfo);.     
17900 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
17910 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
17920 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
17930 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74  b, dest.zAffSdst
17940 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17950 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20   pKeyInfo!=0 ); 
17960 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73  /* OOM will caus
17970 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c  e exit after sql
17980 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a  ite3Select() */.
17990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
179a0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  List!=0 );.     
179b0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d   assert( pEList-
179c0 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
179d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
179e0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
179f0 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b  ble(pKeyInfo) );
17a00 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
17a10 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVal; i++){.  
17a20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
17a30 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
17a40 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
17a50 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65   i);.        pKe
17a60 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
17a70 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
17a80 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20  ompareCollSeq(. 
17a90 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
17aa0 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  e, p, pEList->a[
17ab0 69 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20  i].pExpr.       
17ac0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
17ad0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c  }.  }else if( AL
17ae0 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
17af0 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 2f  ist!=0) ){.    /
17b00 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
17b10 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
17b20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
17b30 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
17b40 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64  on, build an ind
17b50 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20  ex key from the 
17b60 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20  evaluation and. 
17b70 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
17b80 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
17b90 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
17ba0 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
17bb0 65 6e 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  en use.    ** th
17bc0 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
17bd0 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
17be0 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
17bf0 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
17c00 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
17c10 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
17c20 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nity..    */.   
17c30 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
17c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
17c50 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48  finity of the LH
17c60 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20  S of the IN */. 
17c70 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78     int i;.    Ex
17c80 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
17c90 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
17ca0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
17cb0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
17cc0 0a 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c  .    int r1, r2,
17cd0 20 72 33 3b 0a 20 20 20 20 61 66 66 69 6e 69 74   r3;.    affinit
17ce0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
17cf0 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a  ffinity(pLeft);.
17d00 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
17d10 79 20 29 7b 0a 20 20 20 20 20 20 61 66 66 69 6e  y ){.      affin
17d20 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
17d30 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 20  _BLOB;.    }.   
17d40 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
17d50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
17d60 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
17d70 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
17d80 6f 29 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  o) );.      pKey
17d90 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d  Info->aColl[0] =
17da0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
17db0 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
17dc0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 7d  r->pLeft);.    }
17dd0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  ..    /* Loop th
17de0 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
17df0 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
17e00 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 72 31 20 3d  st>. */.    r1 =
17e10 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17e20 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17e30 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
17e40 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
17e50 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
17e60 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
17e70 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
17e80 30 2c 20 72 32 2c 20 30 2c 20 22 22 2c 20 50 34  0, r2, 0, "", P4
17e90 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 66 6f  _STATIC);.    fo
17ea0 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r(i=pList->nExpr
17eb0 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
17ec0 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
17ed0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  m++){.      Expr
17ee0 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
17ef0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
17f00 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20  iValToIns;..    
17f10 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
17f20 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
17f30 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
17f40 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
17f50 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65    ** disable the
17f60 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67   test that was g
17f70 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74  enerated above t
17f80 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20  hat makes sure. 
17f90 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
17fa0 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
17fb0 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
17fc0 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
17fd0 74 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  t.      ** expre
17fe0 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
17ff0 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
18000 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
18010 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 61    */.      if( a
18020 64 64 72 4f 6e 63 65 20 26 26 20 21 73 71 6c 69  ddrOnce && !sqli
18030 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
18040 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
18050 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
18060 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
18070 72 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20 20 20  rOnce);.        
18080 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20  addrOnce = 0;.  
18090 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
180a0 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
180b0 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
180c0 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
180d0 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
180e0 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26     if( isRowid &
180f0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
18100 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61  nteger(pE2, &iVa
18110 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20  lToIns) ){.     
18120 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18130 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
18140 74 49 6e 74 2c 20 69 54 61 62 2c 20 72 32 2c 20  tInt, iTab, r2, 
18150 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20  iValToIns);.    
18160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18170 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r3 = sqlite3Exp
18180 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
18190 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20  se, pE2, r1);.  
181a0 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
181b0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
181c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
181d0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
181e0 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18200 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
18210 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
18220 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
18230 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
18240 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18250 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
18260 65 72 74 2c 20 69 54 61 62 2c 20 72 32 2c 20 72  ert, iTab, r2, r
18270 33 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  3);.        }els
18280 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
18290 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
182a0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
182b0 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66   r3, 1, r2, &aff
182c0 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
182d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
182e0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
182f0 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c  IdxInsert, iTab,
18300 20 72 32 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20   r2, r3, 1);.   
18310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18320 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
18330 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
18340 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
18350 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18360 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
18370 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65  );.  }.  if( pKe
18380 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 73 71 6c  yInfo ){.    sql
18390 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
183a0 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
183b0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
183c0 45 59 49 4e 46 4f 29 3b 0a 20 20 7d 0a 20 20 69  EYINFO);.  }.  i
183d0 66 28 20 61 64 64 72 4f 6e 63 65 20 29 7b 0a 20  f( addrOnce ){. 
183e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
183f0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e  mpHere(v, addrOn
18400 63 65 29 3b 0a 20 20 20 20 2f 2a 20 53 75 62 72  ce);.    /* Subr
18410 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 2a 2f  outine return */
18420 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18430 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
18440 75 72 6e 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75  urn, pExpr->y.su
18450 62 2e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  b.regReturn);.  
18460 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
18470 6e 67 65 50 31 28 76 2c 20 70 45 78 70 72 2d 3e  ngeP1(v, pExpr->
18480 79 2e 73 75 62 2e 69 41 64 64 72 2d 31 2c 20 73  y.sub.iAddr-1, s
18490 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
184a0 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 7d  tAddr(v)-1);.  }
184b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
184c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
184d0 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  Y */../*.** Gene
184e0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63  rate code for sc
184f0 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
18500 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65  used as a subque
18510 72 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  ry expression.**
18520 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
18530 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  tor:.**.**     (
18540 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
18550 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62            -- sub
18560 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49  query.**     EXI
18570 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52  STS (SELECT a FR
18580 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54  OM b)   -- EXIST
18590 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 0a 2a 2a  S subquery.**.**
185a0 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
185b0 65 74 65 72 20 69 73 20 74 68 65 20 53 45 4c 45  eter is the SELE
185c0 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  CT or EXISTS ope
185d0 72 61 74 6f 72 20 74 6f 20 62 65 20 63 6f 64 65  rator to be code
185e0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67  d..**.** The reg
185f0 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
18600 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 46 6f   the result.  Fo
18610 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e  r a multi-column
18620 20 53 45 4c 45 43 54 2c 20 0a 2a 2a 20 74 68 65   SELECT, .** the
18630 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
18640 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75  d in a contiguou
18650 73 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  s array of regis
18660 74 65 72 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ters and the.** 
18670 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
18680 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
18690 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 72 65  the left-most re
186a0 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  sult column..** 
186b0 52 65 74 75 72 6e 20 30 20 69 66 20 61 6e 20 65  Return 0 if an e
186c0 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
186d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
186e0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
186f0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
18700 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
18710 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
18720 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63  ){.  int addrOnc
18730 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
18740 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
18750 50 5f 4f 6e 63 65 20 61 74 20 74 6f 70 20 6f 66  P_Once at top of
18760 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18770 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20   int rReg = 0;  
18780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18790 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67  Register storing
187a0 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20   resulting */.  
187b0 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
187c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
187d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
187e0 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 53  to encode */.  S
187f0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
18800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
18810 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
18820 45 4c 45 43 54 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECT result */.
18830 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20    int nReg;     
18840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18850 20 52 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   Registers to al
18860 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 45 78 70 72  locate */.  Expr
18870 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20   *pLimit;       
18880 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c          /* New l
18890 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20  imit expression 
188a0 2a 2f 0a 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  */..  Vdbe *v = 
188b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
188c0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
188d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78  .  testcase( pEx
188e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
188f0 53 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  S );.  testcase(
18900 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
18910 45 4c 45 43 54 20 29 3b 0a 20 20 61 73 73 65 72  ELECT );.  asser
18920 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
18930 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72  _EXISTS || pExpr
18940 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
18950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 78 70  );.  assert( Exp
18960 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
18970 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
18980 29 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 70 45  ) );.  pSel = pE
18990 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
189a0 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61  .  /* The evalua
189b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 49 53  tion of the EXIS
189c0 54 53 2f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  TS/SELECT must b
189d0 65 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79  e repeated every
189e0 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73   time it.  ** is
189f0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20   encountered if 
18a00 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
18a10 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
18a20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
18a30 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
18a40 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
18a50 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
18a60 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
18a70 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
18a80 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
18a90 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
18aa0 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
18ab0 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
18ac0 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
18ad0 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
18ae0 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
18af0 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
18b00 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
18b10 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
18b20 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
18b30 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
18b40 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
18b50 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
18b60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
18b70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
18b80 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
18b90 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  ) ){.    /* If t
18ba0 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
18bb0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 64  already been cod
18bc0 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
18bd0 69 74 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 73  it as a.    ** s
18be0 75 62 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20  ubroutine. */.  
18bf0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
18c00 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18c10 53 75 62 72 74 6e 29 20 29 7b 0a 20 20 20 20 20  Subrtn) ){.     
18c20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
18c30 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20 22 52  n((pParse, 0, "R
18c40 45 55 53 45 20 53 55 42 51 55 45 52 59 20 25 64  EUSE SUBQUERY %d
18c50 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29 29  ", pSel->selId))
18c60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18c70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18c80 47 6f 73 75 62 2c 20 70 45 78 70 72 2d 3e 79 2e  Gosub, pExpr->y.
18c90 73 75 62 2e 72 65 67 52 65 74 75 72 6e 2c 0a 20  sub.regReturn,. 
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cb0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e         pExpr->y.
18cc0 73 75 62 2e 69 41 64 64 72 29 3b 0a 20 20 20 20  sub.iAddr);.    
18cd0 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
18ce0 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 0a 20  iTable;.    }.. 
18cf0 20 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f 64 69     /* Begin codi
18d00 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ng the subroutin
18d10 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 53 65 74  e */.    ExprSet
18d20 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
18d30 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20 20 20  EP_Subrtn);.    
18d40 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67  pExpr->y.sub.reg
18d50 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
18d60 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 45 78  e->nMem;.    pEx
18d70 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 20  pr->y.sub.iAddr 
18d80 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
18d90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18da0 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 45 78 70  Integer, 0, pExp
18db0 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75  r->y.sub.regRetu
18dc0 72 6e 29 20 2b 20 31 3b 0a 20 20 20 20 56 64 62  rn) + 1;.    Vdb
18dd0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
18de0 74 75 72 6e 20 61 64 64 72 65 73 73 22 29 29 3b  turn address"));
18df0 0a 0a 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d  ..    addrOnce =
18e00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18e10 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
18e20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18e30 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 6f 72  .  }.  .  /* For
18e40 20 61 20 53 45 4c 45 43 54 2c 20 67 65 6e 65 72   a SELECT, gener
18e50 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
18e60 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61  the values for a
18e70 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  ll columns of.  
18e80 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  ** the first row
18e90 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f   into an array o
18ea0 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  f registers and 
18eb0 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  return the index
18ec0 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   of.  ** the fir
18ed0 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20 2a  st register..  *
18ee0 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
18ef0 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69  s an EXISTS, wri
18f00 74 65 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20  te an integer 0 
18f10 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20  (not exists) or 
18f20 31 20 28 65 78 69 73 74 73 29 0a 20 20 2a 2a 20  1 (exists).  ** 
18f30 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20  into a register 
18f40 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 20  and return that 
18f50 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 2e  register number.
18f60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 62 6f  .  **.  ** In bo
18f70 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 71 75  th cases, the qu
18f80 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64  ery is augmented
18f90 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e   with "LIMIT 1".
18fa0 20 20 41 6e 79 20 0a 20 20 2a 2a 20 70 72 65 65    Any .  ** pree
18fb0 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 69 73  xisting limit is
18fc0 20 64 69 73 63 61 72 64 65 64 20 69 6e 20 70 6c   discarded in pl
18fd0 61 63 65 20 6f 66 20 74 68 65 20 6e 65 77 20 4c  ace of the new L
18fe0 49 4d 49 54 20 31 2e 0a 20 20 2a 2f 0a 20 20 45  IMIT 1..  */.  E
18ff0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
19000 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 53  (pParse, 1, "%sS
19010 43 41 4c 41 52 20 53 55 42 51 55 45 52 59 20 25  CALAR SUBQUERY %
19020 64 22 2c 0a 20 20 20 20 20 20 20 20 61 64 64 72  d",.        addr
19030 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45 4c 41  Once?"":"CORRELA
19040 54 45 44 20 22 2c 20 70 53 65 6c 2d 3e 73 65 6c  TED ", pSel->sel
19050 49 64 29 29 3b 0a 20 20 6e 52 65 67 20 3d 20 70  Id));.  nReg = p
19060 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
19070 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69  ECT ? pSel->pELi
19080 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20  st->nExpr : 1;. 
19090 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
190a0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c  stInit(&dest, 0,
190b0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29   pParse->nMem+1)
190c0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
190d0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 69 66 28 20   += nReg;.  if( 
190e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
190f0 4c 45 43 54 20 29 7b 0a 20 20 20 20 64 65 73 74  LECT ){.    dest
19100 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d  .eDest = SRT_Mem
19110 3b 0a 20 20 20 20 64 65 73 74 2e 69 53 64 73 74  ;.    dest.iSdst
19120 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
19130 0a 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20  .    dest.nSdst 
19140 3d 20 6e 52 65 67 3b 0a 20 20 20 20 73 71 6c 69  = nReg;.    sqli
19150 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19160 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73   OP_Null, 0, des
19170 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e  t.iSDParm, dest.
19180 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b  iSDParm+nReg-1);
19190 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
191a0 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
191b0 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
191c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73 74   }else{.    dest
191d0 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69  .eDest = SRT_Exi
191e0 73 74 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sts;.    sqlite3
191f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19200 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
19210 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
19220 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19230 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
19240 75 6c 74 22 29 29 3b 0a 20 20 7d 0a 20 20 70 4c  ult"));.  }.  pL
19250 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
19260 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
19270 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 26  db, TK_INTEGER,&
19280 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
19290 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  [1], 0);.  if( p
192a0 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sel->pLimit ){. 
192b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
192c0 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
192d0 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70   pSel->pLimit->p
192e0 4c 65 66 74 29 3b 0a 20 20 20 20 70 53 65 6c 2d  Left);.    pSel-
192f0 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 3d  >pLimit->pLeft =
19300 20 70 4c 69 6d 69 74 3b 0a 20 20 7d 65 6c 73 65   pLimit;.  }else
19310 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d  {.    pSel->pLim
19320 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  it = sqlite3PExp
19330 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 49 4d  r(pParse, TK_LIM
19340 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30 29 3b 0a  IT, pLimit, 0);.
19350 20 20 7d 0a 20 20 70 53 65 6c 2d 3e 69 4c 69 6d    }.  pSel->iLim
19360 69 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  it = 0;.  if( sq
19370 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
19380 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
19390 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
193a0 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69  ;.  }.  pExpr->i
193b0 54 61 62 6c 65 20 3d 20 72 52 65 67 20 3d 20 64  Table = rReg = d
193c0 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 45  est.iSDParm;.  E
193d0 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
193e0 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
193f0 64 75 63 65 29 3b 0a 20 20 69 66 28 20 61 64 64  duce);.  if( add
19400 72 4f 6e 63 65 20 29 7b 0a 20 20 20 20 73 71 6c  rOnce ){.    sql
19410 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
19420 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 0a  (v, addrOnce);..
19430 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
19440 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  e return */.    
19450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19460 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
19470 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67  pExpr->y.sub.reg
19480 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 73 71 6c  Return);.    sql
19490 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
194a0 28 76 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62  (v, pExpr->y.sub
194b0 2e 69 41 64 64 72 2d 31 2c 20 73 71 6c 69 74 65  .iAddr-1, sqlite
194c0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
194d0 28 76 29 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 72  (v)-1);.  }..  r
194e0 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65  eturn rReg;.}.#e
194f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
19500 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
19510 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19520 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
19530 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20  .** Expr pIn is 
19540 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65  an IN(...) expre
19550 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63  ssion. This func
19560 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74  tion checks that
19570 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c   the .** sub-sel
19580 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ect on the RHS o
19590 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61  f the IN() opera
195a0 74 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d 65  tor has the same
195b0 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63   number of .** c
195c0 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65  olumns as the ve
195d0 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e  ctor on the LHS.
195e0 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53 20   Or, if the RHS 
195f0 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e  of the IN() is n
19600 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65  ot .** a sub-que
19610 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53  ry, that the LHS
19620 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20   is a vector of 
19630 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73  size 1..*/.int s
19640 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 49  qlite3ExprCheckI
19650 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  N(Parse *pParse,
19660 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69   Expr *pIn){.  i
19670 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c  nt nVector = sql
19680 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
19690 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a  ze(pIn->pLeft);.
196a0 20 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67    if( (pIn->flag
196b0 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
196c0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65  ) ){.    if( nVe
196d0 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65  ctor!=pIn->x.pSe
196e0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
196f0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
19700 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
19710 6f 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  or(pParse, pIn->
19720 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
19730 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f  t->nExpr, nVecto
19740 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
19750 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
19760 65 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31  e if( nVector!=1
19770 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
19780 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 50  ectorErrorMsg(pP
19790 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74  arse, pIn->pLeft
197a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
197b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
197c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
197d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
197e0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
197f0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
19800 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  an IN expression
19810 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  ..**.**      x I
19820 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  N (SELECT ...).*
19830 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c  *      x IN (val
19840 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a  ue, value, ...).
19850 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68  **.** The left-h
19860 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69  and side (LHS) i
19870 73 20 61 20 73 63 61 6c 61 72 20 6f 72 20 76 65  s a scalar or ve
19880 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  ctor expression.
19890 20 20 54 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d    The .** right-
198a0 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 20  hand side (RHS) 
198b0 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a  is an array of z
198c0 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c  ero or more scal
198d0 61 72 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a  ar values, or a.
198e0 2a 2a 20 73 75 62 71 75 65 72 79 2e 20 20 49 66  ** subquery.  If
198f0 20 74 68 65 20 52 48 53 20 69 73 20 61 20 73 75   the RHS is a su
19900 62 71 75 65 72 79 2c 20 74 68 65 20 6e 75 6d 62  bquery, the numb
19910 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
19920 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74  umns must.** mat
19930 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
19940 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
19950 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48  vector on the LH
19960 53 2e 20 20 49 66 20 74 68 65 20 52 48 53 20 69  S.  If the RHS i
19970 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f 66 20 76  s.** a list of v
19980 61 6c 75 65 73 2c 20 74 68 65 20 4c 48 53 20 6d  alues, the LHS m
19990 75 73 74 20 62 65 20 61 20 73 63 61 6c 61 72 2e  ust be a scalar.
199a0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f   .**.** The IN o
199b0 70 65 72 61 74 6f 72 20 69 73 20 74 72 75 65 20  perator is true 
199c0 69 66 20 74 68 65 20 4c 48 53 20 76 61 6c 75 65  if the LHS value
199d0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69   is contained wi
199e0 74 68 69 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a  thin the RHS..**
199f0 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 66   The result is f
19a00 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20  alse if the LHS 
19a10 69 73 20 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f  is definitely no
19a20 74 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54  t in the RHS.  T
19a30 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  he .** result is
19a40 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 72 65   NULL if the pre
19a50 73 65 6e 63 65 20 6f 66 20 74 68 65 20 4c 48 53  sence of the LHS
19a60 20 69 6e 20 74 68 65 20 52 48 53 20 63 61 6e 6e   in the RHS cann
19a70 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d  ot be .** determ
19a80 69 6e 65 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c  ined due to NULL
19a90 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
19aa0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
19ab0 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20  code that jumps 
19ac0 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69  to destIfFalse i
19ad0 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
19ae0 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77   .** contained w
19af0 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
19b00 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  If due to NULLs 
19b10 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
19b20 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a  ine if the LHS.*
19b30 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  * is contained i
19b40 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a  n the RHS then j
19b50 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c  ump to destIfNul
19b60 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69  l.  If the LHS i
19b70 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77  s contained.** w
19b80 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68  ithin the RHS th
19b90 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  en fall through.
19ba0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73  .**.** See the s
19bb0 65 70 61 72 61 74 65 20 69 6e 2d 6f 70 65 72 61  eparate in-opera
19bc0 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61  tor.md documenta
19bd0 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20 74 68 65  tion file in the
19be0 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51   canonical.** SQ
19bf0 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72 65 65  Lite source tree
19c00 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
19c10 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
19c20 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
19c30 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20  te3ExprCodeIN(. 
19c40 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
19c50 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
19c60 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
19c70 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
19c80 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
19c90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19ca0 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  IN expression */
19cb0 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c  .  int destIfFal
19cc0 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  se,      /* Jump
19cd0 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20   here if LHS is 
19ce0 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
19cf0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
19d00 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20  t destIfNull    
19d10 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
19d20 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   if the results 
19d30 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20  are unknown due 
19d40 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20  to NULLs */.){. 
19d50 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c   int rRhsHasNull
19d60 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74   = 0;  /* Regist
19d70 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20  er that is true 
19d80 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  if RHS contains 
19d90 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20  NULL values */. 
19da0 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20   int eType;     
19db0 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
19dc0 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  f the RHS */.  i
19dd0 6e 74 20 72 4c 68 73 3b 20 20 20 20 20 20 20 20  nt rLhs;        
19de0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
19df0 28 73 29 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  (s) holding the 
19e00 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  LHS values */.  
19e10 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b 20 20 20  int rLhsOrig;   
19e20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c        /* LHS val
19e30 75 65 73 20 70 72 69 6f 72 20 74 6f 20 72 65 6f  ues prior to reo
19e40 72 64 65 72 69 6e 67 20 62 79 20 61 69 4d 61 70  rdering by aiMap
19e50 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  [] */.  Vdbe *v;
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19e70 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   Statement under
19e80 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
19e90 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20  .  int *aiMap = 
19ea0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20  0;       /* Map 
19eb0 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c  from vector fiel
19ec0 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d  d to index colum
19ed0 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66  n */.  char *zAf
19ee0 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  f = 0;       /* 
19ef0 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  Affinity string 
19f00 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20  for comparisons 
19f10 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72  */.  int nVector
19f20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
19f30 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f  ze of vectors fo
19f40 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74  r this IN operat
19f50 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d  or */.  int iDum
19f60 6d 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  my;           /*
19f70 20 44 75 6d 6d 79 20 70 61 72 61 6d 65 74 65 72   Dummy parameter
19f80 20 74 6f 20 65 78 70 72 43 6f 64 65 56 65 63 74   to exprCodeVect
19f90 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a  or() */.  Expr *
19fa0 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
19fb0 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68  /* The LHS of th
19fc0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
19fd0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
19fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70           /* loop
19ff0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
1a000 74 20 64 65 73 74 53 74 65 70 32 3b 20 20 20 20  t destStep2;    
1a010 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
1a020 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20  jump when NULLs 
1a030 73 65 65 6e 20 69 6e 20 73 74 65 70 20 32 20 2a  seen in step 2 *
1a040 2f 0a 20 20 69 6e 74 20 64 65 73 74 53 74 65 70  /.  int destStep
1a050 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 74 61  6 = 0;    /* Sta
1a060 72 74 20 6f 66 20 63 6f 64 65 20 66 6f 72 20 53  rt of code for S
1a070 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61  tep 6 */.  int a
1a080 64 64 72 54 72 75 74 68 4f 70 3b 20 20 20 20 20  ddrTruthOp;     
1a090 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6f   /* Address of o
1a0a0 70 63 6f 64 65 20 74 68 61 74 20 64 65 74 65 72  pcode that deter
1a0b0 6d 69 6e 65 73 20 74 68 65 20 49 4e 20 69 73 20  mines the IN is 
1a0c0 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  true */.  int de
1a0d0 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20  stNotNull;      
1a0e0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
1a0f0 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  a comparison is 
1a100 6e 6f 74 20 74 72 75 65 20 69 6e 20 73 74 65 70  not true in step
1a110 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
1a120 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Top;          /*
1a130 20 54 6f 70 20 6f 66 20 74 68 65 20 73 74 65 70   Top of the step
1a140 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 20 20 69 6e  -6 loop */ .  in
1a150 74 20 69 54 61 62 20 3d 20 30 3b 20 20 20 20 20  t iTab = 0;     
1a160 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
1a170 75 73 65 20 2a 2f 0a 0a 20 20 70 4c 65 66 74 20  use */..  pLeft 
1a180 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1a190 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1a1a0 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c  rCheckIN(pParse,
1a1b0 20 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e   pExpr) ) return
1a1c0 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49  ;.  zAff = exprI
1a1d0 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  NAffinity(pParse
1a1e0 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56 65 63  , pExpr);.  nVec
1a1f0 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tor = sqlite3Exp
1a200 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
1a210 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d  r->pLeft);.  aiM
1a220 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ap = (int*)sqlit
1a230 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  e3DbMallocZero(.
1a240 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
1a250 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f  , nVector*(sizeo
1a260 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28  f(int) + sizeof(
1a270 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a  char)) + 1.  );.
1a280 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
1a290 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a2a0 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70   goto sqlite3Exp
1a2b0 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f  rCodeIN_oom_erro
1a2c0 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74  r;..  /* Attempt
1a2d0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
1a2e0 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73 20  RHS. After this 
1a2f0 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e  step, if anythin
1a300 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a  g other than.  *
1a310 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  * IN_INDEX_NOOP 
1a320 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1a330 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 77 69   table opened wi
1a340 74 68 20 63 75 72 73 6f 72 20 69 54 61 62 0a 20  th cursor iTab. 
1a350 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
1a360 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
1a370 65 20 75 70 20 74 68 65 20 52 48 53 2e 20 49 66  e up the RHS. If
1a380 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
1a390 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a  s returned,.  **
1a3a0 20 74 68 65 20 52 48 53 20 68 61 73 20 6e 6f 74   the RHS has not
1a3b0 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 2e   yet been coded.
1a3c0 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73    */.  v = pPars
1a3d0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
1a3e0 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
1a3f0 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65    /* OOM detecte
1a400 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  d prior to this 
1a410 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62  routine */.  Vdb
1a420 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1a430 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22   "begin IN expr"
1a440 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71  ));.  eType = sq
1a450 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
1a460 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a  (pParse, pExpr,.
1a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a480 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f               IN_
1a490 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
1a4a0 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   | IN_INDEX_NOOP
1a4b0 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _OK,.           
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64    destIfFalse==d
1a4e0 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20  estIfNull ? 0 : 
1a4f0 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c 0a 20 20  &rRhsHasNull,.  
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a510 20 20 20 20 20 20 20 20 20 20 20 61 69 4d 61 70             aiMap
1a520 2c 20 26 69 54 61 62 29 3b 0a 0a 20 20 61 73 73  , &iTab);..  ass
1a530 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
1a540 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20  r || nVector==1 
1a550 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  || eType==IN_IND
1a560 45 58 5f 45 50 48 0a 20 20 20 20 20 20 20 7c 7c  EX_EPH.       ||
1a570 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
1a580 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65 54  _INDEX_ASC || eT
1a590 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
1a5a0 44 45 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23  DEX_DESC .  );.#
1a5b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1a5c0 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20  UG.  /* Confirm 
1a5d0 74 68 61 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e  that aiMap[] con
1a5e0 74 61 69 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e  tains nVector in
1a5f0 74 65 67 65 72 20 76 61 6c 75 65 73 20 62 65 74  teger values bet
1a600 77 65 65 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20  ween 0 and.  ** 
1a610 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20  nVector-1. */.  
1a620 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
1a630 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  or; i++){.    in
1a640 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f  t j, cnt;.    fo
1a650 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65  r(cnt=j=0; j<nVe
1a660 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61  ctor; j++) if( a
1a670 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74  iMap[j]==i ) cnt
1a680 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
1a690 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65  cnt==1 );.  }.#e
1a6a0 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  ndif..  /* Code 
1a6b0 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
1a6c0 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
1a6d0 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74   IN (...)". If t
1a6e0 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a  he LHS is a .  *
1a6f0 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69  * vector, then i
1a700 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  t is stored in a
1a710 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74  n array of nVect
1a720 6f 72 20 72 65 67 69 73 74 65 72 73 20 73 74 61  or registers sta
1a730 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72  rting .  ** at r
1a740 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c  1..  **.  ** sql
1a750 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
1a760 29 20 6d 69 67 68 74 20 68 61 76 65 20 72 65 6f  ) might have reo
1a770 72 64 65 72 65 64 20 74 68 65 20 66 69 65 6c 64  rdered the field
1a780 73 20 6f 66 20 74 68 65 20 4c 48 53 20 76 65 63  s of the LHS vec
1a790 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  tor.  ** so that
1a7a0 20 74 68 65 20 66 69 65 6c 64 73 20 61 72 65 20   the fields are 
1a7b0 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65  in the same orde
1a7c0 72 20 61 73 20 61 6e 20 65 78 69 73 74 69 6e 67  r as an existing
1a7d0 20 69 6e 64 65 78 2e 20 20 20 54 68 65 0a 20 20   index.   The.  
1a7e0 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72 72 61 79  ** aiMap[] array
1a7f0 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 70 70   contains a mapp
1a800 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6f 72 69  ing from the ori
1a810 67 69 6e 61 6c 20 4c 48 53 20 66 69 65 6c 64 20  ginal LHS field 
1a820 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68  order to.  ** th
1a830 65 20 66 69 65 6c 64 20 6f 72 64 65 72 20 74 68  e field order th
1a840 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 52  at matches the R
1a850 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  HS index..  */. 
1a860 20 72 4c 68 73 4f 72 69 67 20 3d 20 65 78 70 72   rLhsOrig = expr
1a870 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61 72 73  CodeVector(pPars
1a880 65 2c 20 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d  e, pLeft, &iDumm
1a890 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  y);.  for(i=0; i
1a8a0 3c 6e 56 65 63 74 6f 72 20 26 26 20 61 69 4d 61  <nVector && aiMa
1a8b0 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20  p[i]==i; i++){} 
1a8c0 2f 2a 20 41 72 65 20 4c 48 53 20 66 69 65 6c 64  /* Are LHS field
1a8d0 73 20 72 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a  s reordered? */.
1a8e0 20 20 69 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72    if( i==nVector
1a8f0 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66   ){.    /* LHS f
1a900 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 72 65  ields are not re
1a910 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 72  ordered */.    r
1a920 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a  Lhs = rLhsOrig;.
1a930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1a940 4e 65 65 64 20 74 6f 20 72 65 6f 72 64 65 72 20  Need to reorder 
1a950 74 68 65 20 4c 48 53 20 66 69 65 6c 64 73 20 61  the LHS fields a
1a960 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 69 4d 61  ccording to aiMa
1a970 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20  p */.    rLhs = 
1a980 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1a990 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63  nge(pParse, nVec
1a9a0 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tor);.    for(i=
1a9b0 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
1a9c0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1a9d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1a9e0 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67  P_Copy, rLhsOrig
1a9f0 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69  +i, rLhs+aiMap[i
1aa00 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], 0);.    }.  }
1aa10 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65  ..  /* If sqlite
1aa20 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64  3FindInIndex() d
1aa30 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63  id not find or c
1aa40 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74  reate an index t
1aa50 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74  hat is.  ** suit
1aa60 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74  able for evaluat
1aa70 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61  ing the IN opera
1aa80 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61  tor, then evalua
1aa90 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20  te using a.  ** 
1aaa0 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70  sequence of comp
1aab0 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20  arisons..  **.  
1aac0 2a 2a 20 54 68 69 73 20 69 73 20 73 74 65 70 20  ** This is step 
1aad0 28 31 29 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70  (1) in the in-op
1aae0 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69  erator.md optimi
1aaf0 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20  zed algorithm.. 
1ab00 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
1ab10 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29  =IN_INDEX_NOOP )
1ab20 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
1ab30 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
1ab40 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c  .pList;.    Coll
1ab50 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
1ab60 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1ab70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ab80 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c  Left);.    int l
1ab90 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33  abelOk = sqlite3
1aba0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
1abb0 61 72 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 72  arse);.    int r
1abc0 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20  2, regToFree;.  
1abd0 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20    int regCkNull 
1abe0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b  = 0;.    int ii;
1abf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
1ac00 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ac10 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1ac20 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65  t) );.    if( de
1ac30 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66  stIfNull!=destIf
1ac40 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72  False ){.      r
1ac50 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  egCkNull = sqlit
1ac60 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1ac70 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1ac80 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1ac90 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73   OP_BitAnd, rLhs
1aca0 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c  , rLhs, regCkNul
1acb0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  l);.    }.    fo
1acc0 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74  r(ii=0; ii<pList
1acd0 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
1ace0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1acf0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1ad00 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
1ad10 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54  ii].pExpr, &regT
1ad20 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66  oFree);.      if
1ad30 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73  ( regCkNull && s
1ad40 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
1ad50 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  ull(pList->a[ii]
1ad60 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
1ad70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ad80 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e  dOp3(v, OP_BitAn
1ad90 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32  d, regCkNull, r2
1ada0 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
1adb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1adc0 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  ii<pList->nExpr-
1add0 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21  1 || destIfNull!
1ade0 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
1adf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ae00 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1ae10 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f  Eq, rLhs, labelO
1ae20 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  k, r2,.         
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae40 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
1ae50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
1ae60 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ae70 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e  If(v, ii<pList->
1ae80 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20  nExpr-1);.      
1ae90 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1aea0 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e  (v, ii==pList->n
1aeb0 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20  Expr-1);.       
1aec0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1aed0 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29  geP5(v, zAff[0])
1aee0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1aef0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
1af00 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49  estIfNull==destI
1af10 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20  fFalse );.      
1af20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1af30 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c  Op4(v, OP_Ne, rL
1af40 68 73 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  hs, destIfFalse,
1af50 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1af70 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
1af80 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f  COLLSEQ); VdbeCo
1af90 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1afa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1afb0 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30  angeP5(v, zAff[0
1afc0 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ] | SQLITE_JUMPI
1afd0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
1afe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1aff0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1b000 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a  se, regToFree);.
1b010 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
1b020 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  gCkNull ){.     
1b030 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b040 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
1b050 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74   regCkNull, dest
1b060 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76  IfNull); VdbeCov
1b070 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1b080 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1b090 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
1b0a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1b0b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1b0c0 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a  el(v, labelOk);.
1b0d0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1b0e0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1b0f0 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
1b100 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78    goto sqlite3Ex
1b110 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65  prCodeIN_finishe
1b120 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  d;.  }..  /* Ste
1b130 70 20 32 3a 20 43 68 65 63 6b 20 74 6f 20 73 65  p 2: Check to se
1b140 65 20 69 66 20 74 68 65 20 4c 48 53 20 63 6f 6e  e if the LHS con
1b150 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63  tains any NULL c
1b160 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a  olumns.  If the.
1b170 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f    ** LHS does co
1b180 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e  ntain NULLs then
1b190 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   the result must
1b1a0 20 62 65 20 65 69 74 68 65 72 20 46 41 4c 53 45   be either FALSE
1b1b0 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57   or NULL..  ** W
1b1c0 65 20 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70  e will then skip
1b1d0 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61 72   the binary sear
1b1e0 63 68 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20  ch of the RHS.. 
1b1f0 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66   */.  if( destIf
1b200 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
1b210 65 20 29 7b 0a 20 20 20 20 64 65 73 74 53 74 65  e ){.    destSte
1b220 70 32 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65  p2 = destIfFalse
1b230 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1b240 65 73 74 53 74 65 70 32 20 3d 20 64 65 73 74 53  estStep2 = destS
1b250 74 65 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64  tep6 = sqlite3Vd
1b260 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
1b270 73 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  se);.  }.  for(i
1b280 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
1b290 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1b2a0 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
1b2b0 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 45 78  FieldSubexpr(pEx
1b2c0 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20  pr->pLeft, i);. 
1b2d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1b2e0 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29  prCanBeNull(p) )
1b2f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1b300 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b310 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b 69 2c 20  IsNull, rLhs+i, 
1b320 64 65 73 74 53 74 65 70 32 29 3b 0a 20 20 20 20  destStep2);.    
1b330 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1b340 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1b350 2f 2a 20 53 74 65 70 20 33 2e 20 20 54 68 65 20  /* Step 3.  The 
1b360 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e 6f 77 6e  LHS is now known
1b370 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e   to be non-NULL.
1b380 20 20 44 6f 20 74 68 65 20 62 69 6e 61 72 79 20    Do the binary 
1b390 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f 66 20 74  search.  ** of t
1b3a0 68 65 20 52 48 53 20 75 73 69 6e 67 20 74 68 65  he RHS using the
1b3b0 20 4c 48 53 20 61 73 20 61 20 70 72 6f 62 65 2e   LHS as a probe.
1b3c0 20 20 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20    If found, the 
1b3d0 72 65 73 75 6c 74 20 69 73 0a 20 20 2a 2a 20 74  result is.  ** t
1b3e0 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rue..  */.  if( 
1b3f0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1b400 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20  ROWID ){.    /* 
1b410 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
1b420 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57  e RHS is the ROW
1b430 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72  ID of table b-tr
1b440 65 65 20 61 6e 64 20 73 6f 20 77 65 20 61 6c 73  ee and so we als
1b450 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77 20 74 68  o.    ** know th
1b460 61 74 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f  at the RHS is no
1b470 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20  n-NULL.  Hence, 
1b480 77 65 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73  we combine steps
1b490 20 33 20 61 6e 64 20 34 0a 20 20 20 20 2a 2a 20   3 and 4.    ** 
1b4a0 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70  into a single op
1b4b0 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  code. */.    sql
1b4c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1b4d0 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20  , OP_SeekRowid, 
1b4e0 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73  iTab, destIfFals
1b4f0 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20 56 64  e, rLhs);.    Vd
1b500 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b510 20 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d     addrTruthOp =
1b520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b530 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 20  p0(v, OP_Goto); 
1b540 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20   /* Return True 
1b550 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
1b560 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b570 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  4(v, OP_Affinity
1b580 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f 72 2c  , rLhs, nVector,
1b590 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f   0, zAff, nVecto
1b5a0 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74  r);.    if( dest
1b5b0 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
1b5c0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ull ){.      /* 
1b5d0 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33 20 61  Combine Step 3 a
1b5e0 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f 20 61  nd Step 5 into a
1b5f0 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 20 2a   single opcode *
1b600 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
1b610 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1b620 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 54 61  OP_NotFound, iTa
1b630 62 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 0a  b, destIfFalse,.
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b650 20 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c             rLhs,
1b660 20 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43   nVector); VdbeC
1b670 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1b680 20 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78    goto sqlite3Ex
1b690 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65  prCodeIN_finishe
1b6a0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
1b6b0 4f 72 64 69 6e 61 72 79 20 53 74 65 70 20 33 2c  Ordinary Step 3,
1b6c0 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
1b6d0 65 72 65 20 46 41 4c 53 45 20 61 6e 64 20 4e 55  ere FALSE and NU
1b6e0 4c 4c 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  LL are distinct 
1b6f0 2a 2f 0a 20 20 20 20 61 64 64 72 54 72 75 74 68  */.    addrTruth
1b700 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
1b710 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
1b720 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 30 2c 0a  Found, iTab, 0,.
1b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b750 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63        rLhs, nVec
1b760 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  tor); VdbeCovera
1b770 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
1b780 20 53 74 65 70 20 34 2e 20 20 49 66 20 74 68 65   Step 4.  If the
1b790 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e 20 74 6f   RHS is known to
1b7a0 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64   be non-NULL and
1b7b0 20 77 65 20 64 69 64 20 6e 6f 74 20 66 69 6e 64   we did not find
1b7c0 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63 68 20 6f  .  ** an match o
1b7d0 6e 20 74 68 65 20 73 65 61 72 63 68 20 61 62 6f  n the search abo
1b7e0 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
1b7f0 75 6c 74 20 6d 75 73 74 20 62 65 20 46 41 4c 53  ult must be FALS
1b800 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 52  E..  */.  if( rR
1b810 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 6e 56 65  hsHasNull && nVe
1b820 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73  ctor==1 ){.    s
1b830 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b840 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
1b850 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73  rRhsHasNull, des
1b860 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 56  tIfFalse);.    V
1b870 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b880 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35    }..  /* Step 5
1b890 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  .  If we do not 
1b8a0 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 64  care about the d
1b8b0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1b8c0 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 2a 2a 20  n NULL and.  ** 
1b8d0 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a 75 73 74  FALSE, then just
1b8e0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 0a   return false. .
1b8f0 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 49    */.  if( destI
1b900 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
1b910 6c 6c 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ll ) sqlite3Vdbe
1b920 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61  Goto(v, destIfFa
1b930 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53 74 65 70  lse);..  /* Step
1b940 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   6: Loop through
1b950 20 72 6f 77 73 20 6f 66 20 74 68 65 20 52 48 53   rows of the RHS
1b960 2e 20 20 43 6f 6d 70 61 72 65 20 65 61 63 68 20  .  Compare each 
1b970 72 6f 77 20 74 6f 20 74 68 65 20 4c 48 53 2e 0a  row to the LHS..
1b980 20 20 2a 2a 20 49 66 20 61 6e 79 20 63 6f 6d 70    ** If any comp
1b990 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  arison is NULL, 
1b9a0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1b9b0 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20 61 6c 6c  is NULL.  If all
1b9c0 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  .  ** comparison
1b9d0 73 20 61 72 65 20 46 41 4c 53 45 20 74 68 65 6e  s are FALSE then
1b9e0 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c   the final resul
1b9f0 74 20 69 73 20 46 41 4c 53 45 2e 0a 20 20 2a 2a  t is FALSE..  **
1ba00 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73 63 61 6c  .  ** For a scal
1ba10 61 72 20 4c 48 53 2c 20 69 74 20 69 73 20 73 75  ar LHS, it is su
1ba20 66 66 69 63 69 65 6e 74 20 74 6f 20 63 68 65 63  fficient to chec
1ba30 6b 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  k just the first
1ba40 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20 74 68 65   row.  ** of the
1ba50 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   RHS..  */.  if(
1ba60 20 64 65 73 74 53 74 65 70 36 20 29 20 73 71 6c   destStep6 ) sql
1ba70 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1ba80 61 62 65 6c 28 76 2c 20 64 65 73 74 53 74 65 70  abel(v, destStep
1ba90 36 29 3b 0a 20 20 61 64 64 72 54 6f 70 20 3d 20  6);.  addrTop = 
1baa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bab0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
1bac0 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73  iTab, destIfFals
1bad0 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  e);.  VdbeCovera
1bae0 67 65 28 76 29 3b 0a 20 20 69 66 28 20 6e 56 65  ge(v);.  if( nVe
1baf0 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 64 65  ctor>1 ){.    de
1bb00 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69  stNotNull = sqli
1bb10 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1bb20 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 65 6c 73  (pParse);.  }els
1bb30 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 6e 56  e{.    /* For nV
1bb40 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d 62 69 6e  ector==1, combin
1bb50 65 20 73 74 65 70 73 20 36 20 61 6e 64 20 37 20  e steps 6 and 7 
1bb60 62 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  by immediately r
1bb70 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  eturning.    ** 
1bb80 46 41 4c 53 45 20 69 66 20 74 68 65 20 66 69 72  FALSE if the fir
1bb90 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  st comparison is
1bba0 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20   not NULL */.   
1bbb0 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 64   destNotNull = d
1bbc0 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 7d 0a  estIfFalse;.  }.
1bbd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
1bbe0 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
1bbf0 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 43 6f 6c  Expr *p;.    Col
1bc00 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
1bc10 20 69 6e 74 20 72 33 20 3d 20 73 71 6c 69 74 65   int r3 = sqlite
1bc20 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1bc30 73 65 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  se);.    p = sql
1bc40 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
1bc50 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29  ubexpr(pLeft, i)
1bc60 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
1bc70 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1bc80 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
1bc90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bca0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1bcb0 20 69 54 61 62 2c 20 69 2c 20 72 33 29 3b 0a 20   iTab, i, r3);. 
1bcc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bcd0 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp4(v, OP_Ne, r
1bce0 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e 75  Lhs+i, destNotNu
1bcf0 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20  ll, r3,.        
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1bd10 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
1bd20 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56 64 62  OLLSEQ);.    Vdb
1bd30 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1bd40 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1bd50 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1bd60 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  r3);.  }.  sqlit
1bd70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bd80 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
1bd90 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20 6e  IfNull);.  if( n
1bda0 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Vector>1 ){.    
1bdb0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1bdc0 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 4e  veLabel(v, destN
1bdd0 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  otNull);.    sql
1bde0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1bdf0 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
1be00 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20 20   addrTop+1);.   
1be10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1be20 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65 70 20 37  ;..    /* Step 7
1be30 3a 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74  :  If we reach t
1be40 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
1be50 6f 77 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ow that the resu
1be60 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  lt must.    ** b
1be70 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20 20 20 20  e false. */.    
1be80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1be90 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1bea0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1beb0 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 73 20 68   }..  /* Jumps h
1bec0 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ere in order to 
1bed0 72 65 74 75 72 6e 20 74 72 75 65 2e 20 2a 2f 0a  return true. */.
1bee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1bef0 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 72 75  pHere(v, addrTru
1bf00 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74 65 33 45  thOp);..sqlite3E
1bf10 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68  xprCodeIN_finish
1bf20 65 64 3a 0a 20 20 69 66 28 20 72 4c 68 73 21 3d  ed:.  if( rLhs!=
1bf30 72 4c 68 73 4f 72 69 67 20 29 20 73 71 6c 69 74  rLhsOrig ) sqlit
1bf40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1bf50 28 70 50 61 72 73 65 2c 20 72 4c 68 73 29 3b 0a  (pParse, rLhs);.
1bf60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1bf70 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29  , "end IN expr")
1bf80 29 3b 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  );.sqlite3ExprCo
1bf90 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3a 0a  deIN_oom_error:.
1bfa0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1bfb0 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61  pParse->db, aiMa
1bfc0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
1bfd0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1bfe0 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  zAff);.}.#endif 
1bff0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
1c000 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
1c010 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c020 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f  FLOATING_POINT./
1c030 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
1c040 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
1c050 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66  t will put the f
1c060 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
1c070 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64   value described
1c080 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e   by z[0..n-1] in
1c090 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
1c0a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20  ..**.** The z[] 
1c0b0 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62  string will prob
1c0c0 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f  ably not be zero
1c0d0 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
1c0e0 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63  t the .** z[n] c
1c0f0 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72  haracter is guar
1c100 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d  anteed to be som
1c110 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ething that does
1c120 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b   not look.** lik
1c130 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  e the continuati
1c140 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  on of the number
1c150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c160 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a   codeReal(Vdbe *
1c170 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
1c180 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
1c190 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69  , int iMem){.  i
1c1a0 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20  f( ALWAYS(z!=0) 
1c1b0 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
1c1c0 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  lue;.    sqlite3
1c1d0 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20  AtoF(z, &value, 
1c1e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1c1f0 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
1c200 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73  ;.    assert( !s
1c210 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
1c220 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77  e) ); /* The new
1c230 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75   AtoF never retu
1c240 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69  rns NaN */.    i
1c250 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
1c260 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
1c270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c280 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
1c290 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  Real, 0, iMem, 0
1c2a0 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
1c2b0 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23  4_REAL);.  }.}.#
1c2c0 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  endif.../*.** Ge
1c2d0 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
1c2e0 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
1c2f0 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  put the integer 
1c300 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74  describe by.** t
1c310 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e  ext z[0..n-1] in
1c320 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
1c330 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a  ..**.** Expr.u.z
1c340 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20  Token is always 
1c350 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65  UTF8 and zero-te
1c360 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  rminated..*/.sta
1c370 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
1c380 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  eger(Parse *pPar
1c390 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1c3a0 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e   int negFlag, in
1c3b0 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20  t iMem){.  Vdbe 
1c3c0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1c3d0 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  be;.  if( pExpr-
1c3e0 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
1c3f0 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  alue ){.    int 
1c400 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  i = pExpr->u.iVa
1c410 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  lue;.    assert(
1c420 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   i>=0 );.    if(
1c430 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d   negFlag ) i = -
1c440 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  i;.    sqlite3Vd
1c450 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1c460 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29  nteger, i, iMem)
1c470 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1c480 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61  nt c;.    i64 va
1c490 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lue;.    const c
1c4a0 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e  har *z = pExpr->
1c4b0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73  u.zToken;.    as
1c4c0 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
1c4d0 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63    c = sqlite3Dec
1c4e0 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76  OrHexToI64(z, &v
1c4f0 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 28  alue);.    if( (
1c500 63 3d 3d 33 20 26 26 20 21 6e 65 67 46 6c 61 67  c==3 && !negFlag
1c510 29 20 7c 7c 20 28 63 3d 3d 32 29 20 7c 7c 20 28  ) || (c==2) || (
1c520 6e 65 67 46 6c 61 67 20 26 26 20 76 61 6c 75 65  negFlag && value
1c530 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
1c540 29 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  )){.#ifdef SQLIT
1c550 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1c560 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69  POINT.      sqli
1c570 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1c580 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69  se, "oversized i
1c590 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e  nteger: %s%s", n
1c5a0 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  egFlag ? "-" : "
1c5b0 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66  ", z);.#else.#if
1c5c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c5d0 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20  _HEX_INTEGER.   
1c5e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
1c5f0 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32  trnicmp(z,"0x",2
1c600 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1c610 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1c620 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74  pParse, "hex lit
1c630 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73  eral too big: %s
1c640 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f 22 2d 22  %s", negFlag?"-"
1c650 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65  :"",z);.      }e
1c660 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
1c670 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52   {.        codeR
1c680 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61  eal(v, z, negFla
1c690 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  g, iMem);.      
1c6a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
1c6b0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  se{.      if( ne
1c6c0 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d  gFlag ){ value =
1c6d0 20 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c 45 53 54   c==3 ? SMALLEST
1c6e0 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b  _INT64 : -value;
1c6f0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1c700 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
1c710 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69  , OP_Int64, 0, i
1c720 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61  Mem, 0, (u8*)&va
1c730 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  lue, P4_INT64);.
1c740 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
1c750 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1c760 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e  hat will load in
1c770 74 6f 20 72 65 67 69 73 74 65 72 20 72 65 67 4f  to register regO
1c780 75 74 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  ut a value that 
1c790 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  is.** appropriat
1c7a0 65 20 66 6f 72 20 74 68 65 20 69 49 64 78 43 6f  e for the iIdxCo
1c7b0 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  l-th column of i
1c7c0 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f  ndex pIdx..*/.vo
1c7d0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1c7e0 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d  deLoadIndexColum
1c7f0 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
1c800 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72 73  se,  /* The pars
1c810 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1c820 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
1c830 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68   /* The index wh
1c840 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f  ose column is to
1c850 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20   be loaded */.  
1c860 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
1c870 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
1c880 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72 6f  ng to a table ro
1c890 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  w */.  int iIdxC
1c8a0 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ol,    /* The co
1c8b0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
1c8c0 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  x to be loaded *
1c8d0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20  /.  int regOut  
1c8e0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
1c8f0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61   index column va
1c900 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
1c910 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36  ster */.){.  i16
1c920 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d   iTabCol = pIdx-
1c930 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f  >aiColumn[iIdxCo
1c940 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43 6f  l];.  if( iTabCo
1c950 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20  l==XN_EXPR ){.  
1c960 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
1c970 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20 20  aColExpr );.    
1c980 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43  assert( pIdx->aC
1c990 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49  olExpr->nExpr>iI
1c9a0 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61  dxCol );.    pPa
1c9b0 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20  rse->iSelfTab = 
1c9c0 69 54 61 62 43 75 72 20 2b 20 31 3b 0a 20 20 20  iTabCur + 1;.   
1c9d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c9e0 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 64  Copy(pParse, pId
1c9f0 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69  x->aColExpr->a[i
1ca00 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72  IdxCol].pExpr, r
1ca10 65 67 4f 75 74 29 3b 0a 20 20 20 20 70 50 61 72  egOut);.    pPar
1ca20 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30  se->iSelfTab = 0
1ca30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1ca40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1ca50 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70  tColumnOfTable(p
1ca60 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 49  Parse->pVdbe, pI
1ca70 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61 62  dx->pTable, iTab
1ca80 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cur,.           
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 20 20 20 20 20 20 20 69 54 61 62 43 6f 6c           iTabCol
1cab0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d  , regOut);.  }.}
1cac0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1cad0 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74   code to extract
1cae0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1caf0 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
1cb00 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a   of a table..*/.
1cb10 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1cb20 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1cb30 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c  able(.  Vdbe *v,
1cb40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1cb50 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  DBE under constr
1cb60 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c  uction */.  Tabl
1cb70 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54  e *pTab,    /* T
1cb80 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
1cb90 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f  ing the value */
1cba0 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
1cbb0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
1cbc0 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20  cursor.  Or the 
1cbd0 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49  PK cursor for WI
1cbe0 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20  THOUT ROWID */. 
1cbf0 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
1cc00 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1cc10 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61   column to extra
1cc20 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ct */.  int regO
1cc30 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61  ut      /* Extra
1cc40 63 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74  ct the value int
1cc50 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  o this register 
1cc60 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 54 61 62  */.){.  if( pTab
1cc70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1cc80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1cc90 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 43  OP_Column, iTabC
1cca0 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ur, iCol, regOut
1ccb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1ccc0 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20   }.  if( iCol<0 
1ccd0 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69  || iCol==pTab->i
1cce0 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  PKey ){.    sqli
1ccf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1cd00 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43   OP_Rowid, iTabC
1cd10 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ur, regOut);.  }
1cd20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70  else{.    int op
1cd30 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61   = IsVirtual(pTa
1cd40 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  b) ? OP_VColumn 
1cd50 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
1cd60 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20   int x = iCol;. 
1cd70 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
1cd80 28 70 54 61 62 29 20 26 26 20 21 49 73 56 69 72  (pTab) && !IsVir
1cd90 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
1cda0 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43      x = sqlite3C
1cdb0 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c  olumnOfIndex(sql
1cdc0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
1cdd0 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29  dex(pTab), iCol)
1cde0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1cdf0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1ce00 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c   op, iTabCur, x,
1ce10 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20   regOut);.  }.  
1ce20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
1ce30 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
1ce40 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
1ce50 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
1ce60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
1ce70 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1ce80 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
1ce90 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
1cea0 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
1ceb0 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20   pTab and store 
1cec0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
1ced0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1cee0 67 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  g. .**.** There 
1cef0 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
1cf00 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69  cursor to pTab i
1cf10 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68  n iTable when th
1cf20 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
1cf30 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f   called.  If iCo
1cf40 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65  lumn<0 then code
1cf50 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68   is generated th
1cf60 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20  at extracts the 
1cf70 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rowid..*/.int sq
1cf80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1cf90 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
1cfa0 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
1cfb0 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
1cfc0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
1cfd0 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
1cfe0 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
1cff0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
1d000 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
1d010 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
1d020 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
1d030 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
1d040 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
1d050 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1d060 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
1d070 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
1d080 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
1d090 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg,        /* St
1d0a0 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
1d0b0 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20   */.  u8 p5     
1d0c0 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c         /* P5 val
1d0d0 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e  ue for OP_Column
1d0e0 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20   + FLAGS */.){. 
1d0f0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1d100 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
1d110 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
1d120 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1d130 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
1d140 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
1d150 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
1d160 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73   if( p5 ){.    s
1d170 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1d180 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 0a 20  P5(v, p5);.  }. 
1d190 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
1d1a0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1d1b0 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e  code to move con
1d1c0 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74  tent from regist
1d1d0 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f  ers iFrom...iFro
1d1e0 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72  m+nReg-1.** over
1d1f0 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65   to iTo..iTo+nRe
1d200 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  g-1..*/.void sql
1d210 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
1d220 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d230 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
1d240 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
1d250 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d   assert( iFrom>=
1d260 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f  iTo+nReg || iFro
1d270 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20  m+nReg<=iTo );. 
1d280 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d290 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
1d2a0 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d  , OP_Move, iFrom
1d2b0 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 7d 0a  , iTo, nReg);.}.
1d2c0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1d2d0 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
1d2e0 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f  on node to a TK_
1d2f0 52 45 47 49 53 54 45 52 20 72 65 66 65 72 65 6e  REGISTER referen
1d300 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65 72  cing.** register
1d310 20 69 52 65 67 2e 20 20 54 68 65 20 63 61 6c 6c   iReg.  The call
1d320 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
1d330 68 61 74 20 69 52 65 67 20 61 6c 72 65 61 64 79  hat iReg already
1d340 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
1d350 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
1d360 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
1d370 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1d380 64 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72  d exprToRegister
1d390 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52  (Expr *p, int iR
1d3a0 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20  eg){.  p->op2 = 
1d3b0 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d  p->op;.  p->op =
1d3c0 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
1d3d0 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67  p->iTable = iReg
1d3e0 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f  ;.  ExprClearPro
1d3f0 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70  perty(p, EP_Skip
1d400 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 76 61 6c  );.}../*.** Eval
1d410 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
1d420 6f 6e 20 28 65 69 74 68 65 72 20 61 20 76 65 63  on (either a vec
1d430 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72 20  tor or a scalar 
1d440 65 78 70 72 65 73 73 69 6f 6e 29 20 61 6e 64 20  expression) and 
1d450 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65 73  store.** the res
1d460 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e 67 75 6f  ult in continguo
1d470 75 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  us temporary reg
1d480 69 73 74 65 72 73 2e 20 20 52 65 74 75 72 6e 20  isters.  Return 
1d490 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
1d4a0 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
1d4b0 65 72 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  er used to store
1d4c0 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
1d4d0 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
1d4e0 65 64 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  ed result regist
1d4f0 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
1d500 79 20 73 63 61 6c 61 72 2c 20 74 68 65 6e 20 61  y scalar, then a
1d510 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20 74 68 61  lso write.** tha
1d520 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
1d530 72 20 69 6e 74 6f 20 2a 70 69 46 72 65 65 61 62  r into *piFreeab
1d540 6c 65 2e 20 20 49 66 20 74 68 65 20 72 65 74 75  le.  If the retu
1d550 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67 69  rned result regi
1d560 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 61  ster.** is not a
1d570 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 66   temporary or if
1d580 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1d590 69 73 20 61 20 76 65 63 74 6f 72 20 73 65 74 20  is a vector set 
1d5a0 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a 2a 20 74  *piFreeable.** t
1d5b0 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  o 0..*/.static i
1d5c0 6e 74 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f  nt exprCodeVecto
1d5d0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1d5e0 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70   Expr *p, int *p
1d5f0 69 46 72 65 65 61 62 6c 65 29 7b 0a 20 20 69 6e  iFreeable){.  in
1d600 74 20 69 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74  t iResult;.  int
1d610 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   nResult = sqlit
1d620 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
1d630 28 70 29 3b 0a 20 20 69 66 28 20 6e 52 65 73 75  (p);.  if( nResu
1d640 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 52 65  lt==1 ){.    iRe
1d650 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  sult = sqlite3Ex
1d660 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1d670 65 2c 20 70 2c 20 70 69 46 72 65 65 61 62 6c 65  e, p, piFreeable
1d680 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1d690 2a 70 69 46 72 65 65 61 62 6c 65 20 3d 20 30 3b  *piFreeable = 0;
1d6a0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
1d6b0 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 23 69 66  TK_SELECT ){.#if
1d6c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1d6d0 51 55 45 52 59 0a 20 20 20 20 20 20 69 52 65 73  QUERY.      iRes
1d6e0 75 6c 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  ult = 0;.#else. 
1d6f0 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73       iResult = s
1d700 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
1d710 65 63 74 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ect(pParse, p);.
1d720 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1d730 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1d740 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70       iResult = p
1d750 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1d760 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
1d770 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20  m += nResult;.  
1d780 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1d790 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20  Result; i++){.  
1d7a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d7b0 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
1d7c0 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69  pParse, p->x.pLi
1d7d0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1d7e0 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  i+iResult);.    
1d7f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1d800 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a  return iResult;.
1d810 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1d820 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
1d830 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
1d840 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
1d850 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1d860 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
1d870 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1d880 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
1d890 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1d8a0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1d8b0 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1d8c0 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1d8d0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1d8e0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1d8f0 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1d900 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1d910 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1d920 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1d930 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1d940 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1d950 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1d960 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1d970 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1d980 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1d990 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1d9a0 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1d9b0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1d9c0 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1d9d0 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1d9e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d9f0 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1da00 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1da10 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1da20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1da30 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1da40 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1da50 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1da60 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1da70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1da80 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1da90 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1daa0 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1dab0 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1dac0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1dad0 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1dae0 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1daf0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1db00 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1db10 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1db20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1db30 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1db40 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1db50 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1db60 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1db70 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1db80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1db90 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1dba0 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20  mbers */.  Expr 
1dbb0 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20  tempX;          
1dbc0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
1dbd0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  y expression nod
1dbe0 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20  e */.  int p5 = 
1dbf0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  0;..  assert( ta
1dc00 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
1dc10 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
1dc20 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
1dc30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1dc40 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1dc50 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
1dc60 72 6e 20 30 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f  rn 0;.  }..expr_
1dc70 63 6f 64 65 5f 64 6f 6f 76 65 72 3a 0a 20 20 69  code_doover:.  i
1dc80 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
1dc90 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
1dca0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
1dcb0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
1dcc0 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
1dcd0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
1dce0 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
1dcf0 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
1dd00 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1dd10 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
1dd20 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1dd30 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
1dd40 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
1dd50 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
1dd60 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
1dd70 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
1dd80 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69   assert( pCol->i
1dd90 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Mem>0 );.       
1dda0 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d   return pCol->iM
1ddb0 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  em;.      }else 
1ddc0 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
1ddd0 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
1dde0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ddf0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1de00 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
1de10 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c  >sortingIdxPTab,
1de20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1de30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1de40 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1de50 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
1de60 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1de70 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
1de80 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1de90 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
1dea0 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
1deb0 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
1dec0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1ded0 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20  .      int iTab 
1dee0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1def0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1df00 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1df10 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20 29  , EP_FixedCol) )
1df20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1df30 73 20 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73  s COLUMN express
1df40 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ion is really a 
1df50 63 6f 6e 73 74 61 6e 74 20 64 75 65 20 74 6f 20  constant due to 
1df60 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
1df70 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
1df80 6e 74 73 2c 20 61 6e 64 20 74 68 61 74 20 63 6f  nts, and that co
1df90 6e 73 74 61 6e 74 20 69 73 20 63 6f 64 65 64 20  nstant is coded 
1dfa0 62 79 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c  by the pExpr->pL
1dfb0 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  eft.        ** e
1dfc0 78 70 72 65 73 73 73 69 6f 6e 2e 20 20 48 6f 77  xpresssion.  How
1dfd0 65 76 65 72 2c 20 6d 61 6b 65 20 73 75 72 65 20  ever, make sure 
1dfe0 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 68 61 73  the constant has
1dff0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
1e000 20 20 20 20 20 2a 2a 20 64 61 74 61 74 79 70 65       ** datatype
1e010 20 62 79 20 61 70 70 6c 79 69 6e 67 20 74 68 65   by applying the
1e020 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   Affinity of the
1e030 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 6f   table column to
1e040 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1e050 63 6f 6e 73 74 61 6e 74 2e 0a 20 20 20 20 20 20  constant..      
1e060 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
1e070 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
1e080 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1e090 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e0a0 66 74 2c 74 61 72 67 65 74 29 3b 0a 20 20 20 20  ft,target);.    
1e0b0 20 20 20 20 69 6e 74 20 61 66 66 20 3d 20 73 71      int aff = sq
1e0c0 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e  lite3TableColumn
1e0d0 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
1e0e0 79 2e 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69  y.pTab, pExpr->i
1e0f0 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
1e100 20 69 66 28 20 61 66 66 21 3d 53 51 4c 49 54 45   if( aff!=SQLITE
1e110 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  _AFF_BLOB ){.   
1e120 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
1e130 6e 73 74 20 63 68 61 72 20 7a 41 66 66 5b 5d 20  nst char zAff[] 
1e140 3d 20 22 42 5c 30 30 30 43 5c 30 30 30 44 5c 30  = "B\000C\000D\0
1e150 30 30 45 22 3b 0a 20 20 20 20 20 20 20 20 20 20  00E";.          
1e160 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 41  assert( SQLITE_A
1e170 46 46 5f 42 4c 4f 42 3d 3d 27 41 27 20 29 3b 0a  FF_BLOB=='A' );.
1e180 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1e190 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ( SQLITE_AFF_TEX
1e1a0 54 3d 3d 27 42 27 20 29 3b 0a 20 20 20 20 20 20  T=='B' );.      
1e1b0 20 20 20 20 69 66 28 20 69 52 65 67 21 3d 74 61      if( iReg!=ta
1e1c0 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rget ){.        
1e1d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e1e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1e1f0 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74 29  y, iReg, target)
1e200 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 52  ;.            iR
1e210 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
1e220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e240 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
1e250 69 74 79 2c 20 69 52 65 67 2c 20 31 2c 20 30 2c  ity, iReg, 1, 0,
1e260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 41               &zA
1e280 66 66 5b 28 61 66 66 2d 27 42 27 29 2a 32 5d 2c  ff[(aff-'B')*2],
1e290 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1e2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1e2b0 65 74 75 72 6e 20 69 52 65 67 3b 0a 20 20 20 20  eturn iReg;.    
1e2c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 54    }.      if( iT
1e2d0 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ab<0 ){.        
1e2e0 69 66 28 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  if( pParse->iSel
1e2f0 66 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20  fTab<0 ){.      
1e300 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e      /* Generatin
1e310 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  g CHECK constrai
1e320 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  nts or inserting
1e330 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e   into partial in
1e340 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  dex */.         
1e350 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69   return pExpr->i
1e360 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72 73 65 2d  Column - pParse-
1e370 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20  >iSelfTab;.     
1e380 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e390 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e      /* Coding an
1e3a0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
1e3b0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69   is part of an i
1e3c0 6e 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d  ndex where colum
1e3d0 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20  n names.        
1e3e0 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
1e3f0 78 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74  x refer to the t
1e400 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68  able to which th
1e410 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20  e index belongs 
1e420 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61  */.          iTa
1e430 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  b = pParse->iSel
1e440 66 54 61 62 20 2d 20 31 3b 0a 20 20 20 20 20 20  fTab - 1;.      
1e450 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1e460 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1e470 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1e480 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  n(pParse, pExpr-
1e490 3e 79 2e 70 54 61 62 2c 0a 20 20 20 20 20 20 20  >y.pTab,.       
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4b0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1e4c0 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61  Column, iTab, ta
1e4d0 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4f0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29       pExpr->op2)
1e500 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e510 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
1e520 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
1e530 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1e540 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1e550 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e560 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e570 54 4b 5f 54 52 55 45 46 41 4c 53 45 3a 20 7b 0a  TK_TRUEFALSE: {.
1e580 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e590 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1e5a0 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33 45 78  teger, sqlite3Ex
1e5b0 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78  prTruthValue(pEx
1e5c0 70 72 29 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  pr), target);.  
1e5d0 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1e5e0 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  t;.    }.#ifndef
1e5f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1e600 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
1e610 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
1e620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1e630 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e640 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1e650 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ue) );.      cod
1e660 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e  eReal(v, pExpr->
1e670 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72  u.zToken, 0, tar
1e680 67 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  get);.      retu
1e690 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1e6a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1e6b0 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
1e6c0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1e6d0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e6e0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1e6f0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1e700 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
1e710 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70 72  v, target, pExpr
1e720 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1e730 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1e740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e750 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
1e760 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e770 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1e780 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1e790 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e7a0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1e7b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
1e7c0 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
1e7d0 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
1e7e0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63    int n;.      c
1e7f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
1e800 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b      char *zBlob;
1e810 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1e820 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e830 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1e840 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
1e850 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1e860 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20  oken[0]=='x' || 
1e870 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e880 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20  0]=='X' );.     
1e890 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1e8a0 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27  u.zToken[1]=='\'
1e8b0 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26  ' );.      z = &
1e8c0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1e8d0 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71  2];.      n = sq
1e8e0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
1e8f0 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   - 1;.      asse
1e900 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29  rt( z[n]=='\'' )
1e910 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20  ;.      zBlob = 
1e920 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62  sqlite3HexToBlob
1e930 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
1e940 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ), z, n);.      
1e950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e960 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f  4(v, OP_Blob, n/
1e970 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42  2, target, 0, zB
1e980 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  lob, P4_DYNAMIC)
1e990 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1e9a0 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  arget;.    }.#en
1e9b0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
1e9c0 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
1e9d0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e9e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e9f0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1ea00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ea10 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21  pExpr->u.zToken!
1ea20 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1ea30 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1ea40 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ken[0]!=0 );.   
1ea50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ea60 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61  dOp2(v, OP_Varia
1ea70 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
1ea80 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
1ea90 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75      if( pExpr->u
1eaa0 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b  .zToken[1]!=0 ){
1eab0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1eac0 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
1ead0 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70  VListNumToName(p
1eae0 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 70  Parse->pVList, p
1eaf0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
1eb00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1eb10 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1eb20 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63 6d  0]=='?' || strcm
1eb30 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
1eb40 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20  n, z)==0 );.    
1eb50 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69      pParse->pVLi
1eb60 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e  st[0] = 0; /* In
1eb70 64 69 63 61 74 65 20 56 4c 69 73 74 20 6d 61 79  dicate VList may
1eb80 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65 6e   no longer be en
1eb90 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20 20 20 20  larged */.      
1eba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
1ebb0 65 6e 64 50 34 28 76 2c 20 28 63 68 61 72 2a 29  endP4(v, (char*)
1ebc0 7a 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  z, P4_STATIC);. 
1ebd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1ebe0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1ebf0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  }.    case TK_RE
1ec00 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
1ec10 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54  return pExpr->iT
1ec20 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  able;.    }.#ifn
1ec30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ec40 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
1ec50 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
1ec60 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
1ec70 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
1ec80 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
1ec90 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67  ) */.      inReg
1eca0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1ecb0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1ecc0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
1ecd0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
1ece0 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
1ecf0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ed00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ed10 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
1ed20 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1ed30 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
1ed40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ed50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ed60 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61  2(v, OP_Cast, ta
1ed70 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1ed90 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
1eda0 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e(pExpr->u.zToke
1edb0 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 72 65  n, 0));.      re
1edc0 74 75 72 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20  turn inReg;.    
1edd0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1ede0 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
1edf0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1ee00 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1ee10 54 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  T:.      op = (o
1ee20 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
1ee30 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
1ee40 20 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c   p5 = SQLITE_NUL
1ee50 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61  LEQ;.      /* fa
1ee60 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll-through */.  
1ee70 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
1ee80 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
1ee90 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
1eea0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
1eeb0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
1eec0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
1eed0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
1eee0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
1eef0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1ef00 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
1ef10 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20  pLeft) ){.      
1ef20 20 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70    codeVectorComp
1ef30 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1ef40 72 2c 20 74 61 72 67 65 74 2c 20 6f 70 2c 20 70  r, target, op, p
1ef50 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  5);.      }else{
1ef60 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
1ef70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1ef80 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  p(pParse, pLeft,
1ef90 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1efa0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1efb0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1efc0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1efd0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1efe0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  .        codeCom
1eff0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
1f000 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1f010 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1f020 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67     r1, r2, inReg
1f030 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
1f040 20 7c 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20   | p5);.        
1f050 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
1f060 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
1f070 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
1f080 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1f090 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20  OP_Lt);.        
1f0a0 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
1f0b0 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
1f0c0 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
1f0d0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1f0e0 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20  OP_Le);.        
1f0f0 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
1f100 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
1f110 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
1f120 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1f130 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20  OP_Gt);.        
1f140 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
1f150 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
1f160 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
1f170 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1f180 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20  OP_Ge);.        
1f190 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
1f1a0 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
1f1b0 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
1f1c0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1f1d0 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20  OP_Eq);.        
1f1e0 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
1f1f0 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
1f200 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
1f210 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1f220 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20  OP_Ne);.        
1f230 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f240 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
1f250 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f260 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1f270 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1f280 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1f290 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
1f2a0 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
1f2b0 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
1f2c0 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
1f2d0 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
1f2e0 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
1f2f0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
1f300 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
1f310 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
1f320 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
1f330 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
1f340 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
1f350 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
1f360 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
1f370 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
1f380 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  And );          
1f390 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f3a0 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
1f3b0 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
1f3c0 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20  P_Or );         
1f3d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f3e0 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20  p==TK_OR );.    
1f3f0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
1f400 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20  S==OP_Add );    
1f410 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f420 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
1f430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f440 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
1f450 61 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63  act );     testc
1f460 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55  ase( op==TK_MINU
1f470 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
1f480 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
1f490 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20  mainder );      
1f4a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f4b0 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  _REM );.      as
1f4c0 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d  sert( TK_BITAND=
1f4d0 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20  =OP_BitAnd );   
1f4e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f4f0 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20  =TK_BITAND );.  
1f500 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
1f510 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29  ITOR==OP_BitOr )
1f520 3b 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  ;        testcas
1f530 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20  e( op==TK_BITOR 
1f540 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f550 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
1f560 76 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65  vide );       te
1f570 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
1f580 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73  LASH );.      as
1f590 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
1f5a0 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
1f5b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f5c0 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20  =TK_LSHIFT );.  
1f5d0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
1f5e0 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
1f5f0 69 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73  ight );  testcas
1f600 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
1f610 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f620 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f  ( TK_CONCAT==OP_
1f630 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74  Concat );      t
1f640 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f650 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20  CONCAT );.      
1f660 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f670 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f680 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f690 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f6a0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1f6b0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f6c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f6d0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1f6e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f6f0 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20  dOp3(v, op, r2, 
1f700 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
1f710 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f720 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f730 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f740 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1f750 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f760 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
1f770 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
1f780 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
1f790 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
1f7a0 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
1f7b0 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
1f7c0 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
1f7d0 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
1f7e0 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ger(pParse, pLef
1f7f0 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  t, 1, target);. 
1f800 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61         return ta
1f810 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51  rget;.#ifndef SQ
1f820 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1f830 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d  NG_POINT.      }
1f840 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e  else if( pLeft->
1f850 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a  op==TK_FLOAT ){.
1f860 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f870 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1f880 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1f890 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1f8a0 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66  codeReal(v, pLef
1f8b0 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20  t->u.zToken, 1, 
1f8c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1f8d0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1f8e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
1f8f0 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  se{.        temp
1f900 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45  X.op = TK_INTEGE
1f910 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  R;.        tempX
1f920 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56  .flags = EP_IntV
1f930 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  alue|EP_TokenOnl
1f940 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  y;.        tempX
1f950 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20  .u.iValue = 0;. 
1f960 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
1f970 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f980 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20  pParse, &tempX, 
1f990 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f9a0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1f9b0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f9c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f9d0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1f9e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1f9f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
1fa00 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c  ubtract, r2, r1,
1fa10 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1fa20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1fa30 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1fa40 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1fa50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1fa60 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
1fa70 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
1fa80 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1fa90 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20  TNOT==OP_BitNot 
1faa0 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
1fab0 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a  p==TK_BITNOT );.
1fac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1fad0 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20  _NOT==OP_Not ); 
1fae0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1faf0 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ( op==TK_NOT );.
1fb00 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1fb10 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1fb20 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1fb30 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1fb40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fb50 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1fb60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fb70 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
1fb80 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  1, inReg);.     
1fb90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1fba0 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a    case TK_TRUTH:
1fbb0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54   {.      int isT
1fbc0 72 75 65 3b 20 20 20 20 2f 2a 20 49 53 20 54 52  rue;    /* IS TR
1fbd0 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55  UE or IS NOT TRU
1fbe0 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  E */.      int b
1fbf0 4e 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20 49 53 20  Normal;   /* IS 
1fc00 54 52 55 45 20 6f 72 20 49 53 20 46 41 4c 53 45  TRUE or IS FALSE
1fc10 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73   */.      r1 = s
1fc20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1fc30 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1fc40 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1fc50 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
1fc60 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1fc70 20 29 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65   );.      isTrue
1fc80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72   = sqlite3ExprTr
1fc90 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e  uthValue(pExpr->
1fca0 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 62  pRight);.      b
1fcb0 4e 6f 72 6d 61 6c 20 3d 20 70 45 78 70 72 2d 3e  Normal = pExpr->
1fcc0 6f 70 32 3d 3d 54 4b 5f 49 53 3b 0a 20 20 20 20  op2==TK_IS;.    
1fcd0 20 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72    testcase( isTr
1fce0 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a  ue && bNormal);.
1fcf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fd00 21 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d  !isTrue && bNorm
1fd10 61 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  al);.      sqlit
1fd20 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1fd30 76 2c 20 4f 50 5f 49 73 54 72 75 65 2c 20 72 31  v, OP_IsTrue, r1
1fd40 2c 20 69 6e 52 65 67 2c 20 21 69 73 54 72 75 65  , inReg, !isTrue
1fd50 2c 20 69 73 54 72 75 65 20 5e 20 62 4e 6f 72 6d  , isTrue ^ bNorm
1fd60 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
1fd70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fd80 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1fd90 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1fda0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
1fdb0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1fdc0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1fdd0 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
1fde0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1fdf0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
1fe00 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
1fe10 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
1fe20 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1fe30 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1fe40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fe50 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1fe60 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
1fe70 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1fe80 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1fe90 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1fea0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1feb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1fec0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1fed0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
1fee0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
1fef0 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  p, r1);.      Vd
1ff00 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1ff10 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
1ff20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1ff30 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1ff40 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  OTNULL);.      s
1ff50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ff60 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1ff70 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1ff80 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1ff90 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
1ffa0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ffb0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1ffc0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
1ffd0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
1ffe0 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1fff0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
20000 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
20010 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
20020 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
20030 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
20040 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
20050 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
20060 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
20070 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
20080 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
20090 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
200a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
200b0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
200c0 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
200d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
200e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
200f0 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
20100 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
20110 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
20120 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
20130 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
20140 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67  .      int nFarg
20150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
20160 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74   Number of funct
20170 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
20180 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
20190 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  pDef;         /*
201a0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65   The function de
201b0 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20  finition object 
201c0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
201d0 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
201e0 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
201f0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33  name */.      u3
20200 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  2 constMask = 0;
20210 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
20220 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
20230 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
20240 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
20250 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
20260 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
20270 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71  nter */.      sq
20280 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
20290 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
202a0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
202b0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ion */.      u8 
202c0 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  enc = ENC(db);  
202d0 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
202e0 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
202f0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
20300 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
20310 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f  *pColl = 0;    /
20320 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  * A collating se
20330 71 75 65 6e 63 65 20 2a 2f 0a 0a 23 69 66 6e 64  quence */..#ifnd
20340 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
20350 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20  INDOWFUNC.      
20360 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
20370 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69  rty(pExpr, EP_Wi
20380 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  nFunc) ){.      
20390 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
203a0 79 2e 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  y.pWin->regResul
203b0 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  t;.      }.#endi
203c0 66 0a 0a 20 20 20 20 20 20 69 66 28 20 43 6f 6e  f..      if( Con
203d0 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
203e0 65 29 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  e) && sqlite3Exp
203f0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
20400 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  in(pExpr) ){.   
20410 20 20 20 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63       /* SQL func
20420 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 65 78 70  tions can be exp
20430 65 6e 73 69 76 65 2e 20 53 6f 20 74 72 79 20 74  ensive. So try t
20440 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61 6e 74 20  o move constant 
20450 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20 20  functions.      
20460 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20    ** out of the 
20470 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65 76 65 6e  inner loop, even
20480 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 61   if that means a
20490 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f 70 79 2e  n extra OP_Copy.
204a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
204b0 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
204c0 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
204d0 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 20   pExpr, -1);.   
204e0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
204f0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
20500 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
20510 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
20520 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
20530 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
20540 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
20550 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
20560 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20570 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
20580 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
20590 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72      }.      nFar
205a0 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72  g = pFarg ? pFar
205b0 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  g->nExpr : 0;.  
205c0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
205d0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
205e0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
205f0 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
20600 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
20610 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
20620 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
20630 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67  n(db, zId, nFarg
20640 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65  , enc, 0);.#ifde
20650 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20660 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43  UNKNOWN_SQL_FUNC
20670 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70  TION.      if( p
20680 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73 65  Def==0 && pParse
20690 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
206a0 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
206b0 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
206c0 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e  db, "unknown", n
206d0 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Farg, enc, 0);. 
206e0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
206f0 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
20700 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69  || pDef->xFinali
20710 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ze!=0 ){.       
20720 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20730 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
20740 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29  n function: %s()
20750 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  ", zId);.       
20760 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
20770 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70  .      /* Attemp
20780 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65  t a direct imple
20790 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
207a0 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53   built-in COALES
207b0 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  CE() and.      *
207c0 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74  * IFNULL() funct
207d0 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69  ions.  This avoi
207e0 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65  ds unnecessary e
207f0 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20  valuation of.   
20800 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20     ** arguments 
20810 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  past the first n
20820 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
20830 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
20840 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
20850 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
20860 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20  NC_COALESCE ){. 
20870 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f         int endCo
20880 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33  alesce = sqlite3
20890 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
208a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  arse);.        a
208b0 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20  ssert( nFarg>=2 
208c0 29 3b 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 28 70 50 61 72 73  e3ExprCode(pPars
208e0 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
208f0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
20900 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
20910 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
20920 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20930 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20940 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74  _NotNull, target
20950 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
20960 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
20970 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
20980 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20990 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
209a0 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  rg->a[i].pExpr, 
209b0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
209c0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
209d0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
209e0 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63  el(v, endCoalesc
209f0 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
20a00 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
20a10 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c    /* The UNLIKEL
20a20 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  Y() function is 
20a30 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65  a no-op.  The re
20a40 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75  sult is the valu
20a50 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  e.      ** of th
20a60 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
20a70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
20a80 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
20a90 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
20aa0 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20  NC_UNLIKELY ){. 
20ab0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
20ac0 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20  Farg>=1 );.     
20ad0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
20ae0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
20af0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
20b00 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
20b10 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66  t);.      }..#if
20b20 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
20b30 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 41 46  .      /* The AF
20b40 46 49 4e 49 54 59 28 29 20 66 75 6e 63 74 69 6f  FINITY() functio
20b50 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61  n evaluates to a
20b60 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
20b70 63 72 69 62 65 73 0a 20 20 20 20 20 20 2a 2a 20  cribes.      ** 
20b80 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
20b90 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  y of the argumen
20ba0 74 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  t.  This is used
20bb0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 66 0a   for testing of.
20bc0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
20bd0 69 74 65 20 74 79 70 65 20 6c 6f 67 69 63 2e 0a  ite type logic..
20be0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
20bf0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
20c00 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
20c10 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a 20 20 20  _AFFINITY ){.   
20c20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
20c30 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20 22 62 6c  *azAff[] = { "bl
20c40 6f 62 22 2c 20 22 74 65 78 74 22 2c 20 22 6e 75  ob", "text", "nu
20c50 6d 65 72 69 63 22 2c 20 22 69 6e 74 65 67 65 72  meric", "integer
20c60 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a 20 20 20  ", "real" };.   
20c70 20 20 20 20 20 63 68 61 72 20 61 66 66 3b 0a 20       char aff;. 
20c80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
20c90 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Farg==1 );.     
20ca0 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
20cb0 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 46 61  ExprAffinity(pFa
20cc0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  rg->a[0].pExpr);
20cd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20ce0 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
20cf0 2c 20 74 61 72 67 65 74 2c 20 0a 20 20 20 20 20  , target, .     
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d10 20 20 20 20 20 20 20 20 20 61 66 66 20 3f 20 61           aff ? a
20d20 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49 54 45 5f  zAff[aff-SQLITE_
20d30 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f 6e  AFF_BLOB] : "non
20d40 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e");.        ret
20d50 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
20d60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
20d70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61    for(i=0; i<nFa
20d80 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
20d90 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71    if( i<32 && sq
20da0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
20db0 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  ant(pFarg->a[i].
20dc0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
20dd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
20de0 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
20df0 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41   constMask |= MA
20e00 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20  SKBIT32(i);.    
20e10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
20e20 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
20e30 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
20e40 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26  _NEEDCOLL)!=0 &&
20e50 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
20e60 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
20e70 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
20e80 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
20e90 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
20ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20eb0 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
20ec0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e  .        if( con
20ed0 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20  stMask ){.      
20ee0 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d      r1 = pParse-
20ef0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
20f00 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
20f10 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20  += nFarg;.      
20f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20f30 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
20f40 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
20f50 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
20f60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
20f70 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61  * For length() a
20f80 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  nd typeof() func
20f90 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c  tions with a col
20fa0 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20  umn argument,.  
20fb0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65        ** set the
20fc0 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f   P5 parameter to
20fd0 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   the OP_Column o
20fe0 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f  pcode to OPFLAG_
20ff0 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20  LENGTHARG.      
21000 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54    ** or OPFLAG_T
21010 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74  YPEOFARG respect
21020 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20  ively, to avoid 
21030 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61  unnecessary data
21040 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64  .        ** load
21050 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
21060 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
21070 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
21080 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
21090 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  TH|SQLITE_FUNC_T
210a0 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20  YPEOF))!=0 ){.  
210b0 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f          u8 exprO
210c0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
210d0 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
210e0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
210f0 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  t( pFarg->a[0].p
21100 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
21110 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46       exprOp = pF
21120 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
21130 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  >op;.          i
21140 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f  f( exprOp==TK_CO
21150 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d  LUMN || exprOp==
21160 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
21170 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
21180 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
21190 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f  _LENGTH==OPFLAG_
211a0 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
211b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
211c0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
211d0 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45  EOF==OPFLAG_TYPE
211e0 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  OFARG );.       
211f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21200 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
21210 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
21220 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
21230 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21240 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20  pr->op2 = .     
21250 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
21260 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
21270 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
21280 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  |OPFLAG_TYPEOFAR
21290 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  G);.          }.
212a0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
212b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
212c0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
212d0 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 30 2c  e, pFarg, r1, 0,
212e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21300 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
21310 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  |SQLITE_ECEL_FAC
21320 54 4f 52 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  TOR);.      }els
21330 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
21340 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
21350 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
21360 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
21370 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76    /* Possibly ov
21380 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74  erload the funct
21390 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ion if the first
213a0 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20   argument is.   
213b0 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20     ** a virtual 
213c0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  table column..  
213d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
213e0 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69  For infix functi
213f0 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c  ons (LIKE, GLOB,
21400 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54   REGEXP, and MAT
21410 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20  CH) use the.    
21420 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75    ** second argu
21430 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69  ment, not the fi
21440 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75  rst, as the argu
21450 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a  ment to test to.
21460 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
21470 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  it is a column i
21480 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  n a virtual tabl
21490 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65  e.  This is done
214a0 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a   because.      *
214b0 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  * the left opera
214c0 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63  nd of infix func
214d0 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61  tions (the opera
214e0 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20  nd we want to.  
214f0 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f      ** control o
21500 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73  verloading) ends
21510 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e   up as the secon
21520 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
21530 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  e.      ** funct
21540 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73  ion.  The expres
21550 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  sion "A glob B" 
21560 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
21570 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62   .      ** "glob
21580 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20  (B,A).  We want 
21590 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20  to use the A in 
215a0 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65  "A glob B" to te
215b0 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  st.      ** for 
215c0 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61  function overloa
215d0 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73  ding.  But we us
215e0 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20  e the B term in 
215f0 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20  "glob(B,A)"..   
21600 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
21610 6e 46 61 72 67 3e 3d 32 20 26 26 20 45 78 70 72  nFarg>=2 && Expr
21620 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
21630 72 2c 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29  r, EP_InfixFunc)
21640 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
21650 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
21660 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
21670 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
21680 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
21690 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
216a0 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
216b0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
216c0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
216d0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
216e0 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
216f0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
21700 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
21710 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
21720 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
21730 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
21740 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
21750 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
21760 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
21770 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21780 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
21790 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
217a0 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
217b0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
217c0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
217d0 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
217e0 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20 20  _SQL_FUNC.      
217f0 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
21800 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
21810 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20 20 20  C_OFFSET ){.    
21820 20 20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d      Expr *pArg =
21830 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
21840 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
21850 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  pArg->op==TK_COL
21860 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
21870 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21880 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 2c  p3(v, OP_Offset,
21890 20 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20 70   pArg->iTable, p
218a0 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  Arg->iColumn, ta
218b0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
218c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
218d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
218e0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
218f0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21900 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a    }.      }else.
21910 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
21920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21930 62 65 41 64 64 4f 70 34 28 76 2c 20 70 50 61 72  beAddOp4(v, pPar
21940 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20 4f  se->iSelfTab ? O
21950 50 5f 50 75 72 65 46 75 6e 63 30 20 3a 20 4f 50  P_PureFunc0 : OP
21960 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20 20  _Function0,.    
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21980 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 2c        constMask,
21990 20 72 31 2c 20 74 61 72 67 65 74 2c 20 28 63 68   r1, target, (ch
219a0 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e  ar*)pDef, P4_FUN
219b0 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73  CDEF);.        s
219c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
219d0 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
219e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
219f0 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e  if( nFarg && con
21a00 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20  stMask==0 ){.   
21a10 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
21a20 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
21a30 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
21a40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
21a50 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
21a60 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
21a70 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
21a80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
21a90 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
21aa0 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
21ab0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
21ac0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
21ad0 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
21ae0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
21af0 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
21b00 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45     if( op==TK_SE
21b10 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20  LECT && (nCol = 
21b20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
21b30 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
21b40 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
21b50 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
21b60 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f  rror(pParse, nCo
21b70 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 1);.      }el
21b80 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
21b90 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  rn sqlite3CodeSu
21ba0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
21bb0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
21bc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21bd0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
21be0 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  ELECT_COLUMN: {.
21bf0 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
21c00 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
21c10 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  eft->iTable==0 )
21c20 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
21c30 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d  >pLeft->iTable =
21c40 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
21c50 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
21c60 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
21c70 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
21c80 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
21c90 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c  ==0 || pExpr->pL
21ca0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  eft->op==TK_SELE
21cb0 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
21cc0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20  pExpr->iTable.  
21cd0 20 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69       && pExpr->i
21ce0 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73 71 6c 69  Table!=(n = sqli
21cf0 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
21d00 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 29  e(pExpr->pLeft))
21d10 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
21d20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
21d30 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63  sg(pParse, "%d c
21d40 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20  olumns assigned 
21d50 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20  %d values",.    
21d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d70 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
21d80 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20  r->iTable, n);. 
21d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
21da0 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  urn pExpr->pLeft
21db0 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72  ->iTable + pExpr
21dc0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d  ->iColumn;.    }
21dd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
21de0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
21df0 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
21e00 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
21e10 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
21e20 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
21e30 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
21e40 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
21e50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21e60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
21e70 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
21e80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21e90 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
21ea0 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
21eb0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
21ec0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21ed0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
21ee0 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
21ef0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21f00 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
21f10 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
21f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21f30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
21f40 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30  ddImm, target, 0
21f50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21f60 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
21f70 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
21f80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
21f90 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
21fa0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
21fb0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
21fc0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
21fd0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
21fe0 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
21ff0 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
22000 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
22010 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
22020 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
22030 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
22040 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
22050 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
22060 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
22070 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
22080 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
22090 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
220a0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
220b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
220c0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
220d0 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
220e0 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
220f0 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30  pr, target, 0, 0
22100 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22110 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20  target;.    }.  
22120 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a    case TK_SPAN:.
22130 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
22140 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
22150 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
22160 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e   pExpr = pExpr->
22170 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 67 6f 74  pLeft;.      got
22180 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76  o expr_code_doov
22190 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30 34 2d 32  er; /* 2018-04-2
221a0 38 3a 20 50 72 65 76 65 6e 74 20 64 65 65 70 20  8: Prevent deep 
221b0 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53 53 46 75  recursion. OSSFu
221c0 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  zz. */.    }..  
221d0 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
221e0 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
221f0 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
22200 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
22210 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
22220 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
22230 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
22240 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
22250 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
22260 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
22270 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
22280 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
22290 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
222a0 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
222b0 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
222c0 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
222d0 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
222e0 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
222f0 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
22300 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
22310 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
22320 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
22330 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
22340 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
22350 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
22360 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
22370 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
22380 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
22390 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
223a0 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f  ng an OP_Param o
223b0 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20  pcode. The p1.  
223c0 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
223d0 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72   is set to 0 for
223e0 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65   an old.rowid re
223f0 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28  ference, or to (
22400 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  i+1).      ** to
22410 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68   reference anoth
22420 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  er column of the
22430 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
22440 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ble, where .    
22450 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
22460 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
22470 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77  n. For a new.row
22480 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31  id reference, p1
22490 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74   is.      ** set
224a0 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65   to (n+1), where
224b0 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   n is the number
224c0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65   of columns in e
224d0 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  ach pseudo-table
224e0 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  ..      ** For a
224f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
22500 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69  y other column i
22510 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75  n the new.* pseu
22520 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20  do-table, p1.   
22530 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
22540 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e  (n+2+i), where n
22550 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65   and i are as de
22560 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79  fined previously
22570 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65  . For.      ** e
22580 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
22590 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72  able on which tr
225a0 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67  iggers are being
225b0 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20   fired is.      
225c0 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a  ** declared as:.
225d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
225e0 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
225f0 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
22600 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
22610 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65  n p1 is interpre
22620 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
22630 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
22640 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20  *   p1==0   ->  
22650 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20    old.rowid     
22660 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65  p1==3   ->    ne
22670 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  w.rowid.      **
22680 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20     p1==1   ->   
22690 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70   old.a         p
226a0 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==4   ->    new
226b0 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  .a.      **   p1
226c0 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==2   ->    old.
226d0 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20  b         p1==5 
226e0 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20    ->    new.b   
226f0 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20      .      */.  
22700 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
22710 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b  = pExpr->y.pTab;
22720 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20  .      int p1 = 
22730 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20  pExpr->iTable * 
22740 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b  (pTab->nCol+1) +
22750 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c   1 + pExpr->iCol
22760 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  umn;..      asse
22770 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt( pExpr->iTabl
22780 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  e==0 || pExpr->i
22790 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
227a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
227b0 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20  >iColumn>=-1 && 
227c0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
227d0 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
227e0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
227f0 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70  >iPKey<0 || pExp
22800 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62  r->iColumn!=pTab
22810 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20  ->iPKey );.     
22820 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26   assert( p1>=0 &
22830 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c  & p1<(pTab->nCol
22840 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20  *2+2) );..      
22850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22860 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70  2(v, OP_Param, p
22870 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
22880 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
22890 2c 20 22 72 5b 25 64 5d 3d 25 73 2e 25 73 22 2c  , "r[%d]=%s.%s",
228a0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
228b0 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20   (pExpr->iTable 
228c0 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29  ? "new" : "old")
228d0 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
228e0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72  ->iColumn<0 ? "r
228f0 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 79  owid" : pExpr->y
22900 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70  .pTab->aCol[pExp
22910 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d  r->iColumn].zNam
22920 65 29 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69  e).      ));..#i
22930 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22940 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
22950 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
22960 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c   column has REAL
22970 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61   affinity, it ma
22980 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73  y currently be s
22990 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20  tored as an.    
229a0 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73    ** integer. Us
229b0 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  e OP_RealAffinit
229c0 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69  y to make sure i
229d0 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c  t is really real
229e0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
229f0 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
22a00 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20 53   R-60985-57662 S
22a10 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65  QLite will conve
22a20 72 74 20 74 68 65 20 76 61 6c 75 65 20 62 61 63  rt the value bac
22a30 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c  k to.      ** fl
22a40 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68 65  oating point whe
22a50 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 74 20  n extracting it 
22a60 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e  from the record.
22a70 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
22a80 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
22a90 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62   .       && pTab
22aa0 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
22ab0 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d  olumn].affinity=
22ac0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
22ad0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
22ae0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22af0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66  Op1(v, OP_RealAf
22b00 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b  finity, target);
22b10 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
22b20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22b30 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
22b40 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20  VECTOR: {.      
22b50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
22b60 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c  pParse, "row val
22b70 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20  ue misused");.  
22b80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22b90 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 46  ..    case TK_IF
22ba0 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a 20 20 20  _NULL_ROW: {.   
22bb0 20 20 20 69 6e 74 20 61 64 64 72 49 4e 52 3b 0a     int addrINR;.
22bc0 20 20 20 20 20 20 61 64 64 72 49 4e 52 20 3d 20        addrINR = 
22bd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22be0 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f  1(v, OP_IfNullRo
22bf0 77 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  w, pExpr->iTable
22c00 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
22c10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
22c20 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
22c30 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
22c40 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
22c50 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
22c60 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a 20 20 20  v, addrINR);.   
22c70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
22c80 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 49 4e  angeP3(v, addrIN
22c90 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  R, inReg);.     
22ca0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
22cb0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     /*.    ** For
22cc0 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m A:.    **   CA
22cd0 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45  SE x WHEN e1 THE
22ce0 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
22cf0 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
22d00 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
22d10 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
22d20 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a  * Form B:.    **
22d30 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20     CASE WHEN e1 
22d40 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
22d50 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
22d60 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
22d70 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
22d80 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63    ** Form A is c
22d90 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65  an be transforme
22da0 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76  d into the equiv
22db0 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20  alent form B as 
22dc0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20  follows:.    ** 
22dd0 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31    CASE WHEN x=e1
22de0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d   THEN r1 WHEN x=
22df0 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20  e2 THEN r2 .... 
22e00 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45     **        WHE
22e10 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45  N x=eN THEN rN E
22e20 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
22e30 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74  .    ** X (if it
22e40 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70   exists) is in p
22e50 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
22e60 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20   ** Y is in the 
22e70 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  last element of 
22e80 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69  pExpr->x.pList i
22e90 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  f pExpr->x.pList
22ea0 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a  ->nExpr is.    *
22eb0 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73  * odd.  The Y is
22ec0 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20   also optional. 
22ed0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
22ee0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e  f elements in x.
22ef0 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20  pList.    ** is 
22f00 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20  even, then Y is 
22f10 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68 65 20  omitted and the 
22f20 22 6f 74 68 65 72 77 69 73 65 22 20 72 65 73 75  "otherwise" resu
22f30 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20  lt is NULL..    
22f40 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78 70  ** Ei is in pExp
22f50 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d  r->pList->a[i*2]
22f60 20 61 6e 64 20 52 69 20 69 73 20 70 45 78 70 72   and Ri is pExpr
22f70 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31  ->pList->a[i*2+1
22f80 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ]..    **.    **
22f90 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
22fa0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
22fb0 20 74 68 65 20 52 69 20 66 6f 72 20 74 68 65 20   the Ri for the 
22fc0 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45  first matching E
22fd0 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20  i,.    ** or if 
22fe0 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
22ff0 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53  hing Ei, the ELS
23000 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20  E term Y, or if 
23010 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20  there is.    ** 
23020 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55  no ELSE term, NU
23030 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LL..    */.    d
23040 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
23050 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b  op==TK_CASE ); {
23060 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61  .      int endLa
23070 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  bel;            
23080 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
23090 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f   label for end o
230a0 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20  f CASE stmt */. 
230b0 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73       int nextCas
230c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
230d0 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
230e0 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48  abel for next WH
230f0 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  EN clause */.   
23100 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20     int nExpr;   
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23120 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65       /* 2x numbe
23130 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  r of WHEN terms 
23140 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
23170 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
23180 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
23190 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
231a0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
231b0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
231c0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
231d0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74  List_item *aList
231e0 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20  elem;  /* Array 
231f0 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
23200 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f  .      Expr opCo
23210 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20  mpare;          
23220 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23230 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e  X==Ei expression
23240 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
23250 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
23260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23270 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20  he X expression 
23280 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
23290 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Test = 0;       
232a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d             /* X=
232b0 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20  =Ei (form A) or 
232c0 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29  just Ei (form B)
232d0 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
232e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
232f0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
23300 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70  sSelect) && pExp
23310 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20  r->x.pList );.  
23320 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
23330 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
23340 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
23350 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
23360 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
23370 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
23380 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
23390 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
233a0 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
233b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
233c0 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
233d0 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70       if( (pX = p
233e0 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
233f0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  ){.        tempX
23400 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20   = *pX;.        
23410 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
23420 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
23430 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67         exprToReg
23440 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78  ister(&tempX, ex
23450 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
23460 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
23470 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20  gFree1));.      
23480 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
23490 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
234a0 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d     memset(&opCom
234b0 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pare, 0, sizeof(
234c0 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20  opCompare));.   
234d0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
234e0 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
234f0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
23500 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20  ft = &tempX;.   
23510 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
23520 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
23530 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
23540 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
23550 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
23560 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
23570 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
23580 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
23590 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
235a0 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
235b0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
235c0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
235d0 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
235e0 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
235f0 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
23600 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
23610 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
23620 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
23630 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
23640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23650 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
23660 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  -1; i=i+2){.    
23670 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
23680 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23690 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
236a0 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
236b0 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
236c0 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
236d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
236e0 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
236f0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
23700 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23710 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
23720 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
23730 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
23740 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
23750 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Test->op==TK_COL
23760 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
23770 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
23780 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
23790 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
237a0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
237b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
237c0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
237d0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
237e0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
237f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
23800 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
23810 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61  m[i+1].pExpr, ta
23820 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
23830 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
23840 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
23850 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23860 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23870 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
23880 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45   }.      if( (nE
23890 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  xpr&1)!=0 ){.   
238a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
238b0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
238c0 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e  ist->a[nExpr-1].
238d0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
238e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
238f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23900 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
23910 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
23920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
23930 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
23940 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c  abel(v, endLabel
23950 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
23960 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
23970 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
23980 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
23990 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ISE: {.      ass
239a0 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69  ert( pExpr->affi
239b0 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  nity==OE_Rollbac
239c0 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  k .           ||
239d0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
239e0 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20  ==OE_Abort.     
239f0 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
23a00 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69  affinity==OE_Fai
23a10 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  l.           || 
23a20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
23a30 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20  =OE_Ignore.     
23a40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
23a50 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
23a60 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
23a70 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
23a80 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
23aa0 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
23ab0 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
23ac0 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
23ad0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
23ae0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
23af0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
23b00 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
23b10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23b20 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
23b30 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
23b40 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
23b50 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
23b60 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
23b70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
23b80 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
23b90 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
23ba0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23bb0 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20  dOp4(.          
23bc0 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51    v, OP_Halt, SQ
23bd0 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f  LITE_OK, OE_Igno
23be0 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  re, 0, pExpr->u.
23bf0 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20  zToken,0);.     
23c00 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
23c10 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
23c20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23c30 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
23c40 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f  Parse, SQLITE_CO
23c50 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
23c60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c80 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c  pExpr->affinity,
23c90 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
23ca0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
23cb0 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
23cc0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
23cd0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
23ce0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
23cf0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
23d00 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
23d10 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
23d20 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
23d30 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  nReg;.}../*.** F
23d40 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f  actor out the co
23d50 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  de of the given 
23d60 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e  expression to in
23d70 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
23d80 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44  e..**.** If regD
23d90 65 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  est>=0 then the 
23da0 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73  result is always
23db0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20   stored in that 
23dc0 72 65 67 69 73 74 65 72 20 61 6e 64 20 74 68 65  register and the
23dd0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  .** result is no
23de0 74 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20  t reusable.  If 
23df0 72 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74  regDest<0 then t
23e00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66  his routine is f
23e10 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65  ree to .** store
23e20 20 74 68 65 20 76 61 6c 75 65 20 77 68 65 72 65   the value where
23e30 65 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20  ever it wants.  
23e40 54 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  The register whe
23e50 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
23e60 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  n .** is stored 
23e70 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68  is returned.  Wh
23e80 65 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77  en regDest<0, tw
23e90 6f 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72  o identical expr
23ea0 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20  essions will.** 
23eb0 63 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65  code to the same
23ec0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e   register..*/.in
23ed0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
23ee0 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65  eAtInit(.  Parse
23ef0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
23f00 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
23f10 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
23f20 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ,      /* The ex
23f30 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65  pression to code
23f40 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69   when the VDBE i
23f50 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20  nitializes */.  
23f60 69 6e 74 20 72 65 67 44 65 73 74 20 20 20 20 20  int regDest     
23f70 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76    /* Store the v
23f80 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
23f90 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
23fa0 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73  prList *p;.  ass
23fb0 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72  ert( ConstFactor
23fc0 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20  Ok(pParse) );.  
23fd0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  p = pParse->pCon
23fe0 73 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65  stExpr;.  if( re
23ff0 67 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a  gDest<0 && p ){.
24000 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
24010 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
24020 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
24030 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20  for(pItem=p->a, 
24040 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b  i=p->nExpr; i>0;
24050 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a   pItem++, i--){.
24060 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
24070 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c  >reusable && sql
24080 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
24090 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70  0,pItem->pExpr,p
240a0 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20  Expr,-1)==0 ){. 
240b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49         return pI
240c0 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
240d0 72 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rReg;.      }.  
240e0 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 20    }.  }.  pExpr 
240f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
24100 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
24110 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71  pr, 0);.  p = sq
24120 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
24130 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70  end(pParse, p, p
24140 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29  Expr);.  if( p )
24150 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20 45 78  {.     struct Ex
24160 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
24170 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45  em = &p->a[p->nE
24180 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74  xpr-1];.     pIt
24190 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72  em->reusable = r
241a0 65 67 44 65 73 74 3c 30 3b 0a 20 20 20 20 20 69  egDest<0;.     i
241b0 66 28 20 72 65 67 44 65 73 74 3c 30 20 29 20 72  f( regDest<0 ) r
241c0 65 67 44 65 73 74 20 3d 20 2b 2b 70 50 61 72 73  egDest = ++pPars
241d0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49  e->nMem;.     pI
241e0 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
241f0 72 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a  rReg = regDest;.
24200 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43    }.  pParse->pC
24210 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 20 20  onstExpr = p;.  
24220 72 65 74 75 72 6e 20 72 65 67 44 65 73 74 3b 0a  return regDest;.
24230 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
24240 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
24250 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
24260 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
24270 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61  esults.** into a
24280 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75   register.  Retu
24290 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
242a0 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65  number where the
242b0 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20   results.** are 
242c0 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  stored..**.** If
242d0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
242e0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
242f0 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  ister that can b
24300 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a  e deallocated,.*
24310 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73  * then write its
24320 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52   number into *pR
24330 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  eg.  If the resu
24340 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  lt register is n
24350 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  ot.** a temporar
24360 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  y, then set *pRe
24370 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  g to zero..**.**
24380 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
24390 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
243a0 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
243b0 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a   generate this.*
243c0 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74  * code to fill t
243d0 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  he register in t
243e0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
243f0 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  n section of the
24400 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
24410 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61  , in order to fa
24420 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74  ctor it out of t
24430 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f  he evaluation lo
24440 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
24450 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50  e3ExprCodeTemp(P
24460 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
24470 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a  pr *pExpr, int *
24480 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b  pReg){.  int r2;
24490 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
244a0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
244b0 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  e(pExpr);.  if( 
244c0 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
244d0 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78 70  arse).   && pExp
244e0 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
244f0 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ER.   && sqlite3
24500 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
24510 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29  tJoin(pExpr).  )
24520 7b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30  {.    *pReg  = 0
24530 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
24540 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
24550 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24560 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
24570 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
24580 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
24590 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73  rse);.    r2 = s
245a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
245b0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
245c0 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28  pr, r1);.    if(
245d0 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20   r2==r1 ){.     
245e0 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20   *pReg = r1;.   
245f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
24600 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24610 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
24620 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30  .      *pReg = 0
24630 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
24640 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn r2;.}../*.*
24650 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
24660 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
24670 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
24680 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
24690 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
246a0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
246b0 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
246c0 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
246d0 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
246e0 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f  ister target..*/
246f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
24700 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
24710 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
24720 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
24730 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
24740 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
24750 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
24760 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
24770 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d   pExpr && pExpr-
24780 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
24790 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
247a0 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
247b0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79  ->pVdbe, OP_Copy
247c0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
247d0 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
247e0 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73  e{.    inReg = s
247f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
24800 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
24810 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
24820 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
24830 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61  >pVdbe!=0 || pPa
24840 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
24850 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
24860 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
24870 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
24880 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24890 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
248a0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
248b0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
248c0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
248d0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72  ./*.** Make a tr
248e0 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20  ansient copy of 
248f0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
24900 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69   and then code i
24910 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  t using.** sqlit
24920 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54  e3ExprCode().  T
24930 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
24940 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69  s just like sqli
24950 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a  te3ExprCode().**
24960 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
24970 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f   input expressio
24980 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  n is guaranteed 
24990 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  to be unchanged.
249a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
249b0 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72  ExprCodeCopy(Par
249c0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
249d0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
249e0 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  get){.  sqlite3 
249f0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
24a00 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
24a10 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
24a20 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
24a30 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
24a40 64 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43  d ) sqlite3ExprC
24a50 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
24a60 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71  r, target);.  sq
24a70 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
24a80 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  db, pExpr);.}../
24a90 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
24aa0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
24ab0 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
24ac0 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
24ad0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
24ae0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
24af0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
24b00 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
24b10 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
24b20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
24b30 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
24b40 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
24b50 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
24b60 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f  ne.** might choo
24b70 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65  se to code the e
24b80 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69  xpression at ini
24b90 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
24ba0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24bb0 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61  3ExprCodeFactora
24bc0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
24bd0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
24be0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
24bf0 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e  f( pParse->okCon
24c00 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69  stFactor && sqli
24c10 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
24c20 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20  tNotJoin(pExpr) 
24c30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
24c40 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
24c50 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
24c60 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et);.  }else{.  
24c70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24c80 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
24c90 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a   target);.  }.}.
24ca0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24cb0 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
24cc0 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
24cd0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
24ce0 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
24cf0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
24d00 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
24d10 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
24d20 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
24d30 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
24d40 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
24d50 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
24d60 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24d70 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
24d80 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
24d90 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
24da0 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
24db0 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
24dc0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
24dd0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
24de0 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
24df0 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
24e00 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
24e10 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
24e20 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
24e30 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
24e40 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
24e50 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
24e60 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
24e70 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
24e80 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24e90 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
24ea0 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
24eb0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
24ec0 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20  .  int iMem;..  
24ed0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
24ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
24ef0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
24f00 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65  STER );.  sqlite
24f10 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
24f20 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
24f30 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ;.  iMem = ++pPa
24f40 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
24f50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24f60 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65  , OP_Copy, targe
24f70 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72  t, iMem);.  expr
24f80 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72  ToRegister(pExpr
24f90 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iMem);.}../*.*
24fa0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
24fb0 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
24fc0 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
24fd0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
24fe0 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
24ff0 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
25000 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
25010 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
25020 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
25030 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
25040 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
25050 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e 75 6d  luated.  The num
25060 62 65 72 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ber returned wil
25070 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62 65 20  l.** usually be 
25080 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62 75 74  pList->nExpr but
25090 20 6d 69 67 68 74 20 62 65 20 72 65 64 75 63 65   might be reduce
250a0 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c  d if SQLITE_ECEL
250b0 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73 20 64  _OMITREF.** is d
250c0 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  efined..**.** Th
250d0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  e SQLITE_ECEL_DU
250e0 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  P flag prevents 
250f0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72  the arguments fr
25100 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c  om being.** fill
25110 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70  ed using OP_SCop
25120 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74  y.  OP_Copy must
25130 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
25140 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
25150 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61  TE_ECEL_FACTOR a
25160 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63  rgument allows c
25170 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
25180 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f  s to be.** facto
25190 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69  red out into ini
251a0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65  tialization code
251b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
251c0 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67  TE_ECEL_REF flag
251d0 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72   means that expr
251e0 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c  essions in the l
251f0 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72  ist with.** Expr
25200 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72  List.a[].u.x.iOr
25210 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20  derByCol>0 have 
25220 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61  already been eva
25230 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65  luated and store
25240 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  d.** in register
25250 73 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64  s at srcReg, and
25260 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61   so the value ca
25270 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d  n be copied from
25280 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51   there..** If SQ
25290 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
252a0 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c 20 74  F is also set, t
252b0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 77  hen the values w
252c0 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72 42 79  ith u.x.iOrderBy
252d0 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d  Col>0.** are sim
252e0 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61 74 68  ply omitted rath
252f0 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20 63 6f  er than being co
25300 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52 65 67  pied from srcReg
25310 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25320 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
25330 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
25340 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
25350 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
25360 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
25370 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
25380 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
25390 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
253a0 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
253b0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
253c0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
253d0 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f  srcReg,        /
253e0 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74 65  * Source registe
253f0 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45  rs if SQLITE_ECE
25400 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c  L_REF */.  u8 fl
25410 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
25420 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66   SQLITE_ECEL_* f
25430 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lags */.){.  str
25440 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
25450 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
25460 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f  i, j, n;.  u8 co
25470 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20  pyOp = (flags & 
25480 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
25490 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f   ? OP_Copy : OP_
254a0 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76  SCopy;.  Vdbe *v
254b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
254c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
254d0 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
254e0 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
254f0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
25500 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
25510 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
25520 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
25530 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
25540 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73  xpr;.  if( !Cons
25550 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
25560 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51  ) ) flags &= ~SQ
25570 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
25580 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
25590 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
255a0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
255b0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
255c0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
255d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
255e0 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
255f0 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
25600 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  pItem->bSorterRe
25610 66 20 29 7b 0a 20 20 20 20 20 20 69 2d 2d 3b 0a  f ){.      i--;.
25620 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d        n--;.    }
25630 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
25640 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
25650 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30  ITE_ECEL_REF)!=0
25660 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e   && (j = pItem->
25670 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
25680 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
25690 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
256a0 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20  CEL_OMITREF ){. 
256b0 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20         i--;.    
256c0 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
256d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
256e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
256f0 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63  v, copyOp, j+src
25700 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29  Reg-1, target+i)
25710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
25720 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
25730 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
25740 54 4f 52 29 21 3d 30 0a 20 20 20 20 20 20 20 20  TOR)!=0.        
25750 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
25760 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
25770 69 6e 28 70 45 78 70 72 29 0a 20 20 20 20 29 7b  in(pExpr).    ){
25780 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25790 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
257a0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
257b0 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  et+i);.    }else
257c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65  {.      int inRe
257d0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
257e0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
257f0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
25800 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  i);.      if( in
25810 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b  Reg!=target+i ){
25820 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
25830 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  *pOp;.        if
25840 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70  ( copyOp==OP_Cop
25850 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  y.         && (p
25860 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65  Op=sqlite3VdbeGe
25870 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63  tOp(v, -1))->opc
25880 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  ode==OP_Copy.   
25890 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
258a0 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65  +pOp->p3+1==inRe
258b0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  g.         && pO
258c0 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p2+pOp->p3+1=
258d0 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20  =target+i.      
258e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
258f0 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20  Op->p3++;.      
25900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25920 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
25930 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29  inReg, target+i)
25940 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25950 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
25960 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
25970 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
25980 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f   for a BETWEEN o
25990 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  perator..**.**  
259a0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
259b0 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  D z.**.** The ab
259c0 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ove is equivalen
259d0 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78  t to .**.**    x
259e0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a  >=y AND x<=z.**.
259f0 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
25a00 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
25a10 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
25a20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
25a30 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66  * elimination of
25a40 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a   x..**.** The xJ
25a50 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72 20  umpIf parameter 
25a60 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61 69  determines detai
25a70 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c  ls:.**.**    NUL
25a80 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
25a90 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 62       Store the b
25aa0 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69 6e  oolean result in
25ab0 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20   reg[dest].**   
25ac0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
25ad0 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74 6f  ue:      Jump to
25ae0 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a 2a   dest if true.**
25af0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25b00 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70  fFalse:     Jump
25b10 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c 73   to dest if fals
25b20 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70  e.**.** The jump
25b30 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65 72  IfNull parameter
25b40 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 78   is ignored if x
25b50 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a  JumpIf is NULL..
25b60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
25b70 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
25b80 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25b90 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
25ba0 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
25bb0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
25bc0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
25bd0 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
25be0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
25bf0 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
25c00 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69     /* Jump desti
25c10 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67  nation or storag
25c20 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  e location */.  
25c30 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50 61  void (*xJump)(Pa
25c40 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69  rse*,Expr*,int,i
25c50 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74  nt), /* Action t
25c60 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20  o take */.  int 
25c70 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
25c80 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
25c90 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
25ca0 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70   NULL */.){. Exp
25cb0 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f  r exprAnd;     /
25cc0 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74  * The AND operat
25cd0 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20  or in  x>=y AND 
25ce0 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20  x<=z  */.  Expr 
25cf0 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20  compLeft;    /* 
25d00 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20  The  x>=y  term 
25d10 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69  */.  Expr compRi
25d20 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78  ght;   /* The  x
25d30 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  <=z  term */.  E
25d40 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20  xpr exprX;      
25d50 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65   /* The  x  sube
25d60 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
25d70 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
25d80 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
25d90 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 0a  e register */...
25da0 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65    memset(&compLe
25db0 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ft, 0, sizeof(Ex
25dc0 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
25dd0 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69  compRight, 0, si
25de0 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d  zeof(Expr));.  m
25df0 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20  emset(&exprAnd, 
25e00 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
25e10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  ;..  assert( !Ex
25e20 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
25e30 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
25e40 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20  t) );.  exprX = 
25e50 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
25e60 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
25e70 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e  _AND;.  exprAnd.
25e80 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
25e90 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69  t;.  exprAnd.pRi
25ea0 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
25eb0 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20  ;.  compLeft.op 
25ec0 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c  = TK_GE;.  compL
25ed0 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
25ee0 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  rX;.  compLeft.p
25ef0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
25f00 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
25f10 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  pr;.  compRight.
25f20 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
25f30 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
25f40 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
25f50 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
25f60 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
25f70 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54  ].pExpr;.  exprT
25f80 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58  oRegister(&exprX
25f90 2c 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  , exprCodeVector
25fa0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c  (pParse, &exprX,
25fb0 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20   &regFree1));.  
25fc0 69 66 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20  if( xJump ){.   
25fd0 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20 26   xJump(pParse, &
25fe0 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
25ff0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
26000 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  lse{.    /* Mark
26010 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
26020 69 73 20 62 65 69 6e 67 20 66 72 6f 6d 20 74 68  is being from th
26030 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
26040 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 0a 20  ause of a join. 
26050 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68     ** so that th
26060 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
26070 65 54 61 72 67 65 74 28 29 20 72 6f 75 74 69 6e  eTarget() routin
26080 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
26090 70 74 20 74 6f 20 6d 6f 76 65 0a 20 20 20 20 2a  pt to move.    *
260a0 2a 20 69 74 20 69 6e 74 6f 20 74 68 65 20 50 61  * it into the Pa
260b0 72 73 65 2e 70 43 6f 6e 73 74 45 78 70 72 20 6c  rse.pConstExpr l
260c0 69 73 74 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  ist.  We should 
260d0 75 73 65 20 61 20 6e 65 77 20 62 69 74 20 66 6f  use a new bit fo
260e0 72 20 74 68 69 73 2c 0a 20 20 20 20 2a 2a 20 66  r this,.    ** f
260f0 6f 72 20 63 6c 61 72 69 74 79 2c 20 62 75 74 20  or clarity, but 
26100 77 65 20 61 72 65 20 6f 75 74 20 6f 66 20 62 69  we are out of bi
26110 74 73 20 69 6e 20 74 68 65 20 45 78 70 72 2e 66  ts in the Expr.f
26120 6c 61 67 73 20 66 69 65 6c 64 20 73 6f 20 77 65  lags field so we
26130 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 74 6f 20  .    ** have to 
26140 72 65 75 73 65 20 74 68 65 20 45 50 5f 46 72 6f  reuse the EP_Fro
26150 6d 4a 6f 69 6e 20 62 69 74 2e 20 20 42 75 6d 6d  mJoin bit.  Bumm
26160 65 72 2e 20 2a 2f 0a 20 20 20 20 65 78 70 72 58  er. */.    exprX
26170 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f  .flags |= EP_Fro
26180 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74  mJoin;.    sqlit
26190 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
261a0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
261b0 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20  d, dest);.  }.  
261c0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
261d0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
261e0 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45  gFree1);..  /* E
261f0 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74  nsure adequate t
26200 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  est coverage */.
26210 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
26220 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
26230 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
26240 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
26250 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
26260 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
26270 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
26280 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
26290 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
262a0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
262b0 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
262c0 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
262d0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
262e0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
262f0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
26300 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 20  lite3ExprIfTrue 
26310 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
26320 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
26330 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
26340 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
26350 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
26360 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
26370 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
26380 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
26390 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
263a0 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
263b0 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
263c0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
263d0 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
263e0 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
263f0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
26400 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
26410 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
26420 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  ==sqlite3ExprIfF
26430 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  alse && jumpIfNu
26440 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
26450 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
26460 73 65 28 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a  se( xJump==0 );.
26470 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
26480 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
26490 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
264a0 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
264b0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
264c0 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
264d0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
264e0 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
264f0 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
26500 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
26510 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
26520 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
26530 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
26540 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
26550 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
26560 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
26570 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
26580 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
26590 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
265a0 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
265b0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
265c0 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
265d0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
265e0 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
265f0 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
26600 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
26610 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
26620 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
26630 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
26640 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
26650 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
26660 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
26670 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
26680 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
26690 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
266a0 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
266b0 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
266c0 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
266d0 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
266e0 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
266f0 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
26700 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
26710 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
26720 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
26730 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
26740 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
26750 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
26760 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
26770 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
26780 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
26790 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
267a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
267b0 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
267c0 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
267d0 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
267e0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
267f0 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
26800 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
26810 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74  (v==0) )     ret
26820 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e  urn;  /* Existen
26830 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
26840 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
26850 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70    if( NEVER(pExp
26860 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  r==0) ) return; 
26870 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20   /* No way this 
26880 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  can happen */.  
26890 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
268a0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
268b0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
268c0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
268d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
268e0 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
268f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26900 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
26910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26920 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
26930 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
26940 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  d2,jumpIfNull^SQ
26950 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
26960 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26970 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
26980 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
26990 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
269a0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
269b0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
269c0 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
269d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
269e0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
269f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
26a00 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26a20 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
26a30 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
26a40 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
26a50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26a60 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
26a70 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
26a80 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
26a90 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
26aa0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
26ab0 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
26ac0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
26ad0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
26ae0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26af0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
26b00 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
26b10 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
26b20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26b30 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48     case TK_TRUTH
26b40 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  : {.      int is
26b50 4e 6f 74 3b 20 20 20 20 20 20 2f 2a 20 49 53 20  Not;      /* IS 
26b60 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e  NOT TRUE or IS N
26b70 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20  OT FALSE */.    
26b80 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20    int isTrue;   
26b90 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20    /* IS TRUE or 
26ba0 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20  IS NOT TRUE */. 
26bb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
26bc0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26bd0 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45        isNot = pE
26be0 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e  xpr->op2==TK_ISN
26bf0 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65  OT;.      isTrue
26c00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72   = sqlite3ExprTr
26c10 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e  uthValue(pExpr->
26c20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74  pRight);.      t
26c30 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20  estcase( isTrue 
26c40 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20  && isNot );.    
26c50 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54    testcase( !isT
26c60 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a  rue && isNot );.
26c70 20 20 20 20 20 20 69 66 28 20 69 73 54 72 75 65        if( isTrue
26c80 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20   ^ isNot ){.    
26c90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26ca0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
26cb0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
26cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
26ce0 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  t ? SQLITE_JUMPI
26cf0 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20  FNULL : 0);.    
26d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26d10 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
26d20 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
26d30 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a  r->pLeft, dest,.
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d50 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
26d60 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   ? SQLITE_JUMPIF
26d70 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20  NULL : 0);.     
26d80 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
26d90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
26da0 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
26db0 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
26dc0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
26dd0 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
26de0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
26df0 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  OT );.      op =
26e00 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
26e10 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
26e20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d      jumpIfNull =
26e30 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a   SQLITE_NULLEQ;.
26e40 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
26e50 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
26e60 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
26e70 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
26e80 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
26e90 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
26ea0 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
26eb0 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_EQ: {.      if
26ec0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
26ed0 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65  ector(pExpr->pLe
26ee0 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75  ft) ) goto defau
26ef0 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74  lt_expr;.      t
26f00 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
26f10 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
26f20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
26f30 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
26f40 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
26f50 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
26f60 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
26f70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
26f80 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
26f90 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
26fa0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
26fb0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
26fc0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
26fd0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
26fe0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
26ff0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
27000 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
27010 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
27020 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
27030 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
27040 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
27050 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27060 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
27070 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
27080 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
27090 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
270a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
270b0 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
270c0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
270d0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
270e0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
270f0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
27100 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
27110 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
27120 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
27130 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
27140 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
27150 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
27160 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  e(op==OP_Eq);.  
27170 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
27180 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
27190 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
271a0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
271b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
271c0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
271d0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
271e0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
271f0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
27200 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
27210 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
27220 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27230 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
27240 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
27250 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
27260 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
27270 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
27280 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
27290 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
272a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
272b0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
272c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
272d0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
272e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
272f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27300 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
27310 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
27320 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
27330 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
27340 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
27350 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
27360 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27370 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
27380 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
27390 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
273a0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
273b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
273c0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
273d0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
273e0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
273f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27400 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
27410 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27420 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
27430 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
27440 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
27450 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
27460 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27470 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
27480 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27490 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
274a0 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
274b0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
274c0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
274d0 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
274e0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
274f0 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78   dest, sqlite3Ex
27500 70 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66  prIfTrue, jumpIf
27510 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
27520 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
27530 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
27540 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
27550 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
27560 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
27570 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
27580 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
27590 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
275a0 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c  ull = jumpIfNull
275b0 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66   ? dest : destIf
275c0 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c  False;.      sql
275d0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
275e0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
275f0 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
27600 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
27610 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
27620 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
27630 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
27640 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
27650 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alse);.      bre
27660 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
27670 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
27680 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
27690 3a 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72  :.      if( expr
276a0 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
276b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
276c0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
276d0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
276e0 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
276f0 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
27700 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  .        /* No-o
27710 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
27720 7b 0a 20 20 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 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
27760 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27770 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
27780 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
27790 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
277a0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
277b0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
277c0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
277d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
277e0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
277f0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
27800 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27810 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
27820 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
27830 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
27840 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
27850 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
27860 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
27870 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
27880 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
27890 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
278a0 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
278b0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
278c0 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
278d0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
278e0 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
278f0 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
27900 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
27910 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
27920 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
27930 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
27940 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
27950 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
27960 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
27970 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
27980 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
27990 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
279a0 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
279b0 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
279c0 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
279d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
279e0 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
279f0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
27a00 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
27a10 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
27a20 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
27a30 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
27a40 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
27a50 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
27a60 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
27a70 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
27a80 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
27a90 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
27aa0 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
27ab0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
27ac0 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
27ad0 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  n; /* Existence 
27ae0 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
27af0 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
27b00 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
27b10 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
27b20 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
27b30 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
27b40 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
27b50 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
27b60 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
27b70 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
27b80 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
27b90 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
27ba0 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
27bb0 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
27bc0 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
27bd0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
27be0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
27bf0 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
27c00 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
27c10 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
27c20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
27c30 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
27c40 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
27c60 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
27c70 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
27c80 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
27c90 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
27ca0 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
27cb0 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
27cc0 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
27cd0 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
27ce0 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
27cf0 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
27d00 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
27d10 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
27d20 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
27d30 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
27d40 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
27d50 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
27d60 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
27d70 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
27d80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
27d90 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
27da0 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
27db0 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
27dc0 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
27dd0 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
27de0 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
27df0 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
27e00 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
27e10 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
27e20 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
27e30 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
27e40 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27e50 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
27e60 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
27e70 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
27e80 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
27e90 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
27ea0 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
27eb0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27ec0 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
27ed0 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
27ee0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
27ef0 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
27f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
27f10 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
27f20 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
27f30 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
27f40 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
27f50 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
27f60 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
27f70 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
27f80 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
27f90 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
27fa0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
27fb0 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
27fc0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
27fd0 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
27fe0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
27ff0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
28000 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
28010 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
28020 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
28030 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
28040 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
28050 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
28060 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
28070 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
28080 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
28090 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
280a0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
280b0 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
280c0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
280d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
280e0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
280f0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
28100 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
28110 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
28120 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  , d2, jumpIfNull
28130 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
28140 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
28150 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
28160 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
28170 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
28180 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
28190 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
281a0 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
281b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
281c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
281d0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
281e0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
281f0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
28200 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
28210 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
28220 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
28230 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
28240 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
28250 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20 20  e TK_TRUTH: {.  
28260 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20 20      int isNot;  
28270 20 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55 45 20   /* IS NOT TRUE 
28280 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20  or IS NOT FALSE 
28290 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54  */.      int isT
282a0 72 75 65 3b 20 20 2f 2a 20 49 53 20 54 52 55 45  rue;  /* IS TRUE
282b0 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20   or IS NOT TRUE 
282c0 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
282d0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
282e0 20 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f 74 20   );.      isNot 
282f0 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b  = pExpr->op2==TK
28300 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20 69 73  _ISNOT;.      is
28310 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78  True = sqlite3Ex
28320 70 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78  prTruthValue(pEx
28330 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
28340 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 54     testcase( isT
28350 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a  rue && isNot );.
28360 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28370 21 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f 74  !isTrue && isNot
28380 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   );.      if( is
28390 54 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b 0a  True ^ isNot ){.
283a0 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 54 52          /* IS TR
283b0 55 45 20 61 6e 64 20 49 53 20 4e 4f 54 20 46 41  UE and IS NOT FA
283c0 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  LSE */.        s
283d0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
283e0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
283f0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20  >pLeft, dest,.  
28400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28410 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f           isNot ?
28420 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50   0 : SQLITE_JUMP
28430 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 20 20  IFNULL);..      
28440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
28450 2a 20 49 53 20 46 41 4c 53 45 20 61 6e 64 20 49  * IS FALSE and I
28460 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20  S NOT TRUE */.  
28470 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28480 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
28490 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
284a0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
284c0 4e 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49 54 45  Not ? 0 : SQLITE
284d0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
284e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
284f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
28500 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
28510 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
28520 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
28530 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
28540 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28550 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
28560 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20  NOT );.      op 
28570 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  = (pExpr->op==TK
28580 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54  _IS) ? TK_NE : T
28590 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70  K_EQ;.      jump
285a0 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f  IfNull = SQLITE_
285b0 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a  NULLEQ;.      /*
285c0 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   Fall thru */.  
285d0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
285e0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
285f0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
28600 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
28610 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
28620 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
28630 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
28640 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45  3ExprIsVector(pE
28650 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f  xpr->pLeft) ) go
28660 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b  to default_expr;
28670 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28680 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
28690 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
286a0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
286b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
286c0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
286d0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
286e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
286f0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
28700 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
28710 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
28720 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
28730 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
28740 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
28770 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
28780 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
28790 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
287a0 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
287b0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
287c0 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
287d0 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
287e0 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
287f0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
28800 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
28810 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
28820 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
28830 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
28840 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
28850 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
28860 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
28870 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
28880 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
28890 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
288a0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
288b0 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
288c0 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
288d0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
288e0 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Eq);.      Vdbe
288f0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
28900 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
28910 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
28920 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
28930 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
28940 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
28950 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
28960 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73  ULLEQ);.      as
28970 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
28980 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
28990 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56  =OP_Ne);.      V
289a0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
289b0 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
289c0 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
289d0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
289e0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
289f0 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
28a00 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
28a10 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
28a20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
28a30 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
28a40 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
28a50 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
28a60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
28a70 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
28a80 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
28a90 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20  ULL: {.      r1 
28aa0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
28ab0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
28ac0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
28ad0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
28ae0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
28af0 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
28b00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28b10 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
28b20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  );   VdbeCoverag
28b30 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
28b40 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
28b50 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
28b60 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f  TNULL );  VdbeCo
28b70 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
28b80 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
28b90 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
28ba0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
28bb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
28bc0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
28bd0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
28be0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
28bf0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
28c00 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
28c10 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
28c20 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  , sqlite3ExprIfF
28c30 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  alse, jumpIfNull
28c40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
28c50 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
28c60 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
28c70 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  RY.    case TK_I
28c80 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a  N: {.      if( j
28c90 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  umpIfNull ){.   
28ca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28cb0 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
28cc0 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
28cd0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
28ce0 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74          int dest
28cf0 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
28d00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
28d10 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
28d20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
28d30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
28d40 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c  dest, destIfNull
28d50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28d60 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
28d70 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
28d80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28d90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
28da0 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
28db0 3a 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f  : {.    default_
28dc0 65 78 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28  expr: .      if(
28dd0 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
28de0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
28df0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
28e00 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
28e10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70     }else if( exp
28e20 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70  rAlwaysTrue(pExp
28e30 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
28e40 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   no-op */.      
28e50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
28e60 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
28e70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
28e80 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
28e90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28ea0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
28eb0 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65  OP_IfNot, r1, de
28ec0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
28ed0 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
28ee0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
28ef0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
28f00 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
28f10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28f20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
28f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
28f40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
28f50 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
28f60 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
28f70 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
28f80 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
28f90 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
28fa0 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ee2);.}../*.** L
28fb0 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 49  ike sqlite3ExprI
28fc0 66 46 61 6c 73 65 28 29 20 65 78 63 65 70 74 20  fFalse() except 
28fd0 74 68 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d  that a copy is m
28fe0 61 64 65 20 6f 66 20 70 45 78 70 72 20 62 65 66  ade of pExpr bef
28ff0 6f 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65  ore.** code gene
29000 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74  ration, and that
29010 20 63 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64   copy is deleted
29020 20 61 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65   after code gene
29030 72 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20  ration. This.** 
29040 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
29050 20 6f 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20   original pExpr 
29060 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  is unchanged..*/
29070 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
29080 72 49 66 46 61 6c 73 65 44 75 70 28 50 61 72 73  rIfFalseDup(Pars
29090 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
290a0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
290b0 2c 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ,int jumpIfNull)
290c0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
290d0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
290e0 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71  Expr *pCopy = sq
290f0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
29100 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66   pExpr, 0);.  if
29110 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
29120 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ed==0 ){.    sql
29130 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
29140 70 50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64  pParse, pCopy, d
29150 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
29160 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
29170 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
29180 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  opy);.}../*.** E
29190 78 70 72 65 73 73 69 6f 6e 20 70 56 61 72 20 69  xpression pVar i
291a0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
291b0 62 65 20 61 6e 20 53 51 4c 20 76 61 72 69 61 62  be an SQL variab
291c0 6c 65 2e 20 70 45 78 70 72 20 6d 61 79 20 62 65  le. pExpr may be
291d0 20 61 6e 79 0a 2a 2a 20 74 79 70 65 20 6f 66 20   any.** type of 
291e0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
291f0 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
29200 73 69 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65  simple SQL value
29210 20 2d 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 72   - an integer, r
29220 65 61 6c 2c 20 73 74 72 69 6e 67 2c 20 62 6c 6f  eal, string, blo
29230 62 0a 2a 2a 20 6f 72 20 4e 55 4c 4c 20 76 61 6c  b.** or NULL val
29240 75 65 20 2d 20 74 68 65 6e 20 74 68 65 20 56 44  ue - then the VD
29250 42 45 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  BE currently bei
29260 6e 67 20 70 72 65 70 61 72 65 64 20 69 73 20 63  ng prepared is c
29270 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20  onfigured.** to 
29280 72 65 2d 70 72 65 70 61 72 65 20 65 61 63 68 20  re-prepare each 
29290 74 69 6d 65 20 61 20 6e 65 77 20 76 61 6c 75 65  time a new value
292a0 20 69 73 20 62 6f 75 6e 64 20 74 6f 20 76 61 72   is bound to var
292b0 69 61 62 6c 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a  iable pVar..**.*
292c0 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  * Additionally, 
292d0 69 66 20 70 45 78 70 72 20 69 73 20 61 20 73 69  if pExpr is a si
292e0 6d 70 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 61  mple SQL value a
292f0 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  nd the value is 
29300 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 74  the.** same as t
29310 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 62 6f  hat currently bo
29320 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20  und to variable 
29330 70 56 61 72 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69  pVar, non-zero i
29340 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f  s returned..** O
29350 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
29360 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20   values are not 
29370 74 68 65 20 73 61 6d 65 20 6f 72 20 69 66 20 70  the same or if p
29380 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 73 69  Expr is not a si
29390 6d 70 6c 65 0a 2a 2a 20 53 51 4c 20 76 61 6c 75  mple.** SQL valu
293a0 65 2c 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72  e, zero is retur
293b0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
293c0 6e 74 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61  nt exprCompareVa
293d0 72 69 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  riable(Parse *pP
293e0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 56 61 72  arse, Expr *pVar
293f0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
29400 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20    int res = 0;. 
29410 20 69 6e 74 20 69 56 61 72 3b 0a 20 20 73 71 6c   int iVar;.  sql
29420 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c 2c 20  ite3_value *pL, 
29430 2a 70 52 20 3d 20 30 3b 0a 20 20 0a 20 20 73 71  *pR = 0;.  .  sq
29440 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78  lite3ValueFromEx
29450 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  pr(pParse->db, p
29460 45 78 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46  Expr, SQLITE_UTF
29470 38 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  8, SQLITE_AFF_BL
29480 4f 42 2c 20 26 70 52 29 3b 0a 20 20 69 66 28 20  OB, &pR);.  if( 
29490 70 52 20 29 7b 0a 20 20 20 20 69 56 61 72 20 3d  pR ){.    iVar =
294a0 20 70 56 61 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   pVar->iColumn;.
294b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
294c0 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65  etVarmask(pParse
294d0 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29 3b 0a  ->pVdbe, iVar);.
294e0 20 20 20 20 70 4c 20 3d 20 73 71 6c 69 74 65 33      pL = sqlite3
294f0 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75  VdbeGetBoundValu
29500 65 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65  e(pParse->pRepre
29510 70 61 72 65 2c 20 69 56 61 72 2c 20 53 51 4c 49  pare, iVar, SQLI
29520 54 45 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20  TE_AFF_BLOB);.  
29530 20 20 69 66 28 20 70 4c 20 29 7b 0a 20 20 20 20    if( pL ){.    
29540 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
29550 6c 75 65 5f 74 79 70 65 28 70 4c 29 3d 3d 53 51  lue_type(pL)==SQ
29560 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
29570 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
29580 75 65 5f 74 65 78 74 28 70 4c 29 3b 20 2f 2a 20  ue_text(pL); /* 
29590 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 65 6e  Make sure the en
295a0 63 6f 64 69 6e 67 20 69 73 20 55 54 46 2d 38 20  coding is UTF-8 
295b0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
295c0 20 72 65 73 20 3d 20 20 30 3d 3d 73 71 6c 69 74   res =  0==sqlit
295d0 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 4c 2c  e3MemCompare(pL,
295e0 20 70 52 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20   pR, 0);.    }. 
295f0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
29600 72 65 65 28 70 52 29 3b 0a 20 20 20 20 73 71 6c  ree(pR);.    sql
29610 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 4c  ite3ValueFree(pL
29620 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
29630 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44   res;.}../*.** D
29640 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
29650 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
29660 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
29670 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
29680 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
29690 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20   are completely 
296a0 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75  identical.  Retu
296b0 72 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66  rn 1 if they dif
296c0 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61  fer only.** by a
296d0 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
296e0 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76  r at the top lev
296f0 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66  el.  Return 2 if
29700 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
29710 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20  rences.** other 
29720 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76  than the top-lev
29730 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  el COLLATE opera
29740 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  tor..**.** If an
29750 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20  y subelement of 
29760 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62  pB has Expr.iTab
29770 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74  le==(-1) then it
29780 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
29790 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  o compare equal 
297a0 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  to an equivalent
297b0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77   element in pA w
297c0 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  ith Expr.iTable=
297d0 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  =iTab..**.** The
297e0 20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62   pA side might b
297f0 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53  e using TK_REGIS
29800 54 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73  TER.  If that is
29810 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42   the case and pB
29820 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67   is.** not using
29830 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74   TK_REGISTER but
29840 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71   is otherwise eq
29850 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73  uivalent, then s
29860 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  till return 0..*
29870 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74  *.** Sometimes t
29880 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
29890 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69   return 2 even i
298a0 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
298b0 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
298c0 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
298d0 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
298e0 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
298f0 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
29900 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
29910 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62  turn 2 just to b
29920 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74  e safe.  So if t
29930 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
29940 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79  eturns 2, then y
29950 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  ou do not really
29960 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69   know for certai
29970 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  n if the two.** 
29980 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
29990 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69  the same.  But i
299a0 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72  f you get a 0 or
299b0 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20   1 return, then 
299c0 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75  you.** can be su
299d0 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
299e0 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
299f0 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20    In the places 
29a00 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  where.** this ro
29a10 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69  utine is used, i
29a20 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20  t does not hurt 
29a30 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20  to get an extra 
29a40 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74  2 - that.** just
29a50 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
29a60 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73   some slightly s
29a70 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74  lower code.  But
29a80 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e   returning.** an
29a90 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20   incorrect 0 or 
29aa0 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  1 could lead to 
29ab0 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a  a malfunction..*
29ac0 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69  *.** If pParse i
29ad0 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
29ae0 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72 6d  TK_VARIABLE term
29af0 73 20 69 6e 20 70 41 20 77 69 74 68 20 62 69 6e  s in pA with bin
29b00 64 69 6e 67 73 20 69 6e 0a 2a 2a 20 70 50 61 72  dings in.** pPar
29b10 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 20 63  se->pReprepare c
29b20 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 61 67  an be matched ag
29b30 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 73 20 69  ainst literals i
29b40 6e 20 70 42 2e 20 20 54 68 65 20 0a 2a 2a 20 70  n pB.  The .** p
29b50 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78  Parse->pVdbe->ex
29b60 70 6d 61 73 6b 20 62 69 74 6d 61 73 6b 20 69 73  pmask bitmask is
29b70 20 75 70 64 61 74 65 64 20 66 6f 72 20 65 61 63   updated for eac
29b80 68 20 76 61 72 69 61 62 6c 65 20 72 65 66 65 72  h variable refer
29b90 65 6e 63 65 64 2e 0a 2a 2a 20 49 66 20 70 50 61  enced..** If pPa
29ba0 72 73 65 20 69 73 20 4e 55 4c 4c 20 28 74 68 65  rse is NULL (the
29bb0 20 6e 6f 72 6d 61 6c 20 63 61 73 65 29 20 74 68   normal case) th
29bc0 65 6e 20 61 6e 79 20 54 4b 5f 56 41 52 49 41 42  en any TK_VARIAB
29bd0 4c 45 20 74 65 72 6d 20 69 6e 20 0a 2a 2a 20 41  LE term in .** A
29be0 72 67 75 6d 65 6e 74 20 70 50 61 72 73 65 20 73  rgument pParse s
29bf0 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62  hould normally b
29c00 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73  e NULL. If it is
29c10 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 70 41   not NULL and pA
29c20 20 6f 72 0a 2a 2a 20 70 42 20 63 61 75 73 65 73   or.** pB causes
29c30 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20   a return value 
29c40 6f 66 20 32 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  of 2..*/.int sql
29c50 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
29c60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
29c70 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70  xpr *pA, Expr *p
29c80 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
29c90 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  u32 combinedFlag
29ca0 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c  s;.  if( pA==0 |
29cb0 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72  | pB==0 ){.    r
29cc0 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30  eturn pB==pA ? 0
29cd0 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20   : 2;.  }.  if( 
29ce0 70 50 61 72 73 65 20 26 26 20 70 41 2d 3e 6f 70  pParse && pA->op
29cf0 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 26 26  ==TK_VARIABLE &&
29d00 20 65 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69   exprCompareVari
29d10 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 41 2c  able(pParse, pA,
29d20 20 70 42 29 20 29 7b 0a 20 20 20 20 72 65 74 75   pB) ){.    retu
29d30 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62  rn 0;.  }.  comb
29d40 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e  inedFlags = pA->
29d50 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67  flags | pB->flag
29d60 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  s;.  if( combine
29d70 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  dFlags & EP_IntV
29d80 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20  alue ){.    if( 
29d90 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66  (pA->flags&pB->f
29da0 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65  lags&EP_IntValue
29db0 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56  )!=0 && pA->u.iV
29dc0 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c  alue==pB->u.iVal
29dd0 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ue ){.      retu
29de0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
29df0 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
29e00 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
29e10 6f 70 20 7c 7c 20 70 41 2d 3e 6f 70 3d 3d 54 4b  op || pA->op==TK
29e20 5f 52 41 49 53 45 20 29 7b 0a 20 20 20 20 69 66  _RAISE ){.    if
29e30 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pA->op==TK_COL
29e40 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
29e50 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
29e60 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42 2c  e, pA->pLeft,pB,
29e70 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
29e80 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
29e90 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d  .    if( pB->op=
29ea0 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73  =TK_COLLATE && s
29eb0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
29ec0 65 28 70 50 61 72 73 65 2c 20 70 41 2c 70 42 2d  e(pParse, pA,pB-
29ed0 3e 70 4c 65 66 74 2c 69 54 61 62 29 3c 32 20 29  >pLeft,iTab)<2 )
29ee0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
29ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
29f00 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
29f10 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pA->op!=TK_COLUM
29f20 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f  N && pA->op!=TK_
29f30 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  AGG_COLUMN && pA
29f40 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
29f50 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
29f60 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20  _FUNCTION ){.   
29f70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
29f80 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b  rICmp(pA->u.zTok
29f90 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  en,pB->u.zToken)
29fa0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  !=0 ) return 2;.
29fb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29fc0 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
29fd0 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63       /* Justific
29fe0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 61 73  ation for the as
29ff0 73 65 72 74 28 29 3a 0a 20 20 20 20 20 20 2a 2a  sert():.      **
2a000 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
2a010 73 20 68 61 76 65 20 70 2d 3e 6f 70 3d 3d 54 4b  s have p->op==TK
2a020 5f 46 55 4e 43 54 49 4f 4e 20 62 75 74 20 61 67  _FUNCTION but ag
2a030 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2a040 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20  s.      ** have 
2a050 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  p->op==TK_AGG_FU
2a060 4e 43 54 49 4f 4e 2e 20 20 53 6f 20 61 6e 79 20  NCTION.  So any 
2a070 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65  comparison betwe
2a080 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65 0a  en an aggregate.
2a090 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
2a0a0 6e 20 61 6e 64 20 61 20 77 69 6e 64 6f 77 20 66  n and a window f
2a0b0 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 68  unction should h
2a0c0 61 76 65 20 66 61 69 6c 65 64 20 62 65 66 6f 72  ave failed befor
2a0d0 65 20 72 65 61 63 68 69 6e 67 0a 20 20 20 20 20  e reaching.     
2a0e0 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   ** this point. 
2a0f0 20 41 6e 64 2c 20 69 74 20 69 73 20 6e 6f 74 20   And, it is not 
2a100 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65  possible to have
2a110 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69   a window functi
2a120 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  on and.      ** 
2a130 61 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  a scalar functio
2a140 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  n with the same 
2a150 6e 61 6d 65 20 61 6e 64 20 6e 75 6d 62 65 72 20  name and number 
2a160 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 53  of arguments.  S
2a170 6f 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 77 65  o.      ** if we
2a180 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
2a190 74 2c 20 65 69 74 68 65 72 20 41 20 61 6e 64 20  t, either A and 
2a1a0 42 20 62 6f 74 68 20 77 69 6e 64 6f 77 20 66 75  B both window fu
2a1b0 6e 63 74 69 6f 6e 73 20 6f 72 0a 20 20 20 20 20  nctions or.     
2a1c0 20 2a 2a 20 6e 65 69 74 68 65 72 20 61 72 65 20   ** neither are 
2a1d0 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  a window functio
2a1e0 6e 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ns. */.      ass
2a1f0 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
2a200 65 72 74 79 28 70 41 2c 45 50 5f 57 69 6e 46 75  erty(pA,EP_WinFu
2a210 6e 63 29 3d 3d 45 78 70 72 48 61 73 50 72 6f 70  nc)==ExprHasProp
2a220 65 72 74 79 28 70 42 2c 45 50 5f 57 69 6e 46 75  erty(pB,EP_WinFu
2a230 6e 63 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  nc) );.      if(
2a240 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
2a250 28 70 41 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20  (pA,EP_WinFunc) 
2a260 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
2a270 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70  qlite3WindowComp
2a280 61 72 65 28 70 50 61 72 73 65 2c 70 41 2d 3e 79  are(pParse,pA->y
2a290 2e 70 57 69 6e 2c 70 42 2d 3e 79 2e 70 57 69 6e  .pWin,pB->y.pWin
2a2a0 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b  )!=0 ) return 2;
2a2b0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2a2c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
2a2d0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
2a2e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
2a2f0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 41  lite3_stricmp(pA
2a300 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
2a310 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65  .zToken)!=0 ) re
2a320 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73  turn 2;.    }els
2a330 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d  e if( strcmp(pA-
2a340 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
2a350 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
2a360 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
2a370 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
2a380 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  A->flags & EP_Di
2a390 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c  stinct)!=(pB->fl
2a3a0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
2a3b0 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  t) ) return 2;. 
2a3c0 20 69 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c   if( (combinedFl
2a3d0 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ags & EP_TokenOn
2a3e0 6c 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ly)==0 ){.    if
2a3f0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
2a400 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
2a410 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
2a420 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  f( (combinedFlag
2a430 73 20 26 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  s & EP_FixedCol)
2a440 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ==0.     && sqli
2a450 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
2a460 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
2a470 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
2a480 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
2a490 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2a4a0 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
2a4b0 2c 20 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  , pA->pRight, pB
2a4c0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
2a4d0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a4e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
2a4f0 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78  istCompare(pA->x
2a500 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c  .pList, pB->x.pL
2a510 69 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ist, iTab) ) ret
2a520 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 70  urn 2;.    if( p
2a530 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47  A->op!=TK_STRING
2a540 0a 20 20 20 20 20 26 26 20 70 41 2d 3e 6f 70 21  .     && pA->op!
2a550 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 0a 20 20  =TK_TRUEFALSE.  
2a560 20 20 20 26 26 20 28 63 6f 6d 62 69 6e 65 64 46     && (combinedF
2a570 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65  lags & EP_Reduce
2a580 64 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  d)==0.    ){.   
2a590 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75     if( pA->iColu
2a5a0 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
2a5b0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a5c0 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
2a5d0 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20  !=pB->iTable .  
2a5e0 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61       && (pA->iTa
2a5f0 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56  ble!=iTab || NEV
2a600 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30  ER(pB->iTable>=0
2a610 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  )) ) return 2;. 
2a620 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2a630 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
2a640 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69  mpare two ExprLi
2a650 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74  st objects.  Ret
2a660 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72  urn 0 if they ar
2a670 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
2a680 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
2a690 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
2a6a0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  ny way..**.** If
2a6b0 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
2a6c0 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
2a6d0 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
2a6e0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
2a6f0 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
2a700 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
2a710 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
2a720 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
2a730 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
2a740 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
2a750 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ht return non-ze
2a760 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  ro for equivalen
2a770 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68  t ExprLists.  Th
2a780 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71  e.** only conseq
2a790 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69  uence will be di
2a7a0 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74  sabled optimizat
2a7b0 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20  ions.  But this 
2a7c0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
2a7d0 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69  never return 0 i
2a7e0 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69  f the two ExprLi
2a7f0 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64  st objects are d
2a800 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20  ifferent, or.** 
2a810 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69  a malfunction wi
2a820 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  ll result..**.**
2a830 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   Two NULL pointe
2a840 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
2a850 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  d to be the same
2a860 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f  .  But a NULL po
2a870 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20  inter.** always 
2a880 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
2a890 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e  on-NULL pointer.
2a8a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2a8b0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45  xprListCompare(E
2a8c0 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70  xprList *pA, Exp
2a8d0 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69  rList *pB, int i
2a8e0 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Tab){.  int i;. 
2a8f0 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42   if( pA==0 && pB
2a900 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2a910 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
2a920 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  B==0 ) return 1;
2a930 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72  .  if( pA->nExpr
2a940 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65  !=pB->nExpr ) re
2a950 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d  turn 1;.  for(i=
2a960 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20  0; i<pA->nExpr; 
2a970 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
2a980 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69  pExprA = pA->a[i
2a990 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ].pExpr;.    Exp
2a9a0 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e  r *pExprB = pB->
2a9b0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
2a9c0 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72  if( pA->a[i].sor
2a9d0 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d  tOrder!=pB->a[i]
2a9e0 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
2a9f0 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73  urn 1;.    if( s
2aa00 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2aa10 65 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45 78  e(0, pExprA, pEx
2aa20 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74  prB, iTab) ) ret
2aa30 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2aa40 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2aa50 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
2aa60 43 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74  Compare() except
2aa70 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
2aa80 72 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65  rs at the top-le
2aa90 76 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72  vel.** are ignor
2aaa0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2aab0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69  e3ExprCompareSki
2aac0 70 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  p(Expr *pA, Expr
2aad0 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
2aae0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2aaf0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a  3ExprCompare(0,.
2ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2ab10 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
2ab20 61 74 65 28 70 41 29 2c 0a 20 20 20 20 20 20 20  ate(pA),.       
2ab30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2ab40 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 42 29  rSkipCollate(pB)
2ab50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69  ,.             i
2ab60 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Tab);.}../*.** R
2ab70 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65  eturn true if we
2ab80 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70   can prove the p
2ab90 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  E2 will always b
2aba0 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73  e true if pE1 is
2abb0 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72  .** true.  Retur
2abc0 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61  n false if we ca
2abd0 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68  nnot complete th
2abe0 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45  e proof or if pE
2abf0 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61  2 might.** be fa
2ac00 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  lse.  Examples:.
2ac10 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  **.**     pE1: x
2ac20 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78  ==5       pE2: x
2ac30 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
2ac40 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2ac50 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20      pE1: x>0    
2ac60 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
2ac70 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
2ac80 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
2ac90 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70  E1: x=21       p
2aca0 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33  E2: x=21 OR y=43
2acb0 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
2acc0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
2acd0 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20  =123     pE2: x 
2ace0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2acf0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
2ad00 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20     pE1: x!=?1   
2ad10 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
2ad20 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
2ad30 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
2ad40 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32  : x IS NULL  pE2
2ad50 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
2ad60 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
2ad70 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
2ad80 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49  S ?2    pE2: x I
2ad90 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
2ada0 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a  uslt: false.**.*
2adb0 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  * When comparing
2adc0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
2add0 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64   between pE1 and
2ade0 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73   pE2, if pE2 has
2adf0 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c  .** Expr.iTable<
2ae00 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20  0 then assume a 
2ae10 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76  table number giv
2ae20 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a  en by iTab..**.*
2ae30 2a 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e  * If pParse is n
2ae40 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
2ae50 65 20 76 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e  e values of boun
2ae60 64 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 70  d variables in p
2ae70 45 31 20 61 72 65 20 0a 2a 2a 20 63 6f 6d 70 61  E1 are .** compa
2ae80 72 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65  red against lite
2ae90 72 61 6c 20 76 61 6c 75 65 73 20 69 6e 20 70 45  ral values in pE
2aea0 32 20 61 6e 64 20 70 50 61 72 73 65 2d 3e 70 56  2 and pParse->pV
2aeb0 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20 69 73 0a  dbe->expmask is.
2aec0 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 72  ** modified to r
2aed0 65 63 6f 72 64 20 77 68 69 63 68 20 62 6f 75 6e  ecord which boun
2aee0 64 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  d variables are 
2aef0 72 65 66 65 72 65 6e 63 65 64 2e 20 20 49 66 20  referenced.  If 
2af00 70 50 61 72 73 65 20 0a 2a 2a 20 69 73 20 4e 55  pParse .** is NU
2af10 4c 4c 2c 20 74 68 65 6e 20 66 61 6c 73 65 20 77  LL, then false w
2af20 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
2af30 69 66 20 70 45 31 20 63 6f 6e 74 61 69 6e 73 20  if pE1 contains 
2af40 61 6e 79 20 62 6f 75 6e 64 20 76 61 72 69 61 62  any bound variab
2af50 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  les..**.** When 
2af60 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
2af70 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
2af80 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
2af90 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
2afa0 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
2afb0 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
2afc0 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
2afd0 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
2afe0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
2aff0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
2b000 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
2b010 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
2b020 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
2b030 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2b040 72 49 6d 70 6c 69 65 73 45 78 70 72 28 50 61 72  rImpliesExpr(Par
2b050 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2b060 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32   *pE1, Expr *pE2
2b070 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
2b080 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
2b090 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
2b0a0 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30  1, pE2, iTab)==0
2b0b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2b0c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d  ;.  }.  if( pE2-
2b0d0 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26  >op==TK_OR.   &&
2b0e0 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70   (sqlite3ExprImp
2b0f0 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65 2c  liesExpr(pParse,
2b100 20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74   pE1, pE2->pLeft
2b110 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20  , iTab).        
2b120 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45       || sqlite3E
2b130 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
2b140 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2b150 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
2b160 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2b170 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
2b180 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  2->op==TK_NOTNUL
2b190 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
2b1a0 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  _ISNULL && pE1->
2b1b0 6f 70 21 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20  op!=TK_IS ){.   
2b1c0 20 45 78 70 72 20 2a 70 58 20 3d 20 73 71 6c 69   Expr *pX = sqli
2b1d0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2b1e0 74 65 28 70 45 31 2d 3e 70 4c 65 66 74 29 3b 0a  te(pE1->pLeft);.
2b1f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2b200 21 3d 70 45 31 2d 3e 70 4c 65 66 74 20 29 3b 0a  !=pE1->pLeft );.
2b210 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2b220 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
2b230 65 2c 20 70 58 2c 20 70 45 32 2d 3e 70 4c 65 66  e, pX, pE2->pLef
2b240 74 2c 20 69 54 61 62 29 3d 3d 30 20 29 20 72 65  t, iTab)==0 ) re
2b250 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
2b260 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2b270 20 54 68 69 73 20 69 73 20 74 68 65 20 45 78 70   This is the Exp
2b280 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20  r node callback 
2b290 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70 72 49  for sqlite3ExprI
2b2a0 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2b2b0 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ()..** If the ex
2b2c0 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
2b2d0 71 75 69 72 65 73 20 74 68 61 74 20 74 68 65 20  quires that the 
2b2e0 74 61 62 6c 65 20 61 74 20 70 57 61 6c 6b 65 72  table at pWalker
2b2f0 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76 65 20 6f  ->iCur.** have o
2b300 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 6f 6e 2d 4e  ne or more non-N
2b310 55 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  ULL column, then
2b320 20 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43   set pWalker->eC
2b330 6f 64 65 20 74 6f 20 31 20 61 6e 64 20 61 62 6f  ode to 1 and abo
2b340 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  rt..**.** This r
2b350 6f 75 74 69 6e 65 20 63 6f 6e 74 72 6f 6c 73 20  outine controls 
2b360 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
2b370 20 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65    False positive
2b380 73 20 28 73 65 74 74 69 6e 67 0a 2a 2a 20 70 57  s (setting.** pW
2b390 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20  alker->eCode to 
2b3a0 31 20 77 68 65 6e 20 69 74 20 73 68 6f 75 6c 64  1 when it should
2b3b0 20 6e 6f 74 20 62 65 29 20 61 72 65 20 64 65 61   not be) are dea
2b3c0 64 6c 79 2c 20 62 75 74 20 66 61 6c 73 65 2d 6e  dly, but false-n
2b3d0 65 67 61 74 69 76 65 73 0a 2a 2a 20 28 6e 65 76  egatives.** (nev
2b3e0 65 72 20 73 65 74 74 69 6e 67 20 70 57 61 6c 6b  er setting pWalk
2b3f0 65 72 2d 3e 65 43 6f 64 65 29 20 69 73 20 61 20  er->eCode) is a 
2b400 68 61 72 6d 6c 65 73 73 20 6d 69 73 73 65 64 20  harmless missed 
2b410 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f  optimization..*/
2b420 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6d 70 6c  .static int impl
2b430 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61  iesNotNullRow(Wa
2b440 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2b450 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 74  xpr *pExpr){.  t
2b460 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b470 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2b480 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  N );.  testcase(
2b490 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
2b4a0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
2b4b0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
2b4c0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
2b4d0 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
2b4e0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73  n WRC_Prune;.  s
2b4f0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
2b500 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
2b510 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ISNOT:.    case 
2b520 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  TK_NOT:.    case
2b530 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
2b540 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
2b550 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
2b560 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a 20 20  case TK_CASE:.  
2b570 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20    case TK_IN:.  
2b580 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
2b590 4f 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  ON:.      testca
2b5a0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2b5b0 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
2b5c0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2b5d0 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ->op==TK_NOT );.
2b5e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b5f0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
2b600 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
2b610 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2b620 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
2b630 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2b640 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  r->op==TK_OR );.
2b650 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b660 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41  pExpr->op==TK_CA
2b670 53 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  SE );.      test
2b680 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2b690 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20  =TK_IN );.      
2b6a0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2b6b0 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
2b6c0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
2b6d0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
2b6e0 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a  case TK_COLUMN:.
2b6f0 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
2b700 72 2d 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70 72  r->u.iCur==pExpr
2b710 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ->iTable ){.    
2b720 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
2b730 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
2b740 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2b750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b760 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2b770 3b 0a 0a 20 20 20 20 2f 2a 20 56 69 72 74 75 61  ;..    /* Virtua
2b780 6c 20 74 61 62 6c 65 73 20 61 72 65 20 61 6c 6c  l tables are all
2b790 6f 77 65 64 20 74 6f 20 75 73 65 20 63 6f 6e 73  owed to use cons
2b7a0 74 72 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e  traints like x=N
2b7b0 55 4c 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  ULL.  So.    ** 
2b7c0 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  a term of the fo
2b7d0 72 6d 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20  rm x=y does not 
2b7e0 70 72 6f 76 65 20 74 68 61 74 20 79 20 69 73 20  prove that y is 
2b7f0 6e 6f 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20  not null if x.  
2b800 20 20 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c 75    ** is the colu
2b810 6d 6e 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20  mn of a virtual 
2b820 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73  table */.    cas
2b830 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73  e TK_EQ:.    cas
2b840 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
2b850 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
2b860 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
2b870 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
2b880 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74  e TK_GE:.      t
2b890 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b8a0 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
2b8b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b8c0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  pr->op==TK_NE );
2b8d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2b8e0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
2b8f0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
2b900 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2b910 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_LE );.      t
2b920 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b930 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20  op==TK_GT );.   
2b940 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b950 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b  pr->op==TK_GE );
2b960 0a 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70  .      if( (pExp
2b970 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
2b980 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72  _COLUMN && IsVir
2b990 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66  tual(pExpr->pLef
2b9a0 74 2d 3e 79 2e 70 54 61 62 29 29 0a 20 20 20 20  t->y.pTab)).    
2b9b0 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70 52     || (pExpr->pR
2b9c0 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ight->op==TK_COL
2b9d0 55 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c  UMN && IsVirtual
2b9e0 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
2b9f0 79 2e 70 54 61 62 29 29 0a 20 20 20 20 20 20 29  y.pTab)).      )
2ba00 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  {.       return 
2ba10 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
2ba20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a   }.    default:.
2ba30 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2ba40 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
2ba50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2ba60 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  rue (non-zero) i
2ba70 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  f expression p c
2ba80 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20  an only be true 
2ba90 69 66 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f  if at least.** o
2baa0 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
2bab0 6c 65 20 69 54 61 62 20 69 73 20 6e 6f 6e 2d 6e  le iTab is non-n
2bac0 75 6c 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ull.  In other w
2bad0 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75  ords, return tru
2bae0 65 0a 2a 2a 20 69 66 20 65 78 70 72 65 73 73 69  e.** if expressi
2baf0 6f 6e 20 70 20 77 69 6c 6c 20 61 6c 77 61 79 73  on p will always
2bb00 20 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c 73   be NULL or fals
2bb10 65 20 69 66 20 65 76 65 72 79 20 63 6f 6c 75 6d  e if every colum
2bb20 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20  n of iTab.** is 
2bb30 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73  NULL..**.** Fals
2bb40 65 20 6e 65 67 61 74 69 76 65 73 20 61 72 65 20  e negatives are 
2bb50 61 63 63 65 70 74 61 62 6c 65 2e 20 20 49 6e 20  acceptable.  In 
2bb60 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20  other words, it 
2bb70 69 73 20 6f 6b 20 74 6f 20 72 65 74 75 72 6e 0a  is ok to return.
2bb80 2a 2a 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20  ** zero even if 
2bb90 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69 6c  expression p wil
2bba0 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 20  l never be true 
2bbb0 6f 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  of every column 
2bbc0 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e 55  of iTab.** is NU
2bbd0 4c 4c 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67  LL.  A false neg
2bbe0 61 74 69 76 65 20 69 73 20 6d 65 72 65 6c 79 20  ative is merely 
2bbf0 61 20 6d 69 73 73 65 64 20 6f 70 74 69 6d 69 7a  a missed optimiz
2bc00 61 74 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ation opportunit
2bc10 79 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20 70  y..**.** False p
2bc20 6f 73 69 74 69 76 65 73 20 61 72 65 20 6e 6f 74  ositives are not
2bc30 20 61 6c 6c 6f 77 65 64 2c 20 68 6f 77 65 76 65   allowed, howeve
2bc40 72 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69  r.  A false posi
2bc50 74 69 76 65 20 6d 61 79 20 72 65 73 75 6c 74 0a  tive may result.
2bc60 2a 2a 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  ** in an incorre
2bc70 63 74 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a 2a  ct answer..**.**
2bc80 20 54 65 72 6d 73 20 6f 66 20 70 20 74 68 61 74   Terms of p that
2bc90 20 61 72 65 20 6d 61 72 6b 65 64 20 77 69 74 68   are marked with
2bca0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61 6e   EP_FromJoin (an
2bcb0 64 20 68 65 6e 63 65 20 74 68 61 74 20 63 6f 6d  d hence that com
2bcc0 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f 4e  e from.** the ON
2bcd0 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2bce0 73 20 6f 66 20 4c 45 46 54 20 4a 4f 49 4e 53 29  s of LEFT JOINS)
2bcf0 20 61 72 65 20 65 78 63 6c 75 64 65 64 20 66 72   are excluded fr
2bd00 6f 6d 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  om the analysis.
2bd10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2bd20 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ine is used to c
2bd30 68 65 63 6b 20 69 66 20 61 20 4c 45 46 54 20 4a  heck if a LEFT J
2bd40 4f 49 4e 20 63 61 6e 20 62 65 20 63 6f 6e 76 65  OIN can be conve
2bd50 72 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20  rted into.** an 
2bd60 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 20 20  ordinary JOIN.  
2bd70 54 68 65 20 70 20 61 72 67 75 6d 65 6e 74 20 69  The p argument i
2bd80 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  s the WHERE clau
2bd90 73 65 2e 20 20 49 66 20 74 68 65 20 57 48 45 52  se.  If the WHER
2bda0 45 0a 2a 2a 20 63 6c 61 75 73 65 20 72 65 71 75  E.** clause requ
2bdb0 69 72 65 73 20 74 68 61 74 20 73 6f 6d 65 20 63  ires that some c
2bdc0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 69 67  olumn of the rig
2bdd0 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ht table of the 
2bde0 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65 20  LEFT JOIN.** be 
2bdf0 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  non-NULL, then t
2be00 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e  he LEFT JOIN can
2be10 20 62 65 20 73 61 66 65 6c 79 20 63 6f 6e 76 65   be safely conve
2be20 72 74 65 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20  rted into an.** 
2be30 6f 72 64 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a 2a  ordinary join..*
2be40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2be50 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52  rImpliesNonNullR
2be60 6f 77 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ow(Expr *p, int 
2be70 69 54 61 62 29 7b 0a 20 20 57 61 6c 6b 65 72 20  iTab){.  Walker 
2be80 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
2be90 62 61 63 6b 20 3d 20 69 6d 70 6c 69 65 73 4e 6f  back = impliesNo
2bea0 74 4e 75 6c 6c 52 6f 77 3b 0a 20 20 77 2e 78 53  tNullRow;.  w.xS
2beb0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2bec0 30 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  0;.  w.xSelectCa
2bed0 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77  llback2 = 0;.  w
2bee0 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e  .eCode = 0;.  w.
2bef0 75 2e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20  u.iCur = iTab;. 
2bf00 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2bf10 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
2bf20 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
2bf30 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2bf40 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2bf50 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
2bf60 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77  ed by the tree w
2bf70 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64 65 74 65  alker.** to dete
2bf80 72 6d 69 6e 65 20 69 66 20 61 6e 20 65 78 70 72  rmine if an expr
2bf90 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 65 76  ession can be ev
2bfa0 61 6c 75 61 74 65 64 20 62 79 20 72 65 66 65 72  aluated by refer
2bfb0 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a 2a 20 69  ence to the.** i
2bfc0 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69 74 68 6f  ndex only, witho
2bfd0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 20  ut having to do 
2bfe0 61 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  a search for the
2bff0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
2c000 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 20  * table entry.  
2c010 54 68 65 20 49 64 78 43 6f 76 65 72 2e 70 49 64  The IdxCover.pId
2c020 78 20 66 69 65 6c 64 20 69 73 20 74 68 65 20 69  x field is the i
2c030 6e 64 65 78 2e 20 20 49 64 78 43 6f 76 65 72 2e  ndex.  IdxCover.
2c040 69 43 75 72 0a 2a 2a 20 69 73 20 74 68 65 20 63  iCur.** is the c
2c050 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
2c060 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49  ble..*/.struct I
2c070 64 78 43 6f 76 65 72 20 7b 0a 20 20 49 6e 64 65  dxCover {.  Inde
2c080 78 20 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20  x *pIdx;     /* 
2c090 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
2c0a0 74 65 73 74 65 64 20 66 6f 72 20 63 6f 76 65 72  tested for cover
2c0b0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  age */.  int iCu
2c0c0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  r;        /* Cur
2c0d0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
2c0e0 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
2c0f0 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
2c100 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  dex */.};../*.**
2c110 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2c120 20 74 68 65 72 65 20 61 72 65 20 72 65 66 65 72   there are refer
2c130 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2c140 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57   in table .** pW
2c150 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76  alker->u.pIdxCov
2c160 65 72 2d 3e 69 43 75 72 20 63 61 6e 20 62 65 20  er->iCur can be 
2c170 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
2c180 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 57 61  the index.** pWa
2c190 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2c1a0 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  r->pIdx..*/.stat
2c1b0 69 63 20 69 6e 74 20 65 78 70 72 49 64 78 43 6f  ic int exprIdxCo
2c1c0 76 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ver(Walker *pWal
2c1d0 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2c1e0 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ){.  if( pExpr->
2c1f0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
2c200 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
2c210 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  e==pWalker->u.pI
2c220 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 0a 20 20  dxCover->iCur.  
2c230 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d   && sqlite3Colum
2c240 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c 6b 65 72  nOfIndex(pWalker
2c250 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70  ->u.pIdxCover->p
2c260 49 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  Idx, pExpr->iCol
2c270 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20  umn)<0.  ){.    
2c280 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
2c290 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   1;.    return W
2c2a0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
2c2b0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2c2c0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  nue;.}../*.** De
2c2d0 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e  termine if an in
2c2e0 64 65 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c  dex pIdx on tabl
2c2f0 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43  e with cursor iC
2c300 75 72 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c  ur contains will
2c310 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
2c320 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 74 75 72  on pExpr.  Retur
2c330 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 6e  n true if the in
2c340 64 65 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74  dex does cover t
2c350 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2c360 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
2c370 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
2c380 6f 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 61  on references ta
2c390 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74  ble columns.** t
2c3a0 68 61 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e  hat are not foun
2c3b0 64 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70  d in the index p
2c3c0 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  Idx..**.** An in
2c3d0 64 65 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20  dex covering an 
2c3e0 65 78 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73  expression means
2c3f0 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
2c400 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65  sion can be.** e
2c410 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f  valuated using o
2c420 6e 6c 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e  nly the index an
2c430 64 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  d without having
2c440 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a   to lookup the.*
2c450 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
2c460 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a  table entry..*/.
2c470 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
2c480 6f 76 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20  overedByIndex(. 
2c490 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
2c4a0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
2c4b0 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a  x to be tested *
2c4c0 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
2c4d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2c4e0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
2c4f0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2c500 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e  ng table */.  In
2c510 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2c520 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
2c530 68 61 74 20 6d 69 67 68 74 20 62 65 20 75 73 65  hat might be use
2c540 64 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a  d for coverage *
2c550 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  /.){.  Walker w;
2c560 0a 20 20 73 74 72 75 63 74 20 49 64 78 43 6f 76  .  struct IdxCov
2c570 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65  er xcov;.  memse
2c580 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
2c590 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72  w));.  xcov.iCur
2c5a0 20 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e   = iCur;.  xcov.
2c5b0 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77  pIdx = pIdx;.  w
2c5c0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2c5d0 20 65 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20   exprIdxCover;. 
2c5e0 20 77 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d   w.u.pIdxCover =
2c5f0 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65   &xcov;.  sqlite
2c600 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
2c610 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21  xpr);.  return !
2c620 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  w.eCode;.}.../*.
2c630 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
2c640 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2c650 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
2c660 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61  d by the tree wa
2c670 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74  lker.** to count
2c680 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2c690 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  able columns in 
2c6a0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66  the arguments of
2c6b0 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74   an .** aggregat
2c6c0 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f  e function, in o
2c6d0 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
2c6e0 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  t the.** sqlite3
2c6f0 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28  FunctionThisSrc(
2c700 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
2c710 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a  ruct SrcCount {.
2c720 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2c730 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63     /* One partic
2c740 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ular FROM clause
2c750 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65   in a nested que
2c760 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69  ry */.  int nThi
2c770 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
2c780 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2c790 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70   to columns in p
2c7a0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  SrcList */.  int
2c7b0 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a   nOther;      /*
2c7c0 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
2c7d0 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
2c7e0 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63   in other FROM c
2c7f0 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lauses */.};../*
2c800 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
2c810 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2c820 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  es to columns..*
2c830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
2c840 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72  rSrcCount(Walker
2c850 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2c860 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68  *pExpr){.  /* Th
2c870 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65  e NEVER() on the
2c880 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20   second term is 
2c890 62 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 46  because sqlite3F
2c8a0 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
2c8b0 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77  rc().  ** is alw
2c8c0 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72  ays called befor
2c8d0 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
2c8e0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
2c8f0 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a   and so the.  **
2c900 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65   TK_COLUMNs have
2c910 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
2c920 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f  nverted into TK_
2c930 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a  AGG_COLUMN.  If.
2c940 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63    ** sqlite3Func
2c950 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
2c960 29 20 69 73 20 75 73 65 64 20 64 69 66 66 65 72  ) is used differ
2c970 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74  ently in the fut
2c980 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45  ure, the.  ** NE
2c990 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20  VER() will need 
2c9a0 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a  to be removed. *
2c9b0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
2c9c0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
2c9d0 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d  NEVER(pExpr->op=
2c9e0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
2c9f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2ca00 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
2ca10 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  t *p = pWalker->
2ca20 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20  u.pSrcCount;.   
2ca30 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
2ca40 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e   p->pSrc;.    in
2ca50 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20  t nSrc = pSrc ? 
2ca60 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a  pSrc->nSrc : 0;.
2ca70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2ca80 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
2ca90 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
2caa0 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  le==pSrc->a[i].i
2cab0 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
2cac0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
2cad0 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  nSrc ){.      p-
2cae0 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65  >nThis++;.    }e
2caf0 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  lse{.      p->nO
2cb00 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ther++;.    }.  
2cb10 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2cb20 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2cb30 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
2cb40 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ny of the argume
2cb50 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72  nts to the pExpr
2cb60 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65   Function refere
2cb70 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e  nce.** pSrcList.
2cb80 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
2cb90 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20   they do.  Also 
2cba0 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  return true if t
2cbb0 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  he function.** h
2cbc0 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  as no arguments 
2cbd0 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73  or has only cons
2cbe0 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
2cbf0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
2cc00 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65   pExpr.** refere
2cc10 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74  nces columns but
2cc20 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   not columns of 
2cc30 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20  tables found in 
2cc40 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74  pSrcList..*/.int
2cc50 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2cc60 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72  UsesThisSrc(Expr
2cc70 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74   *pExpr, SrcList
2cc80 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57   *pSrcList){.  W
2cc90 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
2cca0 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a  t SrcCount cnt;.
2ccb0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
2ccc0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
2ccd0 54 49 4f 4e 20 29 3b 0a 20 20 77 2e 78 45 78 70  TION );.  w.xExp
2cce0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
2ccf0 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 78 53  SrcCount;.  w.xS
2cd00 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2cd10 30 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75  0;.  w.u.pSrcCou
2cd20 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74  nt = &cnt;.  cnt
2cd30 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74  .pSrc = pSrcList
2cd40 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20  ;.  cnt.nThis = 
2cd50 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20  0;.  cnt.nOther 
2cd60 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  = 0;.  sqlite3Wa
2cd70 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70  lkExprList(&w, p
2cd80 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
2cd90 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68    return cnt.nTh
2cda0 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68  is>0 || cnt.nOth
2cdb0 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  er==0;.}../*.** 
2cdc0 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
2cdd0 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
2cde0 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
2cdf0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
2ce00 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
2ce10 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
2ce20 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2ce30 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
2ce40 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2ce50 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
2ce60 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  umn(sqlite3 *db,
2ce70 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
2ce80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
2ce90 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74  fo->aCol = sqlit
2cea0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
2ceb0 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  .       db,.    
2cec0 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a     pInfo->aCol,.
2ced0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
2cee0 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20  nfo->aCol[0]),. 
2cef0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
2cf00 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69  olumn,.       &i
2cf10 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
2cf20 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
2cf30 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
2cf40 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
2cf50 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
2cf60 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
2cf70 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
2cf80 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
2cf90 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
2cfa0 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
2cfb0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2cfc0 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
2cfd0 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
2cfe0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
2cff0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
2d000 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
2d010 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
2d020 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
2d030 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
2d040 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
2d050 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
2d060 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
2d070 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69  nFunc,.       &i
2d080 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
2d090 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
2d0a0 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72  his is the xExpr
2d0b0 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74  Callback for a t
2d0c0 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20  ree walker.  It 
2d0d0 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d  is used to.** im
2d0e0 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45  plement sqlite3E
2d0f0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2d100 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
2d110 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2d120 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
2d130 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2d140 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
2d150 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
2d160 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a  gregate(Walker *
2d170 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2d180 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
2d190 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
2d1a0 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
2d1b0 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
2d1c0 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
2d1d0 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
2d1e0 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
2d1f0 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
2d200 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
2d210 4e 43 2d 3e 75 4e 43 2e 70 41 67 67 49 6e 66 6f  NC->uNC.pAggInfo
2d220 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  ;..  assert( pNC
2d230 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 55  ->ncFlags & NC_U
2d240 41 67 67 49 6e 66 6f 20 29 3b 0a 20 20 73 77 69  AggInfo );.  swi
2d250 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
2d260 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
2d270 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
2d280 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
2d290 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d2a0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2d2b0 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
2d2c0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2d2d0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
2d2e0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   );.      /* Che
2d2f0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2d300 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
2d310 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
2d320 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
2d330 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
2d340 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
2d350 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
2d360 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21  ALWAYS(pSrcList!
2d370 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
2d380 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2d390 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
2d3a0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
2d3b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
2d3c0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
2d3d0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2d3e0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2d3f0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
2d400 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2d410 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2d420 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
2d430 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
2d440 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
2d450 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
2d460 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
2d470 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d480 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
2d490 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
2d4a0 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
2d4b0 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
2d4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2d4d0 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
2d4e0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
2d4f0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
2d500 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
2d510 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
2d520 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
2d530 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
2d540 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
2d550 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
2d560 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
2d570 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
2d580 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
2d590 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2d5a0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
2d5b0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
2d5c0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
2d5d0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2d5e0 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
2d5f0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
2d600 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
2d610 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2d620 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
2d630 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
2d640 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2d650 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2d660 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2d670 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2d680 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2d690 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2d6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2d6b0 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
2d6c0 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
2d6d0 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
2d6e0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
2d6f0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
2d700 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
2d710 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2d720 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
2d730 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
2d740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2d750 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
2d760 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20  r->y.pTab;.     
2d770 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2d780 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
2d790 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
2d7a0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
2d7b0 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
2d7c0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
2d7d0 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
2d7e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2d800 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2d810 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
2d820 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
2d830 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
2d840 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
2d850 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
2d860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2d870 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
2d880 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
2d890 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
2d8a0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
2d8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d8c0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2d8d0 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
2d8e0 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
2d8f0 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
2d900 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
2d910 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2d920 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
2d930 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2d940 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2d950 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
2d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d970 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2d980 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
2d990 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
2d9a0 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
2d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
2d9c0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
2d9d0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
2d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9f0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2da00 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
2da10 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2da20 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2da30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2da40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2da50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2da60 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2da70 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
2da80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2da90 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
2daa0 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
2dab0 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
2dac0 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
2dad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2dae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2daf0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
2db00 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
2db10 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
2db20 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
2db30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
2db40 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
2db50 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
2db60 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
2db70 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
2db80 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
2db90 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
2dba0 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
2dbb0 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
2dbc0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
2dbd0 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
2dbe0 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
2dbf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2dc00 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
2dc10 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2dc20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2dc30 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2dc40 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
2dc50 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
2dc60 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
2dc70 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
2dc80 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2dc90 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
2dca0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2dcb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
2dcc0 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
2dcd0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
2dce0 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
2dcf0 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
2dd00 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
2dd10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2dd20 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2dd30 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
2dd40 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
2dd50 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
2dd60 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
2dd70 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
2dd80 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
2dd90 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
2dda0 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
2ddb0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2ddc0 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
2ddd0 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
2dde0 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
2ddf0 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
2de00 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
2de10 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2de20 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
2de30 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
2de40 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2de50 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
2de60 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
2de70 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
2de80 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2de90 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
2dea0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2deb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2dec0 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65  rCompare(0, pIte
2ded0 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
2dee0 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
2def0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2df00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2df10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2df20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
2df30 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
2df40 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
2df50 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
2df60 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
2df70 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
2df80 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2df90 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
2dfa0 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
2dfb0 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
2dfc0 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
2dfd0 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
2dfe0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2dff0 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
2e000 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2e010 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
2e020 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2e030 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2e040 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
2e050 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
2e060 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2e070 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
2e080 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2e090 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
2e0a0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2e0b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2e0c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2e0d0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
2e0e0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2e0f0 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
2e100 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
2e110 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
2e120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e130 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
2e140 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ken, .          
2e150 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2e160 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  x.pList ? pExpr-
2e170 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
2e180 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
2e190 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2e1a0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
2e1b0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2e1c0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
2e1d0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
2e1e0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2e1f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
2e210 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
2e220 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
2e230 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2e240 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e250 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
2e260 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
2e270 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
2e280 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
2e290 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e2a0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2e2b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2e2c0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
2e2d0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2e2e0 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
2e2f0 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
2e300 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2e310 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
2e320 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20  gg = (i16)i;.   
2e330 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
2e340 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
2e350 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2e360 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
2e370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e380 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2e390 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2e3a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2e3b0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2e3c0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
2e3d0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2e3e0 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
2e3f0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
2e400 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44  elect){.  UNUSED
2e410 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65  _PARAMETER(pSele
2e420 63 74 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e  ct);.  pWalker->
2e430 77 61 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20  walkerDepth++;. 
2e440 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2e450 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76  inue;.}.static v
2e460 6f 69 64 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  oid analyzeAggre
2e470 67 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64  gatesInSelectEnd
2e480 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2e490 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2e4a0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2e4b0 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
2e4c0 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  .  pWalker->walk
2e4d0 65 72 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a  erDepth--;.}../*
2e4e0 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
2e4f0 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
2e500 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
2e510 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
2e520 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
2e530 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
2e540 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41  to be added to A
2e550 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  ggInfo object th
2e560 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f  at pNC->pAggInfo
2e570 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  .** points to.  
2e580 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  Additional entri
2e590 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74  es are made on t
2e5a0 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  he AggInfo objec
2e5b0 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72  t as.** necessar
2e5c0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2e5d0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2e5e0 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
2e5f0 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
2e600 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
2e610 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
2e620 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
2e630 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
2e640 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2e650 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
2e660 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
2e670 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
2e680 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
2e690 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
2e6a0 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
2e6b0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2e6c0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2e6d0 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
2e6e0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2e6f0 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2e700 61 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b  atesInSelectEnd;
2e710 0a 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68  .  w.walkerDepth
2e720 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20   = 0;.  w.u.pNC 
2e730 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28  = pNC;.  assert(
2e740 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
2e750 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  0 );.  sqlite3Wa
2e760 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
2e770 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
2e780 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2e790 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
2e7a0 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
2e7b0 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
2e7c0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
2e7d0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2e7e0 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
2e7f0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
2e800 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
2e810 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
2e820 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
2e830 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2e840 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
2e850 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
2e860 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
2e870 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2e880 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
2e890 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
2e8a0 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
2e8b0 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
2e8c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
2e8d0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2e8e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2e8f0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2e900 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
2e910 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
2e920 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2e930 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67  a single new reg
2e940 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f  ister for use to
2e950 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72   hold some inter
2e960 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a  mediate result..
2e970 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
2e980 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  tTempReg(Parse *
2e990 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
2e9a0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d  Parse->nTempReg=
2e9b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2e9c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2e9d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
2e9e0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d  arse->aTempReg[-
2e9f0 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  -pParse->nTempRe
2ea00 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61  g];.}../*.** Dea
2ea10 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74  llocate a regist
2ea20 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c  er, making avail
2ea30 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66  able for reuse f
2ea40 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  or some other.**
2ea50 20 70 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69   purpose..*/.voi
2ea60 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2ea70 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
2ea80 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
2ea90 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
2eaa0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2eab0 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
2eac0 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
2ead0 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
2eae0 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
2eaf0 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
2eb00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
2eb10 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
2eb20 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
2eb30 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
2eb40 20 72 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69   registers..*/.i
2eb50 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
2eb60 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
2eb70 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
2eb80 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
2eb90 66 28 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74  f( nReg==1 ) ret
2eba0 75 72 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65  urn sqlite3GetTe
2ebb0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2ebc0 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61   i = pParse->iRa
2ebd0 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50  ngeReg;.  n = pP
2ebe0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b  arse->nRangeReg;
2ebf0 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29  .  if( nReg<=n )
2ec00 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  {.    pParse->iR
2ec10 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b  angeReg += nReg;
2ec20 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
2ec30 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a  ngeReg -= nReg;.
2ec40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d    }else{.    i =
2ec50 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
2ec60 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
2ec70 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20  m += nReg;.  }. 
2ec80 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69   return i;.}.voi
2ec90 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
2eca0 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
2ecb0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
2ecc0 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
2ecd0 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
2ece0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2ecf0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2ed00 20 69 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75   iReg);.    retu
2ed10 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  rn;.  }.  if( nR
2ed20 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
2ed30 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
2ed40 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
2ed50 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
2ed60 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
2ed70 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
2ed80 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
2ed90 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
2eda0 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
2edb0 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  le for reuse..*/
2edc0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65  .void sqlite3Cle
2edd0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50  arTempRegCache(P
2ede0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
2edf0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
2ee00 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
2ee10 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
2ee20 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74  }../*.** Validat
2ee30 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72  e that no tempor
2ee40 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c  ary register fal
2ee50 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  ls within the ra
2ee60 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74  nge of.** iFirst
2ee70 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69  ..iLast, inclusi
2ee80 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ve.  This routin
2ee90 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66  e is only call f
2eea0 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72  rom within asser
2eeb0 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
2eec0 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
2eed0 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71  ITE_DEBUG.int sq
2eee0 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61  lite3NoTempsInRa
2eef0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2ef00 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69  e, int iFirst, i
2ef10 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74  nt iLast){.  int
2ef20 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   i;.  if( pParse
2ef30 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20  ->nRangeReg>0.  
2ef40 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e   && pParse->iRan
2ef50 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52  geReg+pParse->nR
2ef60 61 6e 67 65 52 65 67 20 3e 20 69 46 69 72 73 74  angeReg > iFirst
2ef70 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
2ef80 52 61 6e 67 65 52 65 67 20 3c 3d 20 69 4c 61 73  RangeReg <= iLas
2ef90 74 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75  t.  ){.     retu
2efa0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
2efb0 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
2efc0 54 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20  TempReg; i++){. 
2efd0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
2efe0 54 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72  TempReg[i]>=iFir
2eff0 73 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54  st && pParse->aT
2f000 65 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74  empReg[i]<=iLast
2f010 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2f020 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2f030 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2f040 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
2f050 55 47 20 2a 2f 0a                                UG */.